The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Уязвимость, позволяющая осуществить подстановку SQL-кода в G..."
Отправлено Ordu, 09-Янв-17 17:40 
Ты с ActiveRecord знаком, деточка? ActiveRecord занимается сборкой текстового sql-запроса, и в частности экранированием. Задумка, примерно как в cl-sql: создать язык изоморфный SQL внутри языка общего назначения, чтобы функция query принимала бы запрос не как текстовую строку, а как более сложную структуру данных, которая бы позволяла библиотечному коду знать где строки которые надо подставить в запрос, а где ключевые слова SQL. И там, и там это достигается тем, что ключевые слова SQL передаются в библиотечный код не как строки, а иным путём. Всё же, что не ключевые слова, рассматривается библиотечным кодом как потенциально вредоносные строки, которые экранируются.

Но если лисп позволяет такие извращения в любых масштабах, благодаря тому, что для лиспа код и данные -- это одна фигня, в лисповский синтаксис можно уложить SQL, и написать код, который будет этот SQL компилировать в строку, то ruby -- хоть и довольно мощный язык, но всё же слабоват для подобного. В результате, не любое SQL-выражение можно записать на том языке описания запросов, который предлагает ActiveRecord. Поэтому в некоторых ситуациях ActiveRecord всовывает строки от программиста в текстовое представление SQL-запроса "as is". И программист должен знать и помнить все такие ситуации наперечёт, чтобы если не дай бог он ввалится в такую ситуацию, он бы не забыл экранировать. И это называется "грабли". То есть эдакая хрень, которая совершенно внезапно выскакивает из-за угла, и с воплем "you are not prepared" даёт по лбу. Адекватный API, при попытке программиста наступить на грабли, должен выкидывать исключения, ещё лучше делать код некомпилируемым, включать сирену и бить окна. Но хотя бы, вот как минимум, этот код должен просто ронять всё приложение посредством вызова функции panic, или die, или exit, или terminate, или, на крайняк, если такой функции не нашлось, то выполнить *(int*)0 = 0.

И да, не надо мне приводить в пример php -- в php вообще уродский подход, где программист составляет sql запросы конкатенируя строки. Конкатенируя, строки! В XXI веке, Карл!

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру