安全测试|常见SQL注入攻击方式、实例及预防

📅 2026/7/21 7:12:22
安全测试|常见SQL注入攻击方式、实例及预防
SQL注入是一种将SQL代码添加到输入参数中传递到服务器解析并执行的一种攻击手法。SQL注入攻击是输入参数未经过滤然后直接拼接到SQL语句当中解析执行达到预想之外的一种行为称之为SQL注入攻击。SQL注入是怎么产生的WEB开发人员无法保证所有的输入都已经过滤攻击者利用发送给SQL服务器的输入参数构造可执行的SQL代码可加入到get请求、post请求、http头信息、cookie中数据库未做相应的安全配置SQL注入攻击实例以php编程语言、mysql数据库为例介绍一下SQL注入攻击的构造技巧、构造方法1、数字注入在浏览器地址栏输入learn.me/sql/article.php?id1这是一个get型接口发送这个请求相当于调用一个查询语句s q l S E L E C T ∗ F R O M a r t i c l e W H E R E i d , sql SELECT * FROM article WHERE id , sqlSELECT∗FROMarticleWHEREid,id正常情况下应该返回一个id1的文章信息。那么如果在浏览器地址栏输入learn.me/sql/article.php?id-1 OR 1 1这就是一个SQL注入攻击了可能会返回所有文章的相关信息。为什么会这样呢这是因为id -1永远是false11永远是true所有整个where语句永远是ture所以where条件相当于没有加where条件那么查询的结果相当于整张表的内容。2、字符串注入有这样一个用户登录场景登录界面包括用户名和密码输入框以及提交按钮。输入用户名和密码提交。这是一个post请求登录时调用接口learn.me/sql/login.html首先连接数据库然后后台对post请求参数中携带的用户名、密码进行参数校验即sql的查询过程。假设正确的用户名和密码为user和pwd123输入正确的用户名和密码、提交相当于调用了以下的SQL语句SELECT * FROM user WHERE username ‘user’ ADN password ‘pwd123’由于用户名和密码都是字符串SQL注入方法即把参数携带的数据变成mysql中注释的字符串。mysql中有2种注释的方法1‘#’#后所有的字符串都会被当成注释来处理用户名输入user’#单引号闭合user左边的单引号密码随意输入如111然后点击提交按钮。等价于SQL语句SELECT * FROM user WHERE username ‘user’#ADN password ‘111’#后面都被注释掉了相当于SELECT * FROM user WHERE username ‘user’2‘-- ’ –后面有个空格’-- 后面的字符串都会被当成注释来处理用户名输入user’-- 注意–后面有个空格单引号闭合user左边的单引号密码随意输入如111然后点击提交按钮。等价于SQL语句SELECT * FROM user WHERE username ‘user’-- AND password ‘111’SELECT * FROM user WHERE username ‘user’-- AND password ‘1111’-- 后面都被注释掉了相当于SELECT * FROM user WHERE username ‘user’因此以上两种情况可能输入一个错误的密码或者不输入密码就可登录用户名为’user’的账号这是十分危险的事情。如何预防SQL注入这是开发人员应该思考的问题作为测试人员了解如何预防SQL注入可以在发现注入攻击bug时对bug产生原因进行定位。1严格检查输入变量的类型和格式对于整数参数加判断条件不能为空、参数类型必须为数字对于字符串参数可以使用正则表达式进行过滤如必须为[0-9a-zA-Z]范围内的字符串。2过滤和转义特殊字符在username这个变量前进行转义对’、、\等特殊字符进行转义如php中的addslashes()函数对username参数进行转义。3利用mysql的预编译机制把sql语句的模板变量采用占位符进行占位发送给mysql服务器mysql服务器对sql语句的模板进行编译编译之后根据语句的优化分析对相应的索引进行优化在最终绑定参数时把相应的参数传送给mysql服务器直接进行执行节省了sql查询时间以及mysql服务器的资源达到一次编译、多次执行的目的除此之外还可以防止SQL注入。具体是怎样防止SQL注入的呢实际上当将绑定的参数传到mysql服务器mysql服务器对参数进行编译即填充到相应的占位符的过程中做了转义操作。