Мне было интересно, почему в моем подготовленном заявлении некоторые символы из форматированного пользовательского ввода не экранированы, как я ожидал бы этого. вот мой код на эту конкретную деталь:[SOVLED] PDO/MySQL Подготовленное заявление Injection Semi Colon
if(isset($_POST['key']) && strlen($_POST['key']) <= 15) {
$sql = "SELECT titel, date, content FROM News WHERE content LIKE :content OR titel LIKE :title";
if($stmt = $pdo->prepare($sql)) {
$temp = "%".$_POST['key']."%"; // NOT manually escaped here
$stmt->bindParam(':content', $temp); // should escape!?
$stmt->bindParam(':title', $temp); // should escape!?
$stmt->execute();
$stmt->bindColumn("Titel", $title, PDO::PARAM_STR);
$stmt->bindColumn("Datum", $date, PDO::PARAM_STR);
$stmt->bindColumn("Inhalt", $content, PDO::PARAM_STR);
while($stmt->fetch()) {
echo "<span class='head'>".$title." :: ".$date."</span><br />".shorten($content)."...<br /><hr>"; // the function shorten just shortens the content for preview reasons
}
// ends statement
$stmt = NULL;
// ends connection
$pdo = NULL;
}
else {
$err .= "statement wasn't prepare()'ed!";
}
}
else {
$err .= "no or false input!";
}
Так что это в основном работает хорошо, но когда я вхожу ';' например, он просто бросает каждый результат. поэтому im 'не уверен, действительно ли он правильно выходит из ввода. я пропустил sth или не исчезли ли все символы? если да, то какие они? я бы скорее избежал их вручную.
Что вы имеете в виду под "он выбрасывает каждый результат? Он возвращает все, даже строки, где контент и заголовок не содержат ';'? – andrewsi
Единственными символами, которые должны быть экранированы внутри аргумента 'LIKE', являются'% ',' _' и обратная косая черта – Barmar
добавить 'PDO :: PARAM_STR' в' bindParam' и снова выполнить тест –