参数防止注射?够了吗?它应该在每个查询中使用吗?

时间:2015-03-26 04:32:31

标签: javascript php html mysql mysqli

从长期研究中,我发现防止注射的参数是一种很好的做法,但是我应该在每个查询中使用它还是只在登录页面中使用它?为什么

非常感谢你

1 个答案:

答案 0 :(得分:1)

代码始终使用SQL的参数绑定。

数据的来源无关紧要;跳过此操作可能会导致 second order SQL注入,或“我忘记更新代码”的情况。只需使用SQL参数 all 时间。

常规异常是在无法完成此操作时,例如需要更改查询本身中的非数据时(例如,表名) - 在在这种情况下,还有其他技术可以缓解SQL注入。

虽然是必不可少的基石,但参数绑定“还不够”

正确使用查询参数会根据定义阻止所有"Classic" SQL Injection,但不保证查询是安全的。

  

SQL注入是一种代码注入技术,用于攻击数据驱动的应用程序,其中将恶意SQL语句插入到输入字段中以供执行。

也就是说,虽然以下是来自SQL Injection free ,因为查询形状无法更改但仍然无法保证该查询是“安全的”或“安全的”。

$name_from_user = $_GET['name'];
prepare('SELECT nuke_code FROM secrets WHERE name = :name');
execute(array('name' => $name_from_user));

这显然是潜在的安全(fsvo)风险,因为它在查询中使用了未经验证/未经验证的数据。在这种情况下,来自服务器的信任数据,或者在执行查询之前可由服务器验证。

此外,SQL注入(以及参数)不包括违反业务规则。这些应该从“SQL的清理/验证”单独强制执行。希望代码使用DAL/BLL,这样逻辑就不会遍布数十个PHP文件。

回答基本问题时需要记住的是,使用SQL参数可确保提供的数据在不改变查询形状的情况下进入SQL 。因此,他们应该始终使用 - 否则代码会将自己设置为失败。


我意识到“永远”和“唯一”是绝对的极端,但我还没有在违反这些规则时在一般代码中找到一个例子。如果底层驱动程序使用内部转义或实际参数化查询也是无关紧要的 - 关键是使用参数(除了使查询更清晰)以一致和可靠的方式消除此责任。