php - PDO 准备语句参数中的单引号转义

标签 php mysql pdo prepared-statement sql-injection

所以我理解 PDO 准备语句应该防止 SQL 注入(inject)和 ' 转​​义。但是当我尝试以下...

if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["id"]))
{   
    $id = $_POST["id"]; 
    //$id = "2' AND name='Entry2";
    $someinfo = "updated";

    ...DB Stuff...

    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $dbpassword);

    $stmt = $conn->prepare("UPDATE testdb SET info=:someinfo WHERE id=:id");

    $stmt->bindParam(':id', $id);
    $stmt->bindParam(':someinfo', $someinfo);
    $stmt->execute();

    $conn = null;

    exit();
}

然后将更新 id=2 和 name=entry2 的行。现在这似乎不能用于转义到其他 SQL 查询,我想我可以采取预防措施以确保这种转义不会真正造成损害。但我想确保没有其他方法可以防止 ' 转义对 SQL 查询参数进行意外更改。 (值得注意的是,我在 SQLi 中尝试了类似的东西并得到了几乎相同的结果。)

有什么我想念的吗?还是这就是 Prepared Statements 的工作方式。

最佳答案

在进一步查看之后,我在这里为我 Eloquent 地解释/解决了这种行为: https://phpdelusions.net/pdo#comment-277

事实证明它不是转义字符串,而是在整数之后截断输入,这使得它看起来像是转义了字符串。我在修改代码后能够确认这一点。

关于php - PDO 准备语句参数中的单引号转义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46425371/

相关文章:

PHP:如何自动包含和实例化类?

php - 将表单数据从表单传输到外部表单

php - 我如何判断 moodle cron 是否正常工作?

MySQL 合并两个具有相似数据联合/联接的表?

php - 可点击获取的数据: Website Redirect

PHP:许多连接还是一个内爆?

mysql - 安排导出到文本文件

PHP - PDO 引用可以安全地避免 SQL 注入(inject)吗?

php - 使用 mysql PDO 插入和删除标签

php - 在 PDO 语句中转义列名