插件窝 干货文章 mysql如何防止SQL注入攻击

mysql如何防止SQL注入攻击

mysql 注入攻击 426    来源:插件窝    2021-04-14

所谓SQL注入,就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。


具体来说,它是利用现有应有程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在web


表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。


SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。


SQL注入攻击的总体思路


1.寻找到SQL注入的位置


2.判断服务器类型和后台数据库类型


3.针对不同的服务器和数据库特点进行SQL注入攻击


SQL注入攻击实例


比如在一个登录界面,要求输入用户名和密码:


  可以这样输入实现免帐号登录:


  用户名: ‘or 1 = 1 –-


  密 码:


  点登陆,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了.(当然现在的有些语言的数据库API已经处理了这些问题)


  这是为什么呢? 下面我们分析一下:


  从理论上说,后台认证程序中会有如下的SQL语句:


String sql = "select * from user_table where username=
  ' "+userName+" ' and password=' "+password+" '";
  当输入了上面的用户名和密码,上面的SQL语句变成:
  SELECT * FROM user_table WHERE username=
  '’or 1 = 1 -- and password='’

  分析SQL语句:


  条件后面username=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功;


  然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。


  这还是比较温柔的,如果是执行


  SELECT * FROM user_table WHERE
  username='' ;DROP DATABASE (DB Name) --' and password=''


  ….其后果可想而知…

应对方法


1、参数化SQL:在设计与数据库连接并访问数据时,在需要填入数值或者数据的地方,使用参数(Parameter)来给值,用@来表示参数。在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有恶意的指令,由于已经编译完成,就不会被数据库所运行,因此,可从一定程度上避免SQL注入。


2、字符串过滤 


3、使用正则表达式过滤传入的参数


4、前端js防范SQL注入


5、在数据库中限制用户权限,drop/create/truncate等权限谨慎grant


6、多使用数据库自带的安全参数。如在SQLServer数据库中提供了Parameter这个集合,这个集合提供类型检查和长度验证的功能。如果管理员采用了 Parameter这个集合的话,则用户输入的内容将被视为字符值而不是可执行代码。即使用户输入的内容中含有可执行代码,则数据库也会过滤掉。因为此时数据库只把它当作普通的字符来处理。


7、多层环境如何防治SQL注入式攻击?(实现多层验证,需要多层一起努力,在哭护短与数据库端都要采用相应的措施来防治SQL语句的注入式攻击)


8、必要情况下使用专业的漏洞扫描工具来寻找可能被攻击的点