gpt4 book ai didi

php - 在 PHP 中使用准备好的语句/存储过程时如何保护自己免受 SQL 注入(inject)?

转载 作者:行者123 更新时间:2023-11-29 01:46:05 24 4
gpt4 key购买 nike

我一直在研究如何最好地防止 PHP/mysql 中的 sql 注入(inject),而不仅仅是使用 mysqli/mysql 真正的转义,因为阅读这篇 Is mysql_real_escape_string enough to Anti SQL Injection?

我看过这个非常好的帖子 How can I prevent SQL injection in PHP?

我曾经在桌面/内部工具上做很多 ms sql server 的事情,我们总是编写存储过程来防止这种情况,所以我使用 PDO 阅读了 PHP/mysql 中的等效项 http://php.net/manual/en/pdo.prepared-statements.php

上面有一行:

The parameters to prepared statements don't need to be quoted; the driver automatically handles this. If an application exclusively uses prepared statements, the developer can be sure that no SQL injection will occur (however, if other portions of the query are being built up with unescaped input, SQL injection is still possible).

我一直相信 PDO 确实可以防止 sql 注入(inject)攻击,所以任何人都可以提供一个从安全角度来看 PDO 不够用的实例吗?

最佳答案

您仍然可以从内部使用 PREPARE 语法(在 MySQL 中)创建动态 SQL 语句的存储过程中获取 SQL 注入(inject)。

这些需要非常小心地完成,必要时使用 QUOTE()。

理想情况下,我们不需要在存储例程中使用 PREPARE,但在某些情况下很难避免:

  • 在 MySQL 5.5 之前,LIMIT 子句不能使用非常量值。
  • IN() 子句中使用的列表不能(明智地)参数化,因此如果使用此模式,则需要使用动态 SQL
  • 有时需要使用动态生成的 ORDER BY 子句。

等等

在需要使用PREPARE的情况下,我会按照优先顺序推荐:

  • 如果某物是 INT 类型(等),则它不易受到 SQL 注入(inject)的影响,您可以毫无问题地将值放入查询中(例如,对于 LIMIT)
  • 字符串值可以放在 EXECUTE 之前的@variable 中,或者传递给 EXECUTE 子句
  • 需要检查列表值(例如 IN())的有效性。
  • 最后,QUOTE() 可用于引用字符串值,这在某些情况下很有用

关于php - 在 PHP 中使用准备好的语句/存储过程时如何保护自己免受 SQL 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6533239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com