PDO准备声明

Ash*_*nks 4 php mysql pdo

我可以快速澄清一下这个,只是我正在进行的讨论:

以此为例:

$conn->prepare ( 'SELECT * FROM table WHERE id = "' . $_POST['id'] . '"' );
Run Code Online (Sandbox Code Playgroud)

难道不是防止SQL注入,你必须绑定的参数或将进入准备语句之前消毒的价值观?或者我错了,只使用准备就可以了?

Lin*_*een 5

准备好的语句使用占位符来插入值.您的问题中的代码段已经将值插入到查询中,因此容易进行SQL注入.

以下伪代码突出显示准备好的语句:

$stmt = $conn->prepare('SELECT * FROM `table` WHERE `id` = ?');
$stmt->execute($_POST['id']);
Run Code Online (Sandbox Code Playgroud)

在这个例子中,这个"代码"背后的逻辑将负责正确引用任何内容$_POST['id']并用该代替问号?.您可能还会遇到以下占位符:

$stmt = $conn->prepare('SELECT * FROM `table` WHERE `id` = :id');
$stmt->execute(array(
    'id' => $_POST['id']
));
Run Code Online (Sandbox Code Playgroud)

但是请注意,该预处理语句不免除您的你的责任将其传递到(我的)SQL语句之前验证用户提供的输入:如果id预期是一个整数,只接受整数作为输入.