Aug 02, 2010 12:02
Один весьма мной уважаемый гн Ден Каминский (Dan Kaminsky - известен благодаря обнаружению им фундаментальной уязвимости в DNS ) предложил очень интересную универсальную технику защиты от SQL injection и XSS.
Метод очень просто и от того гениален.
Суть техники сводится в подстановке в SQL-запросах всех данных в base64-представлении и таким образом нет смысла использовать какие либо парсеры/анализаторы используемых в SQL-запрос данных (placeholders и т.д.)
Все это можно грубо описать строкой типа:
«SELECT * from mytable where textfield=base64_decode('Q29vbEhhY2tlcnM=')»
где base64_decode - функция декодирования из base64, релализуемая конкретной БД.
В base64 отстуствуют спецсимволы и следовательно никаких угроз нашему запросу от вносимых в него данных не будет. Нет необходимости как-то экранировать или изменять входные данные. Достаточно закодировать их в base64 и передать в запросе.
Техника применима также и на клиентской стороне - если надо убрать данные в кавычки например в обработчике событий либо же в js. Разкодировка из base64 может быть выполнена прямо в js когда необходимо получить оригинальные данные.
С моей точки зрения метод гениален. Недостатков (по моему мнению) два - увеличение памяти под хранимые таким образом переменные составит 30% (особенность base-64 кодирования), а также повышение нагрузки на сервер из-за необходимости кодирования входных параметров (считаю что можно пренебречь), и нагрузки на сервер БД из-за необходимости разкодирвания (а вот этим я думаю пренебречь не получится).
P.S. Ещё раз повторюсь - метод гениальный!
SQL-инъекции,
идея,
экранирование значений