【发布时间】:2011-07-20 08:31:45
【问题描述】:
我想知道除了使用参数化查询和验证数据之外,是否还有其他针对 SQL 注入的措施。 谢谢!
【问题讨论】:
-
一个接受的答案以及我的Best way to stop SQL Injection in PHP 的重要补充涵盖了所有内容。
标签: sql-injection parameterized
我想知道除了使用参数化查询和验证数据之外,是否还有其他针对 SQL 注入的措施。 谢谢!
【问题讨论】:
标签: sql-injection parameterized
除了您可能在客户端执行的任何操作之外,还要确保您在服务器端验证数据。
此外,如果您使用的是网络,请确保您正在验证所有数据,即 QueryString 和 Cookie 值以及表单字段。
我知道这是 Google 上的第一个热门,但我确实不时阅读这篇文章并对其进行真正的评价(再次与网络有关): http://www.securiteam.com/securityreviews/5DP0N1P76E.html
【讨论】:
我总是通过自定义消毒服务器端运行我的用户输入文本,这样我就可以删除所有讨厌的东西,以防它通过。 (& " = ' 等)
除了我调用的存储过程之外,我的代码中没有任何 SQL 语句,因此即使他们确实发现了漏洞,他们也必须在接触表之前找出我的存储过程。
在存储过程参数中,您可以限制文本大小,例如 VARCHAR(10),因此如果您通常期望字符串“123456”和“12345' AND UNION SELECT * FROM MEMBERS INNER JOIN MEMBER_ADDRESS ON ID”就可以通过,存储过程不会喜欢它。
最后一点,尝试捕获所有返回的异常,并尝试优雅地处理它们。有时您会看到网站显示类似“无法连接到数据库,'USER_ID' 在 mydatabase.member 中不存在”的信息。让某人嗅探一下您的数据库架构将开始进行漏洞利用。
【讨论】:
my_db.get_my_user (in _id INT(10)) BEGIN SELECT * from test where My_ID = _id; END 然后在您选择的语言中通过执行以下 SQL 语句来调用该过程: sql = "call get_my_user($value)";
call get_my_user($value) 是一个常规的SQL 查询,因此遭受同样的漏洞?
有了上面所有好的答案,我所做的是创建一个脚本来扫描所有表并为表名和列创建白名单,然后我使用它来验证任何应该是表/列名的用户输入,因为它们没有t 进入参数查询。其他任何东西都通过 PDO Bind 参数化!
【讨论】: