2017-09-26 65 views
0

所以我明白PDO准备语句应该保护SQL注入和'逃生。但是,当我尝试以下...单引号退出PDO准备语句参数

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的工作方式。

+0

[非常相关。](https://security.stackexchange.com/questions/15214/are-prepared-statements-100-safe-against-sql-injection) – Script47

+3

请花时间阅读文档http ://php.net/manual/en/pdo.prepared-statements.php如果你还没有这样做。 –

+0

好的。似乎有一个误解。我不知道这是否会发生。这正如我所描述的那样发生。也许我应该制作一个视频? –

回答

2

四处寻找一些后,此行为已雄辩地说明/解决了我在这里: https://phpdelusions.net/pdo#comment-277

事实证明,这不是逃避的字符串,但它只是做它看来逃脱整数之后,而不是截断输入字符串。修改代码后,我能够确认这一点。