Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: PDO и SQL инъекция
 
 автор: shatun2007   (01.12.2010 в 11:57)   письмо автору
 
 

Как я понял, PDO автоматом должен экранировать символы, или я не так понял, или не так делаю...

Обновляю текст в БД:

$name = '"текст в кавычках"';
$text = '<script>alert('oops!')</script>';
$id = 1;
UPDATE table SET
    name     = :name
    text         = :text
WHERE id = :id

$stmt = $PDO->prepare($sql);
$stmt->bindParam(':name', $name, PDO::PARAM_STR);
$stmt->bindParam(':text', $text, PDO::PARAM_STR);
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();


Все прекрасно обновляется, но "текст в кавычках" не экранируется, т.е. <input> приобретает следующий вид: <input value = "то, что оборажается"текст в кавычках"">, т.е. в инпуте отображается текст "то, что оборажается", и добавляется мусор в тег.
И к тому же выскакивает alert.

Выборку делаю так:

$sql = "SELECT * FROM table";
$stmt = self::$_myPDO->prepare($sql);
$stmt->execute();


Что я делаю не так, почему символы не экранируются - ни при вставке, ни при выборке?

  Ответить  
 
 автор: Саня   (01.12.2010 в 18:25)   письмо автору
 
   для: shatun2007   (01.12.2010 в 11:57)
 

> И к тому же выскакивает alert.
Какое отношение имеет <script> к SQL-инъекциям?

> Все прекрасно обновляется, но "текст в кавычках" не экранируется
Текст в кавычках экранируется таким образом, чтобы прошел SQL-запрос.

Обе ваших проблемы никаким боком не касаются PDO и баз данных.
Что записали в базу — то и получили от неё. База сработала безукоризненно. А то, что вы пихаете эти данные в HTML — тут уж база никак не виновата.

Используйте htmlspecialchars($text, ENT_QUOTES) при выводе.

  Ответить  
 
 автор: shatun2007   (01.12.2010 в 21:57)   письмо автору
 
   для: Саня   (01.12.2010 в 18:25)
 

Ну что ж, ясно. Спасибо за ответ.

А подскажете, можно средствами PDO экранировать спецсимволы. А то получается от чего ушел (в том числе), к тому же и пришел.
Я про то, что, если PDO::FETCH_ASSOC выдает массив на десяток-другой полей, которые надо экранировать, так что же, перед выводом каждой прописывать htmlspecialchars? Вероятно, должно быть более красивое решение...

Когда пользовался драйвером mysql (без "i"), то экранировал данные перед вставкой в БД.
А сейчас связываю переменную таким образом:
$stmt = $db->prepare($sql);
$stmt->bindParam(':text_info', $array['text_info'], PDO::PARAM_STR);
И что получается, надо сначала сделать mysql_real_escape_string переменной? И в чем тогда смысл prepare statement?

  Ответить  
 
 автор: Красная_шляпа   (01.12.2010 в 22:51)   письмо автору
 
   для: shatun2007   (01.12.2010 в 21:57)
 

strip_tags, htmlspecialchars, addslashes

  Ответить  
 
 автор: Max_Ivanov   (15.12.2010 в 08:16)   письмо автору
 
   для: shatun2007   (01.12.2010 в 21:57)
 

средствами PDO http://www.php.net/manual/en/pdo.quote.php

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования