0

SQL インジェクションなどの脆弱性を阻止するために、準備済みステートメントに変換したい SQL クエリがコードに含まれています。だから、これは私が変換したいものです:

<?php
$query = "SELECT * from `wp_posts` WHERE ID=$pid ";
$result = mysqli_query($link, $query);
    //$id=$row['Gallery_Id'];

    while($row = mysqli_fetch_array($result)){
        ?>
    <h2 align="center"> <?php echo $row['post_title']; ?> </h2><br>
    <div class="paracenter">

        <p id="cont"><?php echo $row['post_content']; ?></p>
        <hr color="black" width="10%">

    </div>
<?php } ?>

これは私が試したものですが、うまくいきません。

$query = "SELECT * from `wp_posts` WHERE ID=? ";
    $stmt = mysqli_prepare($link, $query);
    if($stmt){
        mysqli_stmt_bind_param($stmt, "i", $pid);
        mysqli_stmt_bind_result($stmt, $dbpid);
        mysqli_stmt_execute($stmt);
        mysqli_stmt_fetch($stmt);
    }
    $result = mysqli_query($link, $query);
    //$id=$row['Gallery_Id'];

    while($row = mysqli_stmt_fetch($result)){
        ?>


    <h2 align="center"> <?php echo $row['post_title']; ?> </h2><br>
    <div class="paracenter">

        <p id="cont"><?php echo $row['post_content']; ?></p>
        <hr color="black" width="10%">

    </div>
    <?php } ?>

オンラインのほとんどすべての例は、私が使用する手続き型の方法を使用していません。どうすればこれを修正できますか?

4

1 に答える 1

0

インジェクション攻撃からクエリを保護するには、2 つのオプションがあります。1 つ目は非常にシンプルで、プリペアド ステートメントと同じくらい安全です。

  1. $pid整数としてキャストします。

    $query = "SELECT post_title, post_content FROM wp_posts WHERE ID = " . (int)$pid;
    

    安全で完了です。

  2. 結果バインディングを使用して準備済みステートメントを作成する方法... (手続き型の mysqli 構文は使用しません)

    if (!$stmt = $link->prepare("SELECT post_title, post_content FROM wp_posts WHERE ID = ?")) {
        echo "Syntax Error @ Prepare"; // $link->error; <-- never show actual error details to public
    
    } elseif (!$stmt->bind_param("i", $pid) || !$stmt->execute() || !$stmt->bind_result($title, $content)) {
        echo "Syntax Error @ ParamBind | Execute | ResultBind"; // $stmt->error; <-- never show actual error details to public
    } else {
        while ($stmt->fetch()) {
            echo "<div>";
                echo "<h2 align=\"cente\">$title</h2><br>";
                echo "<div class=\"paracenter\">";
                echo "<p id=\"cont\">$content</p>";
                echo "<hr color=\"black\" width=\"10%\">";
            echo "</div> ";
        }
    }
    

いくつかの追加メモ。

  • 結果バインディングを使用しない場合は、mysqli_fetch_assoc()代わりにmysqli_fetch_array(). mysqli_fetch_array()インデックス付き要素と連想キー付き要素の両方の肥大化した結果セットを生成します (実際に必要なものの 2 倍)。
  • を使用する場合は、SELECT 句内の を抽出する列にbind_result()置き換える必要があります。*
  • 私の最初のelseif()式には、 の 3 つの個別の呼び出しとチェックが含まれてい$stmtます。これらの呼び出しのいずれかが誤った/誤った応答を返すとすぐに、条件式が短絡し、式内の残りの呼び出しが実行されることはありません。
  • オブジェクト指向の mysqli スタイルを採用する場合は、データベース接続構文もオブジェクト指向に合わせてください。
于 2018-10-29T01:38:24.013 に答える