romikchef: (Default)
[personal profile] romikchef
Этот вопрос для меня настолько важен, что даже пишу в этом журнале.
Вопрос, естетственно, только для тех, кто на этих галерах.


Столкнулся я с большой проблемой. Это всё связано с факом про кавычки, слеши, PHP и Mysql.
Проблема - с определением субъекта прослешивания и окавычивания.

Поясню, почему проблема большая.
Сначала в факе я писал, что достаточно таким образом обработать данные - и всё будет зашибись.
Gотом до меня дошло, что это только строковые литералы можно защитить таким образом, а остальные части запроса надо защищать по-другому.
Сейчас собрался сесть таки переписывать, и столкнулся с вопросом:
Как обобщить тип данных, который требуется прослешивать и окавычивать?
Желательно, определение должно занимать не больше одной строки. Но не в ущерб точности.
Пусть больше. Но лишь бы это было ЧЁТКОЕ, всеобъемлющее определение!
Иначе у меня и вовсе почва уходит из-под ног.
Я-то хотел разделить рекоменации по защите запросов на две части - чёткую и нечёткую.
Чёткая - прослешивание литералов. Нечёткая - всё остальное.
но если нет точного определения для первой части, то и она становится нечёткой!
А выражение "данные", как и "строковый литерал" само по себе никакого смысла не несёт.
Хотел написать "всё, связанное со значением поля", но во-перваых, это криво, а во-вторых, как быть с литералами, не имеющими отношения к полям - SELECT 'aaa';?

http://community.livejournal.com/ru_php/552359.html

Date: 2006-02-01 04:56 pm (UTC)
From: [identity profile] mderk.livejournal.com
"обкавычить" ты имеешь в виду заключить в кавычки? Я думал мы про слеши ...

Объяснить просто. Имена полей, таблиц, инструкций (ключевые слова), знаки препинания в SQL не являются параметрами. Параметрами могут быть только данные. Например, если ты компилируешь запрос в prepare, ты не можешь оставить плейсхолдеры для полей - только для их значений. Вот и все. Все остальное - параметры (не уверен до конца насчет параметров LIMIT, т.к. это - нестандартная SQL-конструкция, но это частный случай).
Ну а насчет обкавычивания именно параметров, это тоже не очень хорошая идея. Если она в данное время работает на MySQL с любым типом данных, это не гарантирует, что оно будет работать где-то еще, даже, возможно, в будущих версиях MySQL. SQL, все же, строго типизированный язык сам по себе, и неявные преобразования типов в большинстве случаев - скорее прихоть разработчиков.

Date: 2006-02-02 11:09 am (UTC)
From: [identity profile] mderk.livejournal.com
Я могу сформулировать так:
1. Есть конструкции языка SQL - наименования объектов, ключевые слова, операторы. Эти нельзя ни кавычить, ни слешить, эти - как ёжики, с ними надо осторожно.
2. Все остальное - параметры (данные). По возможности нужно использовать механизм передачи параметров через плейсхолдеры, если это поддерживается базой. Тогда ничего слешить и кавычить не надо, об этом позаботится библиотека доступа к базе, в соответствие с ожидаемым типом параметра (она знает, какому типу принадлежит какой-то параметр, даже если ты сам этого не знаешь, т.к. у нее есть метаданные). Если такого механизма нет, то надо кавычить и слешить все параметры в расчете на то, что она (как MySQL, например) сама разберется с типами и сделает неявное приведение типа, если понадобится.

Profile

romikchef: (Default)
(P) All pun intended

December 2025

S M T W T F S
 123456
789 10111213
14151617181920
21222324252627
28293031   

Style Credit

Page generated Dec. 26th, 2025 05:57 am
Powered by Dreamwidth Studios

Expand Cut Tags

No cut tags

Page Summary