В моем коде есть запрос 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 } ?>
Почти все примеры онлайн не используют процедурный метод, который я использую. Как я могу исправить это?
Чтобы защитить ваш запрос от инъекционной атаки, у вас есть два варианта. Первый — очень простой и безопасный, как подготовленное заявление.
В ролях $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
, Как только любой из этих вызовов возвращает ложный / ошибочный ответ, условные выражения короткого замыкания и остальные вызовы в выражении никогда не выполняются.Других решений пока нет …