假设这是服务器上使用的唯一缓解措施:
Dim IDPerson
IDPerson = Request.Querystring("id")
If IsNumeric(IDPerson) = True Then
IDPerson = IDPerson
Else
IDPerson = 0
End If
然后使用 IDPerson 编写查询。“id”是 GET 变量。
我知道 IsNumeric 将接受 Hex 作为数字。
可以用十六进制构造整个查询并传递 IsNumeric 函数吗?
假设这是服务器上使用的唯一缓解措施:
Dim IDPerson
IDPerson = Request.Querystring("id")
If IsNumeric(IDPerson) = True Then
IDPerson = IDPerson
Else
IDPerson = 0
End If
然后使用 IDPerson 编写查询。“id”是 GET 变量。
我知道 IsNumeric 将接受 Hex 作为数字。
可以用十六进制构造整个查询并传递 IsNumeric 函数吗?
我会说这取决于您稍后对 ID 变量所做的操作。如果您的代码稍后将十六进制转换为字符串,然后用它构建查询,那么答案将变为“是”
例子:
我建立了一个电子商务网站,该网站根据您的客户 ID 查找您的购买历史......作为一个菜鸟,我想出了一个聪明的想法,即使用您的电子邮件地址通过简单地将其转换为十六进制来生成您的 ID。
customer@example.com这看起来像是一个“非常安全”且唯一的 ID,所以我对我所做的事情感觉非常好。
现在注入:
有人发现用户 ID 只是电子邮件地址的十六进制等效值,并猜测我可能会将其转换回文本并使用该结果进行查询
http://mysite.com/orderhistory?userid=637573746f6d6572406578616d706c652e636f6d
注入 ID = 31272064726f70207461626c652075736572733b202d2d
ascii 等效 =1' drop table users; --
如果我,开发人员,检查以确保 ID 是数字...然后十六进制到文本 ID...然后在查询中使用它...我刚刚允许 sql 注入
参考:
这是关于仅使用字母数字字符的 SQL 注入的类似问题:https ://stackoverflow.com/questions/8086906/keeping-clear-of-sql-injections
这是另一个讨论通过十六进制注入 sql 的线程: http ://arstechnica.com/civis/viewtopic.php?f=20&t=107657
...当然,正确的解决方案是使用“真正的”预防机制,例如参数化查询,但这肯定是一个有趣的问题。