0

準備されたステートメントで、フォーミュラーユーザー入力の一部の文字が期待どおりにエスケープされないのはなぜだろうと思っていました。この特定の部分の私のコードは次のとおりです。

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!";
}

したがって、これは基本的に問題なく動作しますが、「;」と入力すると たとえば、すべての結果を捨てるだけです。そのため、入力が本当に適切にエスケープされるかどうかはわかりません。sth がありませんか、それともすべての文字がエスケープされているわけではありませんか? もしそうなら、それらはどれですか?私はむしろそれらを手動でエスケープしたいと思います。

4

1 に答える 1

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>"; 
}
于 2013-08-28T20:28:14.643 に答える