Web安全之SQL注入

来源:互联网 发布:网络release是什么意思 编辑:程序博客网 时间:2024/05/16 19:17

什么是SQL注入?

sql注入是一种将sql代码添加到输入参数中,传递到sql服务器解析并执行的一种攻击手法



SQL是怎么产生的?

  • WEB开发人员无法保证所有的输入都已经过滤
  • 攻击者利用发送给SQL服务器的输入数据构造可执行的SQL代码
  • 数据库未做相应安全配置


如何寻找SQL注入漏洞?

  • 识别Web应用中所有的输入点
输入主要包含三部分内容:get请求,post请求,http的头信息(User-Agent、Referer以及IP和Cookie信息)
  • 了解哪些类型的请求会触发异常
如果是get请求可以在地址输入栏添加特殊符号引起异常
若是post请求的话也差不多,可以在输入的内容中添加特殊符号引起异常
  • 检测服务器响应中的异常



如何进行SQL注入攻击?
  • 数字注入
比如地址栏有这么一条语句:..............?id=1
这是一条get请求方式的查询语句
如果我想获得所有数据就可以将参数改为:?id=-1 OR 1=1


  • 字符串注入
比如有一个简单的登录界面,输入用户名和密码,点击登录。
通过字符串注入能我让不用输入密码,就能登入
用户名栏中输入 :       xiaoming'#
密码栏不用输入或随便输入就能登入

什么原因呢?
假设用户名是xiaoming,后又跟上单引号" ' "和"#",单引号的使用是为了闭合前面的语句,而使用#注释了后面的密码验证的sql
所以仅仅通过用户名就通过了sql验证

例句:SELECT * FROM  user WHERE name='xiaoming'#' AND password='dfiwegfisdhfisdhfsdfsdf'
#前面的单引号闭合了xiaoming前面的单引号
因为#的存在,这条sql就相当于  SELECT * FROM  user WHERE name='xiaoming'


除了用#注释,还有 "-- "(两条横杠加一个空格)也可以注释





如何预防SQL注入?

  • 严格检查输入变量的类型和格式
主要是通过在后台利用正则表达式匹配的方式检查输入的格式类型
  • 过滤和转义特殊字符
  • 利用Mysql预编译机制
我们平常应该都用过Mysql预编译机制,预编译机制就是预先构建一个sql模板:SELECT * FROM user WHERE name=? AND pass=?,这样采用"?占位符"的形式构建的sql语句就是sql模板,预编译机制会把sql模板发给mysql服务器,mysql服务器会对模板进行编译,编译之后进行优化分析,对相应的索引进行优化,你在绑定参数之后,参数会传递给mysql服务器直接执行,节省了查询时间和mysql服务器的一些资源,达到一次编译多次执行的目的。除了这个目的还有一个功能就是防止SQL注入:当你把绑定的参数传递给mysql服务器,服务器将参数填充到占位符的过程中,实际上还做了转义操作,这样就防止了SQL注入