我可以完全阻止没有bind_param的PDO Prepared语句的SQL注入吗?

zac*_*987 6 php mysql pdo

我是PDO的新手,对不起,如果你觉得我在问愚蠢的问题.
没有Bind_param的普通和简单的PDO Prepared语句:

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

Bind_param:

$sql->bind_param("s", $name); //s means the database expects a string
Run Code Online (Sandbox Code Playgroud)

我听人说:"保护来自于使用绑定参数,而不是使用预处理语句".我可以知道什么是绑定参数Bind_param绑定参数?如果是,那么没有Bind_param的正常和简单的PDO Prepared语句不能完全阻止SQL注入?

Tom*_*Tom 6

你说得对.绑定参数是使用?在"预准备语句"中声明的参数.然后使用execute()绑定它们,并将它们的值作为绑定到语句的参数.


You*_*nse 5

保护来自使用绑定参数,而不是来自使用准备好的语句

意味着仅使用prepare()但保留查询中的所有变量是不够的:

$sql = $db->prepare("SELECT * FROM employees WHERE name ='$name'");
$sql->execute();
$rows = $sql->fetchAll();
Run Code Online (Sandbox Code Playgroud)

有人说这意味着“尽管从技术上讲,您使用的是准备好的语句,但您并没有变量绑定到它”。所以它使查询同样容易受到攻击。

要受到保护,您必须用占位符替换查询中的所有变量,然后绑定它们:

$sql = $db->prepare("SELECT * FROM employees WHERE name = ?");
$sql->bindParam(1, $name);
$sql->execute();
$rows = $sql->fetchAll();
Run Code Online (Sandbox Code Playgroud)

但是,PDO 有一个很好的绑定简写,允许您避免重复调用bindParam()/ bindValue(),当您将变量发送到 时在内部执行所有这些调用execute()

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

它本质上与bindParam()/绑定相同bindValue()因此您的代码正在使用绑定,因此是安全的

最后,bind_param()实际上是一个与 PDO 无关的 mysqli 函数。