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

时间:2017-09-26 11:32:40

标签: php mysql pdo prepared-statement sql-injection

所以我理解PDO Prepared Statements应该防止SQL注入和'逃脱。但是当我尝试以下时......

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中尝试了类似的东西并获得了相同的结果。)

我有什么遗失的东西吗?或者这只是准备语句的工作方式。

1 个答案:

答案 0 :(得分:3)

在浏览了一些之后,我在这里雄辩地解释/解决了这种行为: https://phpdelusions.net/pdo#comment-277

事实证明它没有转义字符串,而是在整数之后截断输入,只是使它看起来像是逃避了字符串。我可以在修改代码时确认这一点。