昨天我收到一封电子邮件,说我们的网站容易受到SQL注入攻击。电子邮件说:
我尝试了一些经典的SQL注入 你的服务器。此URL包含 结果:
请注意,在上述网址中,我没有公开我的实际域名并将其替换为mysite.com。
任何人都可以解释上述网址的含义,因为我的网站容易受到这类网址的攻击,也可能是您的网站。
如何解码该网址,那里发生了什么?
答案 0 :(得分:8)
问题是您将查询字符串上的SQL命令连接到SQL命令中。
大概你的代码说的是
"select * from preview where ID=" + Request.QueryString["id"]
使用该QueryString后,它变为
select * from preview where ID=611111161 and 1=0
UNION ALL
SELECT 1,2,3,4,password,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,user=id,70,71
FROM admin
EG:他让您的管理员帐户登录显示在预览页面上。
您应该始终确保SQL转义从用户获得的任何输入,或者甚至更好地使用参数化查询,服务器将负责这一点。在不知道SQL服务器的语言或类型的情况下,我无法真正指出您需要执行哪些代码的方向。
答案 1 :(得分:1)
你可能有类似的代码(我不知道php语法):
string sql = "select * from mytable where customerid = " + Request.QueryString("id");
现在,既然邮寄给你的人在页面的查询字符串中添加的内容不仅仅是id,那么你的sql语句就像是:
select * from mytable where customerid = 6111111661 and union all the tables that you don't want.
始终在查询中使用参数并检查用户输入! 尽可能避免动态sql。
答案 2 :(得分:0)
将代码更改为这样。
$id = $_GET['id'];
$user = mysql_real_escape_string($_GET['user']);
if( is_numeric($id) )
{
mysql_query($query);
}
现在您的代码不会接受无效的用户ID,只要您使用我概述的方法清理所有字符串,就不会出现SQL注入问题。