我的代码中有一个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 } ?>
几乎所有在线示例都不使用我使用的程序方法。我怎么能纠正这个?
答案 0 :(得分:0)
要保护查询免受注入攻击,您有两个选择。第一个超级简单,并且与准备好的语句一样安全。
将$pid
设为整数。
$query = "SELECT post_title, post_content FROM wp_posts WHERE ID = " . (int)$pid;
确定并完成。
如何编写带有结果绑定的准备好的语句...(我不使用过程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
的调用和检查。一旦这些调用中的任何一个返回假或错误的响应,就永远不会执行条件表达式短路和表达式中的其余调用。