|
|
|
| Как я понял, 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();
|
Что я делаю не так, почему символы не экранируются - ни при вставке, ни при выборке? | |
|
|
|
|
|
|
|
для: shatun2007
(01.12.2010 в 11:57)
| | > И к тому же выскакивает alert.
Какое отношение имеет <script> к SQL-инъекциям?
> Все прекрасно обновляется, но "текст в кавычках" не экранируется
Текст в кавычках экранируется таким образом, чтобы прошел SQL-запрос.
Обе ваших проблемы никаким боком не касаются PDO и баз данных.
Что записали в базу — то и получили от неё. База сработала безукоризненно. А то, что вы пихаете эти данные в HTML — тут уж база никак не виновата.
Используйте htmlspecialchars($text, ENT_QUOTES) при выводе. | |
|
|
|
|
|
|
|
для: Саня
(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? | |
|
|
|
|
|
|
|
для: shatun2007
(01.12.2010 в 21:57)
| | strip_tags, htmlspecialchars, addslashes | |
|
|
|
|