[求助] PDO / MySQL准备语句注入分号

时间:2013-08-28 20:08:34

标签: php mysql pdo escaping code-injection

我想知道为什么在我准备好的声明中,来自公式用户输入的一些字符不会像我期望的那样被转义。这是我在这个特定部分的代码:

if( isset( $_POST['key'] ) && strlen($_POST['key']) <= 15) {
    $sql = "SELECT titel, date, content FROM News WHERE content LIKE :content OR titel LIKE :title";
    if( $stmt = $pdo->prepare($sql) ) {
        $temp = "%".$_POST['key']."%"; // NOT manually escaped here
        $stmt->bindParam(':content', $temp); // should escape!?
        $stmt->bindParam(':title', $temp); // should escape!?
        $stmt->execute();
        $stmt->bindColumn("Titel", $title, PDO::PARAM_STR);
        $stmt->bindColumn("Datum", $date, PDO::PARAM_STR);
        $stmt->bindColumn("Inhalt", $content, PDO::PARAM_STR);

        while( $stmt->fetch() ) {
            echo "<span class='head'>".$title." :: ".$date."</span><br />".shorten($content)."...<br /><hr>"; // the function shorten just shortens the content for preview reasons
        }

        // ends statement
        $stmt = NULL;

        // ends connection
        $pdo = NULL;
    }
    else {
        $err .= "statement wasn't prepare()'ed!";
    }
}
else {
    $err .= "no or false input!";
}

所以这基本上没问题,但是当我输入';'时例如,它只是抛出每一个结果。所以我'不确定它是否真的逃脱了输入。我错过了吗?还是没有所有角色逃脱?如果是这样的话呢?我宁愿手动逃脱它们。

1 个答案:

答案 0 :(得分:0)

  

我想知道为什么在我准备好的声明中,来自公式用户输入的一些字符不会像我期望的那样被转义。

因为你的期望是错误的 准备好的声明不一定涉及任何逃避 即使如此 - 一个诚实的分号字符完全无害,并且根本不需要逃避。

  

PDO / MySQL准备语句注入

您的代码中没有可能的注入,这是非常安全的。

  

当我输入';'例如,它只是抛出每一个结果。

这是另一个问题,与注射和逃避无关。仔细检查您的数据和其他场所。

顺便说一句,稍微缩短你的代码

$sql  = "SELECT titel, date, content FROM News WHERE content LIKE ? OR titel LIKE ?";
$temp = "%".$_POST['key']."%";
$stmt = $pdo->prepare($sql);
$stmt->execute(array($temp,$temp));
while( $row = $stmt->fetch() ) {
    extract($row);
    echo "<span class='head'>$titel :: $date</span><br />".shorten($content)."...<br /><hr>"; 
}