理解SQL注入

SQL注入是常见的一种网络数据安全攻击手段,顾名思义就是在前端发出请求到后台数据查询这个过程中注入指定类型的参数将SQL语句修改从而达到绕过数据验证或窃取数据的目的。

以常见的网站登录过程为例,登录时一般要求输入用户名密码,然后提交到后台处理。

在有些网站,设计者会直接将表单提交的内容拼装成SQL查询语句,直接查询数据库是否存在相应用户来返回给前端认证结果。

假如如下的用户信息表:

字段    说明
username用户名
password密码
type类型,0表示普通用户,1表示VIP用户

前端进行登录时输入用户名和密码,页面直接将用户的输入拼装成SQL查询语句进行查询。如输入用户名:conan,密码:123

页面会形成类似:select * from users where username = 'conan' and password = '123'的查询语句提交给后端,如果查询存在就返回认证成功,否则就认证失败。

整个流程正常看下来似乎没问题,但假如前端页面在不进行用户输入合法性校验的情况下就会出现问题,如用户输入用户名:'or 1>0 # 密码随意输如123,那么提交给后台的查询语句将会是:

    select * from users where username  = ' 'or 1>0 # and password = '123'

sql语句语法规定了#之后的为注释部分,会自动忽略,那么上述查询语句就等价于:

    select * from users where username  = ' 'or 1>0

上述语句涉及两个条件,第一个条件时username为空,第二个条件是1>0,两个条件是or的关系,因此因为1>0成立,所以上述查询语句就等价于:

    select * from users

对于按照查询结果为空判断是否认证成功的系统,上述语句显然返回不会空。而对于直接将查询结果返回的系统,上述查询将会得到所有用户数据。

以上就是典型的SQL注入式攻击的场景。从上面的例子中可以看出,想要预防SQL注入攻击需要注意的是:

    1.对用户输入信息的合法性进行校验,而不是允许用户输入的任意内容提交给后台。

    2.避免使用动态拼装SQL语句,改用参数传递的方式使用存储过程进行查询。

    3.数据库权限控制,尽量避免使用超级用户进行数据库的查询操作。

展开阅读全文

没有更多推荐了,返回首页