powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / SQL в JSON без SQL-инъекций
10 сообщений из 10, страница 1 из 1
SQL в JSON без SQL-инъекций
    #38528923
eduard93
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бывает, что нужно отдавать пользователю результаты SQL запроса в формате JSON.
Такая функциональность в Caché есть уже давно - jsonSQLProvider , но входной параметр там - строка, содержащая SQL выражение.

И, к сожалению, есть пользователи, которые любят в запрос
"SELECT Name, Surname, ID from Sample.Users WHERE ID ="_ID подставить что-то вроде 1; SELECT * from Sample.Users.

Лучшая защита от SQL-иньекций в Caché - параметризованные запросы :
"SELECT Name, Surname, ID from Sample.Users WHERE ID = ?".

Однако, раньше преобразования результата подобного SQL-запроса в JSON не было.
Теперь это возможно с помощью https://github.com/intersystems-ru/jsonDynamicSQLProvider

Пример использования:
do ##class(%ZEN.Auxiliary.jsonDynamicSQLProvider).%WriteJSONFromDynamicSQL(,"SELECT Name,Surname,ID from Sample.Users WHERE ID = ?",$LB("60"))
...
Рейтинг: 0 / 0
SQL в JSON без SQL-инъекций
    #38529012
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eduard93Такая функциональность в Caché есть уже давно - jsonSQLProvider , но входной параметр там - строка, содержащая SQL выражение. jsonSQLProvider вполне поддерживает параметризованные запросы: 14637070
...
Рейтинг: 0 / 0
SQL в JSON без SQL-инъекций
    #38529243
eduard93
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,

Я имел в виду вне zen. В таком случае используется метод ##class(%ZEN.Auxiliary.jsonProvider).%WriteJSONFromSQL() который не поддерживает параметризованные запросы.
...
Рейтинг: 0 / 0
SQL в JSON без SQL-инъекций
    #38529287
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В указанном посте упоминался патч (будет встроен в 2014.2), который исправляет встроенный класс %ZEN.Auxiliary.jsonSQLProvider для правильной поддержки параметризованных запросов, включая, конечно, и методы %WriteJSONXXX.
Но нет проблем самостоятельно исправить %ZEN.Auxiliary.jsonSQLProvider для текущих версий.Результат вызова:  #define NULL ""
  #define EMPTYSTR $c(0)
  set parms(1)="test"
  set parms(2)=$lb($$$EMPTYSTR,$$$NULL,"a",77)
  do ##class(%ZEN.Auxiliary.jsonSQLProvider).%WriteJSONFromSQL(,"select ? as f1,$listtostring(?) as f2",.parms)  

Код: plaintext
1.
2.
3.
4.
5.
USER>do ^test
{
"children":[
{"f1":"test","f2":",,a,77"}
]
}
...
Рейтинг: 0 / 0
SQL в JSON без SQL-инъекций
    #38529416
eduard93
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,

Не знал.
Class Test.jsonSQLProvider Extends %RegisteredObject
{

ClassMethod json0()
{
// do ##class(Test.jsonSQLProvider).json0()
#define NULL $c(0)
set parms(1)="test"
set parms(2)=$lb($$$NULL,"","a",77)
do ##class(%ZEN.Auxiliary.jsonSQLProvider).%WriteJSONFromSQL(,"select ? as f1,$listtostring(?) as f2",.parms)
}

ClassMethod json1()
{
// do ##class(Test.jsonSQLProvider).json1()
set parms(1)="20000"
do ##class(%ZEN.Auxiliary.jsonSQLProvider).%WriteJSONFromSQL(,"SELECT * FROM Cinema.Film Where TicketsSold>?",.parms)
do ##class(%ZEN.Auxiliary.jsonSQLProvider).%WriteJSONFromSQL(,"SELECT * FROM Cinema.Film Where TicketsSold>"_parms(1))
}

}


А не подскажете, пожалуйста, почему у меня метод json1() не работает (в первом случае ничего не выдает), импорт в область SAMPLES?
...
Рейтинг: 0 / 0
SQL в JSON без SQL-инъекций
    #38529450
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eduard93А не подскажете, пожалуйста, почему у меня метод json1() не работает?У Вас есть патч?
Вы его применили?
...
Рейтинг: 0 / 0
SQL в JSON без SQL-инъекций
    #38529482
eduard93
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serviteduard93А не подскажете, пожалуйста, почему у меня метод json1() не работает?У Вас есть патч?
Вы его применили?
Использовал версию 2014.2 build 177. Думал, что там это уже есть.
...
Рейтинг: 0 / 0
SQL в JSON без SQL-инъекций
    #38587650
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
похоже что в 2014.2 не добавили этот патч

на саммите версия
$zv
Cache for Windows (x86-64) 2014.2 (Build 210 Experimental) Wed Feb 26 2014 00:12:45 EST

и тут параметризованные запросы не работают

Код: plaintext
ClassMethod %WriteJSONFromSQL(pVar As %String = "", pSQL As %String, pFormat As %String = "tw", pMaxRows As %Integer = 100, pReturnStatus As %Boolean = 0) As %String
...
Рейтинг: 0 / 0
SQL в JSON без SQL-инъекций
    #38587939
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMor ,

Сезон FieldTest ещё не открыт, поэтому рано об этом говорить.
...
Рейтинг: 0 / 0
SQL в JSON без SQL-инъекций
    #38711430
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сезон 2014.2 Field Test уже открыт.
Класс %ZEN.Auxiliary.jsonSQLProvider обновлён.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / SQL в JSON без SQL-инъекций
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]