我可以通过PDO Prepared语句完全防止SQL注入,无需绑定

我对PDO非常陌生,如果你觉得我在问一个愚蠢的问题,对不起。
普通和简单的PDO Prepared statement without Bind_param

$sql = $db->prepare('SELECT * FROM employees WHERE name = ?');
$sql->execute(array($name));
$rows = $sql->fetchAll();

Bind_param

$sql->bind_param("s", $name); //s means the database expects a string

我听到人们说: “保护来源于使用绑定参数,而不是使用准备好的语句” 。 我可以知道绑定参数是什么吗? Bind_param绑定参数吗? 如果是,那么没有Bind_param的普通和简单的PDO Prepared语句不能完全防止SQL注入?


你做对了。 绑定参数是使用?在“准备好的语句”中声明的参数。 然后使用execute()将它们的值作为绑定到语句的参数绑定。


那是真实的。

我没有这方面的专家信息,但根据我的理解,SQL注入的问题在于SQL服务器接收到一个字符串并将其视为true。 例如,服务器无法知道DUMP命令是否是故意的。

使用绑定的参数,你对SQL服务器说:“嘿,看,这是查询,我期望这里和那里的参数。哦,顺便说一下,这里是值”。 这种方法是不同的,因为SQL现在知道它必须执行的实际表达式以及值是什么。 这允许SQL将值插入到表达式中,而无需修改表达式本身。


OWASP给了我相同的疑问,遵循他们的指导,针对SQL注入“SQL_Injection_Prevention_Cheat_Sheet”他们说:

防御选项1:预备陈述(带参数化查询):

  • PHP - 使用PDO和强类型参数化查询(使用bindParam())
  • 所以看起来好像你应该始终使用bind_param()。 我不使用它,因为我使用自动化脚本转换了数千个易受攻击的DAO,bind_param()需要我手动编辑它们。

    我还没有看到没有使用bind_param()的注入的例子,所以我相信这是没有必要的。

    链接地址: http://www.djcxy.com/p/93763.html

    上一篇: Can I fully prevent SQL injection by PDO Prepared statement without bind

    下一篇: sanitizing inputs with prepared PDO statements explanation