从长期研究中,我发现防止注射的参数是一种很好的做法,但是我应该在每个查询中使用它还是只在登录页面中使用它?为什么
非常感谢你
答案 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 。因此,他们应该始终使用 - 否则代码会将自己设置为失败。
我意识到“永远”和“唯一”是绝对的极端,但我还没有在违反这些规则时在一般代码中找到一个例子。如果底层驱动程序使用内部转义或实际参数化查询也是无关紧要的 - 关键是使用参数(除了使查询更清晰)以一致和可靠的方式消除此责任。