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


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

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

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

Re: Ой :)

Date: 2006-02-01 02:19 pm (UTC)
From: [identity profile] mderk.livejournal.com
Слешить надо параметры. Или я неправильно понял вопрос?

Date: 2006-02-01 03:41 pm (UTC)
From: [identity profile] mderk.livejournal.com
я тебя тоже :)
Оговорюсь сначала, что, по-моему, в любом случае слешение не вредит. Если у тебя число, то в нем кавычек быть не может, если в названии поля у тебя кавычка, то весь запрос пойдет лесом.
Теперь про параметры.

Я вижу это так:
1. Есть некий литерал, который представляет собой SQL-запрос или его часть. Это - константа. Ее слешить не надо. Если тот, кто писал эту часть, вбил туда лишние кавычки, то это уже проблема безопасности несколько другого порядка.
2. Параметры можно определять по-разному, в зависимости от семантики SQL или нет - это уже другой вопрос. Чтобы ответить на твой вопрос, я бы определил "параметры для слешения" - это те данные, которые приехали из внешнего источника, например, через переменные _GET или _POST, или через строки, выбранные из базы данных, прочитанные из файла и т.п. В некоторых языках (perl, ruby) этим данным в самом начале даже прилепляется ярлык "порченых" (tainted). Этот ярлык прилепляется и ко всем данным, в формировании которых поучаствовали эти порченые данные. При этом, при определенных настройках паранойи языка, порченые данные нельзя засунуть в драйвер базы данных в виде запроса. Поэтому любые параметры, приехавшие снаружи, надо "отпорчивать".
Т.о., если у тебя 10 родилось внутри программы, и ты не брал его из значения $_GET['offset'], то это - не порченный параметр, можно не слешить. То же самое и с name.
Ну, и если ты не можешь достаточно достоверно определить источник параметра, то его надо слешить.

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. 25th, 2025 12:45 pm
Powered by Dreamwidth Studios

Expand Cut Tags

No cut tags