如果从SQL查询中删除所有'字符,还有其他方法对数据库进行SQL注入攻击吗?
怎么做到呢?谁能举个例子?
就在这里.来自维基百科的摘录
"SELECT * FROM data WHERE id = " + a_variable + ";"
从该陈述中可以清楚地看出,作者希望a_variable是与"id"字段相关的数字.但是,如果它实际上是一个字符串,那么最终用户可以按照他们的选择操纵该语句,从而绕过对转义字符的需要.例如,将a_variable设置为
1;DROP TABLE users
将从数据库中删除(删除)"users"表,因为SQL将呈现如下:
SELECT * FROM DATA WHERE id=1;DROP TABLE users;
SQL注入并不是一种简单的攻击方式.如果我是你,我会做非常仔细的研究.
是的,取决于您使用的声明.您最好通过使用存储过程或至少参数化查询来保护自己.
有关预防样本,请参阅WikiPedia.
是的,这是绝对可能的.
如果你有一个表单,你希望一个整数来做你的下一个SELECT语句,那么你可以输入类似的东西:
SELECT*FROM thingy
WHERE attributeID =
5(答案很好,没问题)
5; DROP表users
; (坏,坏,坏......)
以下网站详细介绍了经典的SQL注入技术:SQL注入备忘单.
使用参数化查询或存储过程并不是更好.这些只是使用传递参数的预制查询,也可以是注入源.本页还对此进行了描述:在SQL中攻击存储过程.
现在,如果你压制简单的引用,你只能防止一组特定的攻击.但不是全部.
与往常一样,不要相信来自外部的数据.在以下3个级别过滤它们:
显而易见的东西的接口级别(下拉选择列表优于自由文本字段)
与数据性质(int,字符串,长度),权限相关的检查的逻辑级别(此用户可以在此页面使用此类数据)...
数据库访问级别(转义简单引用...).
玩得开心,别忘了查看WikiPedia的答案.
/维伊
我建议你将变量作为参数传递,而不是构建自己的SQL.否则,总会以一种方式进行SQL注入,这是我们目前不知道的方式.
您创建的代码是这样的:
' Not Tested var sql = "SELECT * FROM data WHERE id = @id"; var cmd = new SqlCommand(sql, myConnection); cmd.Parameters.AddWithValue("@id", request.getParameter("id"));
如果你有一个像我这样的名字.所有'-characters被删除或标记为无效是非常烦人的.
您还可以查看有关SQL注入的Stackoverflow问题.