PDO / mysql_real_escape_string

VE
На сайте с 17.08.2006
Offline
76
882

Решил перевести все свои "творения" под PDO. Но, как и при прямом MySQL у меня, прямо как Гондурас, чесался и чешется вопрос про экранирование всяческой фигни.

Почитал поиск, сравнил/потестил несколько PDO-реализаций (CI, ezSQL), потестил "quote". И ничего не вкурил. Т.к. кое-где (отдельные классы) string даже через filter прогоняют.

Если mysql_real_escape_string слэшил кучку неприятных символов, то quote никак это не делает (а может в этом и фишка функции и/или PDO?). Сейчас посмотрю в сторону "SET SQL_MODE=ANSI_QUOTES", но боюсь не на всех хостингах будет возможность включить.

Вопрос.

Может кто в пару-тройку слов объяснить как правильно в PDO-MySQL слэшить то, что делала функция mysql_real_escape_string?

Или забить и "верить" :) quote?

Или как это правильно делать?

Также буду признателен за ссылочку на реализацию Yii/Zend под PDO-MySQL (на эти классы посмотреть бы - все качать пока не пойму - нет смысла, если полностью их не пользовать). Или сюда кусочки кода.

Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#1

Вроде бы для этого надо юзать prepare()

Подпись))
VE
На сайте с 17.08.2006
Offline
76
#2

Возможно. И что это решит?

Скажем на HTML (переведу к едрене м. все на markdown) можно натравить kses, safehtml, htmlpurifer.

Голое текстовое поле или текстареа понапихать можно всякого.

Можно и на такое filter_var, например, накинуть. Да и по старинке sprintf написать.

Но вот глянуть классы валидации/санитизации от Drupal, WP, Contao, TYPO3 до фреймворков всяких - они чем занимаются? Было бы все так просто.

Кстати, мануал был давно и полностью прочитан. Тамошние комменты также. Убогие они. У них там практически бодаются с селектами. А славянские парни горазды что-то в инсерт всадить :) дополнительно, так сказать, в нагрузку. И чтобы веб-мастер свистнул, как та японская пила.

O
На сайте с 29.05.2008
Offline
195
#3

Правильно делать это так,

$query = $db->prepare('
SELECT *
FROM :nameoftable
;');

$query->execute([ ':nameoftable' => 'table'
]);

где, :nameoftable - входящий параметр, а его значение передается в массиве при вызове execute();

PDO:prepare решит то, что входящие данные будут фигурировать в SQL запросе, как входящие данные, а не составная запроса. PDO:prepare гарантирует только это, но не валидность входящих данных. Входящие данные нужно проверять отдельно от SQL запроса. И если в проверку входит экранирование специальных символов, и используется только одна СУБД, плюсов от использования PDO, я не вижу, а минусы есть - производительность и синтаксис.

Для новых проектов на MySQL, PHP рекомендует использовать MySQLi класс.

dkameleon
На сайте с 09.12.2005
Offline
386
#4
view'er:
Возможно. И что это решит?

решит всё, что нужно.

защита от инъекций предоставляется.

валидация данных - дело юзера и конкретной задачи.

view'er:
Кстати, мануал был давно и полностью прочитан.

не верю. иначе вы бы получили ответ на свой вопрос:

PDO::quote:
Если вы используете эту функцию для построения SQL запросов, настоятельно рекомендуется пользоваться методом PDO::prepare() для подготовки запроса с псевдопеременными вместо использования PDO::quote()
Дизайн интерьера (http://balabukha.com/)
VE
На сайте с 17.08.2006
Offline
76
#5

Спасибочки всем.

Буду думать быстро.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий