2013-08-28 1 views
0

Мне было интересно, почему в моем подготовленном заявлении некоторые символы из форматированного пользовательского ввода не экранированы, как я ожидал бы этого. вот мой код на эту конкретную деталь:[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 или не исчезли ли все символы? если да, то какие они? я бы скорее избежал их вручную.

+0

Что вы имеете в виду под "он выбрасывает каждый результат? Он возвращает все, даже строки, где контент и заголовок не содержат ';'? – andrewsi

+0

Единственными символами, которые должны быть экранированы внутри аргумента 'LIKE', являются'% ',' _' и обратная косая черта – Barmar

+0

добавить 'PDO :: PARAM_STR' в' bindParam' и снова выполнить тест –

ответ

0

Мне было интересно, почему в моем подготовленном заявлении некоторые символы из пользовательского ввода формуляра не экранированы, как я ожидал бы этого.

Потому что ваши ожидания неверны.
Подготовленная заявка не обязательно связана с какими-либо уклонениями
Даже если это так - честный символ с запятой абсолютно безвреден и не требует никакого экранирования.

PDO/MySQL Подготовленного Заявление Injection

Там нет никакой возможности для инъекций в вашем коде, это совершенно безопасно.

когда я вхожу ';' например, он просто бросает каждый результат.

Это еще один вопрос, не имеющий отношения к инъекциям и ускользанию. Дважды проверьте данные и другие помещения.

Кстати, чтобы сократить ваш код немного

$sql = "SELECT titel, date, content FROM News WHERE content LIKE ? OR titel LIKE ?"; 
$temp = "%".$_POST['key']."%"; 
$stmt = $pdo->prepare($sql); 
$stmt->execute(array($temp,$temp)); 
while($row = $stmt->fetch()) { 
    extract($row); 
    echo "<span class='head'>$titel :: $date</span><br />".shorten($content)."...<br /><hr>"; 
} 
+1

хорошо, я нашел проблему, это действительно было о двойном проверке данных. из-за того, что немецкий ÖÄÜöäüß хранится как &Xuml; или ß в базе данных есть много;.и, конечно, это не видно, потому что они отображаются как фактические символы, а затем –

+0

Я также немного сократил ваш код, так как было слишком много бесполезных команд –

Смежные вопросы