Регистрация  |  Вход

SOQL injection: в каких Query возможны?

Еще раз внимательно прочитал нижнюю часть вот этой статьи в блоге:

http://salesforce-developer.ru/paginatsiya-na-visualforce-stranitse-pagination-using-standardsetcontroller/

остались вопросы:

(1) говорится про необходимость String.escapeSingleQuotes() - но не вижу этих слов в финальном коде. Не понял как это работает.

(2) вся SOQL injection профилактика заключается в перезаписи строковой переменной, содержащей пришедшие с фронта поисковые слова или что-то, в другую строковую переменную, но теперь строчка включает в себя знаки "%"? в этом вся магия?

String SearchBookKeywordCreteria = '%'+(SearchBookKeyword == null ? '' : SearchBookKeyword)+'%';

а можно ли здесь просто перезаписать SearchBookKeyword на саму себя?
SearchBookKeyword = '%'+(SearchBookKeyword == null ? '' : SearchBookKeyword)+'%';

(3) SOQL injection возможны только в случае если вызывается query c условием типа "LIKE % что-то %" ???

У меня напрмер с фронта с строковую переменную приходит имя записи, которую я тут же хочу отправить в query:

... where name =:stringVariable ...

а здесь возможна SOQL инъекция?
и если возможна - то что делать - перезаписать эту stringVariable в еще одну стринг переменную?
и если возможно - а как увидеть результат инъекции, если код просто упадет тк в результате выполнения зараженного запроса в принимающий объект-переменную вернется совсем не то, что он может принять?

спасибо

Еще раз внимательно прочитал нижнюю часть вот этой статьи в блоге:

[url]http://salesforce-developer.ru/paginatsiya-na-visualforce-stranitse-pagination-using-standardsetcontroller/[/url]

остались вопросы:

(1) говорится про необходимость String.escapeSingleQuotes() - но не вижу этих слов в финальном коде. Не понял как это работает.

(2) вся SOQL injection профилактика заключается в перезаписи строковой переменной, содержащей пришедшие с фронта поисковые слова или что-то, в другую строковую переменную, [b]но теперь строчка включает в себя знаки "%"? в этом вся магия?[/b]

                String SearchBookKeywordCreteria = '%'+(SearchBookKeyword == null ? '' : SearchBookKeyword)+'%';

а можно ли здесь просто перезаписать SearchBookKeyword на саму себя?
SearchBookKeyword = '%'+(SearchBookKeyword == null ? '' : SearchBookKeyword)+'%';

[b](3) SOQL injection возможны только в случае если вызывается query c условием типа "LIKE % что-то %" ???[/b]

У меня напрмер с фронта с строковую переменную приходит имя записи, которую я тут же хочу отправить в query:

... where name =:stringVariable ...

а здесь возможна SOQL инъекция? 
и если возможна - то что делать - перезаписать эту stringVariable в еще одну стринг переменную? 
и если возможно - а как увидеть результат инъекции, если код просто упадет тк в результате выполнения зараженного запроса в принимающий объект-переменную вернется совсем не то, что он может принять?

спасибо

Тогда тебе в помощь секюріте сканер.На сколько я помню Там в отчете очень точно описывается что как можно injection.

http://security.force.com/security/tools/forcecom/scanner

Тогда тебе в помощь секюріте сканер.На сколько я помню Там в отчете очень точно описывается что как можно injection.

[url]http://security.force.com/security/tools/forcecom/scanner[/url]

(1) говорится про необходимость String.escapeSingleQuotes() - но не вижу этих слов в финальном коде. Не понял как это работает.

(2) вся SOQL injection профилактика заключается в перезаписи строковой переменной, содержащей пришедшие с фронта поисковые слова или что-то, в другую строковую переменную, но теперь строчка включает в себя знаки "%"? в этом вся магия?

Должно помочь:

String str = 'L\'Oreal'; //<-- get the escaped name

System.debug(str); // <--debug output: L'Oreal

String strEsc = String.escapeSingleQuotes(str); //<-- pass through escape method

System.debug(strEsc); //<-- output: L\'Oreal

String wQuotes = '\'%'+strEsc+'%\''; //<-- try to create just the like string

System.debug(wQuotes); //<--output: '%L\'Oreal%'

List<Account> accts = Database.query('Select Id FROM Account WHERE Name like \'%'+strEsc+'%\'');
//debug of SOQL statement reads: Select Id FROM Account WHERE Name like '%L\'Oreal%'

[quote](1) говорится про необходимость String.escapeSingleQuotes() - но не вижу этих слов в финальном коде. Не понял как это работает.

(2) вся SOQL injection профилактика заключается в перезаписи строковой переменной, содержащей пришедшие с фронта поисковые слова или что-то, в другую строковую переменную, но теперь строчка включает в себя знаки "%"? в этом вся магия?
[/quote]

Должно помочь:

[code]String str = 'L\'Oreal'; //<-- get the escaped name

System.debug(str); // <--debug output: L'Oreal

String strEsc = String.escapeSingleQuotes(str); //<-- pass through escape method

System.debug(strEsc); //<-- output: L\'Oreal

String wQuotes = '\'%'+strEsc+'%\''; //<-- try to create just the like string

System.debug(wQuotes);  //<--output: '%L\'Oreal%'

List<Account> accts = Database.query('Select Id FROM Account WHERE Name like \'%'+strEsc+'%\'');
//debug of SOQL statement reads: Select Id FROM Account WHERE Name like '%L\'Oreal%'[/code]

Sergey Prichepo
Тогда тебе в помощь секюріте сканер.На сколько я помню Там в отчете очень точно описывается что как можно injection.

http://security.force.com/security/tools/forcecom/scanner

ого, там в Description нужно код вставлять весь(те весь класс) или фрагмент?

я вставил один кроходный квери, отправил,
мне прислали письмо "Force.com Source Scanner job placed into queue":
lines of code: 128730 (о чем это они?)

кроме того в перечне 10 типичных ошибок качества есть пара пунктов о которых можно бы отдельные темы в форуме запилить...

[quote="Sergey Prichepo"]Тогда тебе в помощь секюріте сканер.На сколько я помню Там в отчете очень точно описывается что как можно injection.

[url]http://security.force.com/security/tools/forcecom/scanner[/url][/quote]

ого, там в Description нужно код вставлять весь(те весь класс) или фрагмент?

я вставил один кроходный квери, отправил,
мне прислали письмо "Force.com Source Scanner job placed into queue":
lines of code: 128730[i] (о чем это они?)[/i]

кроме того в перечне 10 типичных ошибок качества есть пара пунктов о которых можно бы отдельные темы в форуме запилить...

ionass
Должно помочь:

вот теперь вижу escapeSingleQuotes()

но пока так и не понятно можно ли в принципе опасаться инъекции в таком случае:

myObject = [select id from object__c where name = :nameInStringSetGetVariable];

[quote="ionass"]

Должно помочь:

[/quote]

вот теперь вижу escapeSingleQuotes()

но пока так и не понятно можно ли в принципе опасаться инъекции в таком случае:

myObject = [select id from object__c where name = [b]:nameInStringSetGetVariable[/b]];

SOQL injection работает только для динамических SOQL, когда query запрос формируется в виде строки с подмешиванием переменных пришедших извне.

Запросы вида: SELECT id FROM Contact WHERE Name = :someVar этому не подвержены. Тут можно расслабиться.

Что касается динамических Soql вот вторая ссылка в поисковике:
SOQL Injection
Тут все предельно понятно описано.

А в двух словах - при составлении запроса с участием данных пришедших от пользователя может получиться все что угодно на выходе. Знающие люди на таких моментах могут много информации из базы вытянуть.

НО! Могу успокоить - такие люди на salesforce попадаются крайне редко!!!! и кроме того salesforce все таки закрытая система, и вероятность того что на вашем орге среди пользователей попадется хакер и вас взломают крайне мала.

Тема SOQL injection больше актуальна для обычных сайтов. Где все открыто любому человеку.

SOQL injection работает только для динамических SOQL, когда query запрос формируется в виде строки с подмешиванием переменных пришедших извне.

Запросы вида: SELECT id FROM Contact WHERE Name = :someVar этому не подвержены. Тут можно расслабиться.

Что касается динамических Soql вот вторая ссылка в поисковике:
[url=https://www.salesforce.com/us/developer/docs/pages/Content/pages_security_tips_soql_injection.htm]SOQL Injection[/url]
Тут все предельно понятно описано.

А в двух словах - при составлении запроса с участием данных пришедших от пользователя может получиться все что угодно на выходе. Знающие люди на таких моментах могут много информации из базы вытянуть.

НО! Могу успокоить - такие люди на salesforce попадаются крайне редко!!!! и кроме того salesforce все таки закрытая система, и вероятность того что на вашем орге среди пользователей попадется хакер и вас взломают крайне мала. 

Тема SOQL injection больше актуальна для обычных сайтов. Где все открыто любому человеку.