Еще раз внимательно прочитал нижнюю часть вот этой статьи в блоге:
остались вопросы:
(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.
Тогда тебе в помощь секюріте сканер.На сколько я помню Там в отчете очень точно описывается что как можно injection. [url]http://security.force.com/security/tools/forcecom/scanner[/url]
Должно помочь:
String str = 'L\'Oreal'; //<-- get the escaped nameSystem.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]
ого, там в 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 типичных ошибок качества есть пара пунктов о которых можно бы отдельные темы в форуме запилить...
вот теперь вижу 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 больше актуальна для обычных сайтов. Где все открыто любому человеку.