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

为了保护您的查询免受注入攻击,您有两种选择。第一个超级简单,与准备好的语句一样安全。

  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()将生成一个包含索引和关联键控元素的臃肿结果集(您实际需要的两倍)。
  • 使用时bind_result(),需要将*SELECT 子句中的列替换为要提取的列。
  • 我的第一个elseif()表达式包含三个单独的调用和检查$stmt. 一旦这些调用中的任何一个返回错误/错误的响应,条件表达式就会短路并且表达式中的剩余调用永远不会执行。
  • 如果采用我的面向对象的 mysqli 风格,请务必将您的数据库连接语法也与面向对象对齐。
于 2018-10-29T01:38:24.013 回答