English
 电子信箱
 加入收藏

  威盾防火墙 >> 新闻中心 >> 威盾新闻 >> 如何防范SQL注入——测试篇

 

如何防范SQL注入——测试篇

威盾防火墙 2015-01-28

 

下面我们看一下标准的SQL注入测试是怎样的。

  我们以下面的SQL查询为例:

  SELECT * FROM Users WHERE Username='$username' AND Password='$password'

  如果我们在页面上输入以下的用户名和密码:

  $username = 1' or '1' = '1
  $password = 1' or '1' = '1
  那么整个查询语句就变为:
  SELECT * FROM Users WHERE Username='1' OR '1' = '1' AND Password='1' OR '1' = '1'

  假设参数值是通过GET方法传递到服务器的,且域名为www.example.com,那么我们的访问请求就是:

  http://www.example.com/index.php?username=1'%20or%20'1'%20=%20'1&password=1'%20or%20'1'%20=%20'1

  对上面的SQL语句作简单分析后我们就知道由于该语句永远为真,所以肯定会返回一些数据,在这种情况下实际上并未验证用户名和密码,并且在某些系统中,用户表的第一行记录是管理员,那这样造成的后果则更为严重。

  另外一个查询的例子如下:

  SELECT * FROM Users WHERE ((Username='$username') AND (Password=MD5('$password')))

  在这个例子中,存在两个问题,一个是括号的用法,还有一个是MD5哈希函数的用法。对于第一个问题,我们可以很容易找到缺失的右括号解决,对于第二个问题,我们可以想办法使第二个条件失效。我们在查询语句的最后加上一个注释符以表示后面的都是注释,常见的注释起始符是/*(在Oracle中是--),也就是说,我们用如下的用户名和密码:

  $username = 1' or '1' = '1'))/*
  $password = foo

  那么整条SQL语句就变为:

  SELECT * FROM Users WHERE ((Username='1' or '1' = '1'))/*') AND (Password=MD5('$password')))

  我们的URL请求就变为:

  http://www.example.com/index.php?username=1'%20or%20'1'%20=%20'1'))/*&password=foo


相关内容: 最新内容:
教您如何修改sql server时间[2015-01-28]
SQL Server定时作业的设置方法[2015-01-28]
SQL SERVER恢复的方法[2015-01-28]
SQL SERVER临时表的语法[2015-01-28]
SqlServer唯一约束的删除方法[2015-01-28]
sqlserver sa用户密码问题集锦[2015-01-28]
教您如何修改sql server时间[2015-01-28]
SQL Server定时作业的设置方法[2015-01-28]
SQL SERVER恢复的方法[2015-01-28]
SQL SERVER临时表的语法[2015-01-28]
SqlServer唯一约束的删除方法[2015-01-28]
sqlserver sa用户密码问题集锦[2015-01-28]