时间:2021-07-01 10:21:17 帮助过:8人阅读
SQL注入是怎么产生的?
WEB开发人员无法保证所有的输入都已经过滤
攻击者利用发送给SQL服务器的输入参数构造可执行的SQL代码(可加入到get请求、post请求、http头信息、cookie中)
数据库未做相应的安全配置
SQL注入可以分为平台层注入和代码注入。前者是由不安全的数据库配置或平台漏洞所致。或者是程序员对输入未进行细致过滤产生
如何进行SQL注入?
在url上添加参数请求查询:http://index.com/?id=1
以上是通过url查询id为1的数据,但如果我们在后面传参这样写:http://index.com/?id=1‘ or 1=1
那么执行的查询语句就是where xx=‘1‘ or 1=1,这样查询的就是全部的数据,所以这就存在SQL注入的问题
第一种:‘#‘:‘#‘后所有的字符串都会被当成注释来处理
登录时的免密登录在传参的时候将注释符号#传入,注释后面密码的查询和验证,这样就可以只通过用户名免密登录
用户名:‘ or 1=1# 密码:111111
这样查询语句执行的就是:where username=‘‘ or 1=1# and password=‘111111‘,直接注释掉密码的验证
第二种:‘-- ‘ (--后面有个空格):‘-- ‘后面的字符串都会被当成注释来处理
用户名输入:user‘-- (注意--后面有个空格,单引号闭合user左边的单引号),密码随意输入,如:111,然后点击提交按钮。
等价于SQL语句SELECT * FROM user WHERE username = ‘user‘-- ‘AND password = ‘111‘,‘-- ‘后面都被注释掉了,相当于SELECT * FROM user WHERE username = ‘user‘
传入的参数为 or 1=(drop xx from xx)等,可以对数据表进行删除操作,所以sql注入的安全性问题很重要,sql注入是在保证查询where语句恒真的情况下可以对数据表做任意操作
而为何一些表单提交和输入文本框中的请求可以sql注入呢,就是后端没有对用户输入的数据进行过滤验证。所以判断是否可以进行sql注入是我们即将进行sql注入攻击的第二步。
第一步是确定我们要进行sql注入的地方。
第二步尝试性地输入一个使wehre查询语句恒真的语句,通过返回的错误的提示可以知道该输入域是否对输入的字符串进行过滤
第三步可以通过猜测表名,列名等方法可以测试
如何预防SQL注入?
对于整数参数,加判断条件:不能为空、参数类型必须为数字
对于字符串参数,可以使用正则表达式进行过滤:如:必须为[0-9a-zA-Z]范围内的字符串
在username这个变量前进行转义,对‘、"、\等特殊字符进行转义,如:php中的addslashes()函数对username参数进行转义
把sql语句的模板(变量采用占位符进行占位)发送给mysql服务器,mysql服务器对sql语句的模板进行编译,编译之后根据语句的优化分析对相应的索引进行优化,在最终绑定参数时把相应的参数传送给mysql服务器,直接进行执行,节省了sql查询时间,以及mysql服务器的资源,达到一次编译、多次执行的目的,除此之外,还可以防止SQL注入。具体是怎样防止SQL注入的呢?实际上当将绑定的参数传到mysql服务器,mysql服务器对参数进行编译,即填充到相应的占位符的过程中,做了转义操作。
SQL注入
标签:一个 单引号 备份数据库 字符串 http 数据库名 name 引号 bsp