Использование PDO, чтобы избежать внедрения SQL - новый код не работает (новичок)
Я хочу использовать подготовленные операторы, чтобы избежать внедрения SQL.
Чтобы дать вам представление, это был мой старый код:
<?php
(connect to database = ok)
$id = str_replace ('-', ' ', $_GET['id']);
$sql = "SELECT * FROM `table-news` WHERE `id` = '$id' ORDER BY `date` DESC";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
?>
<div id="content">
<?php echo strtolower($row['text']);?>
</div>
<?php
}// end while
}// end if
else {
echo '0 results';
}// end else
?>
И это новый код:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'root', '');
$id = str_replace ('-', ' ', $_GET['id']);
$sql = "SELECT id, title, year, date, text FROM `table-news` WHERE id= :id ORDER BY `date` DESC";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(":id", $id);
$stmt->execute();
if($result = $stmt->fetch(PDO::FETCH_ASSOC))
{
?>
<div id="content">
<?php echo strtolower($result['text']);?>
</div>
<?php
}// end if
else {
echo '0 results';
}// end else
?>
Я получил (по крайней мере) одну проблему с этим новым кодом:
Приведенный ниже код не избегает SQL-инъекций. Как я могу преобразовать это в безопасный код, используя PDO? (Мне действительно нужно заменить все пробелы дефисом)
`$id = str_replace ('-', ' ', $_GET['id']);`
3 ответа
Замени это
$stmt->bindParam(":id", $_GET['id']);
с
$stmt->bindParam(":id", $id);
Ваш код выглядит хорошо, не уверен, почему вы думаете, что он не избегает инъекций
Просто избавьтесь от следующей строки:
$id = str_replace ('-', ' ', $_GET['id']);
Вам не нужно вручную чистить параметры. В этом весь смысл подготовки запроса.
$id = $_GET['id'];
$sql = "SELECT id, title, year, date, text FROM `table-news`
WHERE id= :id ORDER BY `date` DESC";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(":id", $id);
$stmt->execute();
Если вы беспокоитесь о гипсе, то придерживайтесь линии, но отдельный гипс не так опасен, как двойной гипс --
словно SQL
Комментарии.
Чтобы сменить нижеследующее на mysqli подготовлено, посмотрите это...
$sql = "SELECT * FROM `table-news` WHERE `id` = '$id' ORDER BY `date` DESC";
$result = $conn->query($sql);
Для того, чтобы..
//create db connection
$conn = new mysqli("localhost", "my_user", "my_password", "world");
//create prepared statement
$statement = $conn->prepare("SELECT * FROM `table-news` WHERE `id` = ? ORDER BY `date` DESC");
//bind parameters
$statement->bind_param('s', $id);
//execute query
$statement->execute();
Читайте дальше об этих компонентах, если вы не понимаете некоторые биты. Один бит они могут выглядеть странно bind_param
's' значение Это говорит MySQL, что параметр является строкой. Допустим, у вас в подготовленном утверждении было два символа "?". Сначала было целое число, а во-вторых - строка, на которую это было бы похоже..
$statement->bind_param('is', $MyInteger, $MyString);