防止注入的参数?够了吗?它应该在每个查询中使用吗?
Parameters to prevent injection? is it enough? and should it be used in each query?
经过长时间的研究,我发现防止注入的参数是一个很好的做法,但是我应该在每个查询中使用它还是只在登录页面中使用它?为什么
非常感谢
代码应该总是为SQL使用参数绑定。
数据来自哪里并不重要;跳过这可能会导致 second order SQL 注入 或 "I forgot to update the code" 的情况。只需使用SQL参数所有的时候。
only 一般例外情况是无法完成此操作时,例如需要更改查询本身中的 非数据 (例如 table 名称)——在这种情况下,还有其他技术可以减轻 SQL 注入。
虽然是必不可少的基石,但参数绑定是 "not enough"。
根据定义,正确使用查询参数可以防止所有"Classic" SQL Injection,但不能保证查询是安全的。
SQL injection is a code injection technique, used to attack data-driven applications, in which malicious SQL statements are inserted into an entry field for execution..
也就是说,虽然以下是免费来自SQL注入因为查询形状无法改变它仍然是不保证查询是"safe"或"secure"。
$name_from_user = $_GET['name'];
prepare('SELECT nuke_code FROM secrets WHERE name = :name');
execute(array('name' => $name_from_user));
这显然是一个潜在的安全 (fsvo) 风险,因为它在查询中使用了不受信任/未经验证的 数据。在这种情况下,仅信任来自服务器的数据,或者在执行查询之前可以由服务器验证的数据。
此外,SQL 注入(以及参数)不涵盖违反业务规则。这些应该 与 "sanitization/validation for SQL" 分开 强制执行。希望代码使用 DAL/BLL 这样逻辑就不会散布在几十个 PHP 文件中 ..
在回答基本问题时需要记住的是,使用 SQL 参数 确保提供的数据在不改变查询形状的情况下进入 SQL 。因此,它们应该始终被使用——否则代码将自身设置为失败。
我意识到 "always" 和 "only" 是绝对的极端,但我还没有在通用代码中找到违反此类规则的示例。如果底层驱动程序使用内部转义或真正的参数化查询也无关紧要 - 关键是使用参数(除了使查询更清晰)以一致和可靠的方式消除这种责任。
经过长时间的研究,我发现防止注入的参数是一个很好的做法,但是我应该在每个查询中使用它还是只在登录页面中使用它?为什么
非常感谢
代码应该总是为SQL使用参数绑定。
数据来自哪里并不重要;跳过这可能会导致 second order SQL 注入 或 "I forgot to update the code" 的情况。只需使用SQL参数所有的时候。
only 一般例外情况是无法完成此操作时,例如需要更改查询本身中的 非数据 (例如 table 名称)——在这种情况下,还有其他技术可以减轻 SQL 注入。
虽然是必不可少的基石,但参数绑定是 "not enough"。
根据定义,正确使用查询参数可以防止所有"Classic" SQL Injection,但不能保证查询是安全的。
SQL injection is a code injection technique, used to attack data-driven applications, in which malicious SQL statements are inserted into an entry field for execution..
也就是说,虽然以下是免费来自SQL注入因为查询形状无法改变它仍然是不保证查询是"safe"或"secure"。
$name_from_user = $_GET['name'];
prepare('SELECT nuke_code FROM secrets WHERE name = :name');
execute(array('name' => $name_from_user));
这显然是一个潜在的安全 (fsvo) 风险,因为它在查询中使用了不受信任/未经验证的 数据。在这种情况下,仅信任来自服务器的数据,或者在执行查询之前可以由服务器验证的数据。
此外,SQL 注入(以及参数)不涵盖违反业务规则。这些应该 与 "sanitization/validation for SQL" 分开 强制执行。希望代码使用 DAL/BLL 这样逻辑就不会散布在几十个 PHP 文件中 ..
在回答基本问题时需要记住的是,使用 SQL 参数 确保提供的数据在不改变查询形状的情况下进入 SQL 。因此,它们应该始终被使用——否则代码将自身设置为失败。
我意识到 "always" 和 "only" 是绝对的极端,但我还没有在通用代码中找到违反此类规则的示例。如果底层驱动程序使用内部转义或真正的参数化查询也无关紧要 - 关键是使用参数(除了使查询更清晰)以一致和可靠的方式消除这种责任。