Хотел бы собрать во едино список, где бы отражалось то, что не стоит делать, да бы не ругался Security scanner:
- Не оставлять в коде System.debug (что бы потом пользователи случайно не увидели не нужную для них инфу в дебаге)
- Выставлять LIMITS на запросы
- SOQL SOSL Injection (защититься от них)
- Sharing - верное проставлены
- Multiple triggers on same sObject
- Bulkify Apex Methods - Using Collections in methods
- Добавлять Asserts в тест методах
- покрытие тест методами выше 75%
Поделитесь пожайлуйста другими вариациями того, что надо заранее учесть, что бы не ругался Security scanner. И еще Будет просьба пояснить кто его делает и когда.
В общем хотелось бы побольше информации что бы на эту тему аккамулировалось тут.
+ интересует платность и бесплатность этого процесса
Хотел бы собрать во едино список, где бы отражалось то, что не стоит делать, да бы не ругался Security scanner: - Не оставлять в коде System.debug (что бы потом пользователи случайно не увидели не нужную для них инфу в дебаге) - Выставлять LIMITS на запросы - SOQL SOSL Injection (защититься от них) - Sharing - верное проставлены - Multiple triggers on same sObject - Bulkify Apex Methods - Using Collections in methods - Добавлять Asserts в тест методах - покрытие тест методами выше 75% Поделитесь пожайлуйста другими вариациями того, что надо заранее учесть, что бы не ругался Security scanner. И еще Будет просьба пояснить кто его делает и когда. В общем хотелось бы побольше информации что бы на эту тему аккамулировалось тут. + интересует платность и бесплатность этого процесса
Спасибо за подборку, но вот что смутило
Еще хочу добавить:
- если есть интеграция, то в Remote Site только https
- если хранятся пароли от внешних сервисов, то хранить только в private custom labels (или encripted custom fields, про это не уверен) чтобы только пакет имел доступ к этому полю.
Самое зло забыл - SOQL in Loop
настройки Sharing слишком обобщенно - наверное это больше проблема пакета, сканер тут не заругается.
На что точно ругаются - если перед DML операцией нет проверки на GRUD и FLS!!!
Спасибо за подборку, но вот что смутило :) [quote="Roman Bazylev"]то, что не стоит делать, да бы не ругался Security scanner:[/quote] так стоит или не стоит? По списку не совсем понятно :) Еще хочу добавить: - если есть интеграция, то в Remote Site только https - если хранятся пароли от внешних сервисов, то хранить только в private custom labels (или encripted custom fields, про это не уверен) чтобы только пакет имел доступ к этому полю. Самое зло забыл - SOQL in Loop [quote="Roman Bazylev"]Не оставлять в коде System.debug (что бы потом пользователи случайно не увидели не нужную для них инфу в дебаге) [/quote] это не страшно. Вывод из пакета отладочной информации не происходит настройки Sharing слишком обобщенно - наверное это больше проблема пакета, сканер тут не заругается. На что точно ругаются - если перед DML операцией нет проверки на GRUD и FLS!!!
[quote="Roman Bazylev"]- Добавлять Asserts в тест методах [/quote] И вот это самое интересное!!! не просто добавлять system.assert(true, true) :) (привет все кто так делает) А с умом делать эти проверки для проверки, а не чтобы было!
Если не ошибаюсь то можно запустить сканер вот с етого сайта.
Процес бесплатен, но сканер можно кажись запускать только раз в сутки(хотя не уверен). Примерно через час, полтора приходить на почту pdf и xml отчет.
Вот еще в коде нельзя использовать harcode id, ну ето впринципе и так понятно.
Вот только сканер, как мне показалось не совсем коректно обработал некоторие моменти: например я в тестах использую методи-хелпери, так сканер заругался, что мол в хелп-методах нет ассертов. Пришлось писать
System.assert(true, 'for security scanner');
Если не ошибаюсь то можно запустить сканер вот с етого сайта. [url=http://security.force.com/security/tools/forcecom/scanner]Security Scanner[/url] Процес бесплатен, но сканер можно кажись запускать только раз в сутки(хотя не уверен). Примерно через час, полтора приходить на почту pdf и xml отчет. Вот еще в коде нельзя использовать harcode id, ну ето впринципе и так понятно. Вот только сканер, как мне показалось не совсем коректно обработал некоторие моменти: например я в тестах использую методи-хелпери, так сканер заругался, что мол в хелп-методах нет ассертов. Пришлось писать [code]System.assert(true, 'for security scanner'); [/code]
Вопрос: а как например сделать "SELECT COUNT()"?
Вот сканнер заругался что мол нужно лимит указать.
Сделал через Database.countQuery но потом сканер не запускал.
Вопрос: а как например сделать "SELECT COUNT()"? Вот сканнер заругался что мол нужно лимит указать. Сделал через Database.countQuery но потом сканер не запускал.
[quote="Alex Tsitsura"]Вопрос: а как например сделать "SELECT COUNT()"? Вот сканнер заругался что мол нужно лимит указать. Сделал через Database.countQuery но потом сканер не запускал.[/quote] В любом случае есть лимит на soql query rows (50k и 10k), его то нужно и ставить.
[quote="Дима Лисовский"]В любом случае есть лимит на soql query rows (50k и 10k), его то нужно и ставить.[/quote] Давно хотел эту тему поднять :). [url=https://salesforce-developer.ru/forum/topic-select-count]Поднял[/url] :)
[quote="Dmitry Shnyrev"]Спасибо за подборку, но вот что смутило :) [quote="Roman Bazylev"]то, что не стоит делать, да бы не ругался Security scanner:[/quote] так стоит или не стоит? По списку не совсем понятно :) Еще хочу добавить: - если есть интеграция, то в Remote Site только https - если хранятся пароли от внешних сервисов, то хранить только в private custom labels (или encripted custom fields, про это не уверен) чтобы только пакет имел доступ к этому полю. Самое зло забыл - SOQL in Loop [quote="Roman Bazylev"]Не оставлять в коде System.debug (что бы потом пользователи случайно не увидели не нужную для них инфу в дебаге) [/quote] это не страшно. Вывод из пакета отладочной информации не происходит настройки Sharing слишком обобщенно - наверное это больше проблема пакета, сканер тут не заругается. На что точно ругаются - если перед DML операцией нет проверки на GRUD и FLS!!![/quote] За запросы в циклах надо сразу расстреливать и отправлять писать калькулятор
На что точно ругаются - если перед DML операцией нет проверки на CRUD и FLS!!!
Я же правильно понимаю, что нужно перед каждым DML проверять есть ли в нас доступ?
public PageReference Save() {
// Enforcing CRUD
if (!Accont.sObjectType.getDescribe().isUpdateable()){
// TODO: Insufficient access
return null;
}// Enforcing FLS
if (!Accont.sObjectType.Contact.fields.Site.isUpdateable()){
// TODO: Insufficient access
return null;
}
Account.Site = 'Bla bla bla';
update account;
return null;
}
Просто никогда этого не делал, и scanner не ругался.
А перед SOQL получается нужно проверять FLS?
public String Save() {
if (!Accont.sObjectType.Contact.fields.Name.isAccessible()){
// TODO: Insufficient access
return null;
}Account[] account = [SELECT Id, Name FROM Account WHERE Id = :acc.Id];
if (!account.isEmpty) {
return account[0].Name;
} else {
// TODO: ???
}return null;
}
[quote="Dmitry Shnyrev"]На что точно ругаются - если перед DML операцией нет проверки на CRUD и FLS!!![/quote] Я же правильно понимаю, что нужно перед каждым DML проверять есть ли в нас доступ? [code] public PageReference Save() { // Enforcing CRUD if (!Accont.sObjectType.getDescribe().isUpdateable()){ // TODO: Insufficient access return null; } // Enforcing FLS if (!Accont.sObjectType.Contact.fields.Site.isUpdateable()){ // TODO: Insufficient access return null; } Account.Site = 'Bla bla bla'; update account; return null; } [/code] Просто никогда этого не делал, и scanner не ругался. А перед SOQL получается нужно проверять FLS? [code] public String Save() { if (!Accont.sObjectType.Contact.fields.Name.isAccessible()){ // TODO: Insufficient access return null; } Account[] account = [SELECT Id, Name FROM Account WHERE Id = :acc.Id]; if (!account.isEmpty) { return account[0].Name; } else { // TODO: ??? } return null; } [/code]
Я же правильно понимаю, что нужно перед каждым DML проверять есть ли в нас доступ?
Вот старая добрая стать на эту тему.
Enforcing CRUD and FLS
Вот еще что-то google мне выдал из свежего. Может что интересное там есть?
New Security Review Rule for enforcing FLS and CRUD Checks in Custom Controllers
[quote="Alex Tsitsura"]Я же правильно понимаю, что нужно перед каждым DML проверять есть ли в нас доступ? [/quote] Правильно понимаешь :) Вот старая добрая стать на эту тему. [url=https://developer.salesforce.com/page/Enforcing_CRUD_and_FLS]Enforcing CRUD and FLS[/url] Вот еще что-то google мне выдал из свежего. Может что интересное там есть? [url=https://developer.salesforce.com/forums/ForumsMain?id=906F00000009JFXIA2]New Security Review Rule for enforcing FLS and CRUD Checks in Custom Controllers[/url]
Просто никогда этого не делал, и scanner не ругался.
А перед SOQL получается нужно проверять FLS?
Смысл в проверке перед DML операцией - предотвратить exception и правильно отреагировать на ограничение прав доступа.
[quote="Alex Tsitsura"]Просто никогда этого не делал, и scanner не ругался.[/quote] Вот это странно :) [quote="Alex Tsitsura"]А перед SOQL получается нужно проверять FLS? [/quote] Перед SOQL не надо ничего проверять, SOQL сам работает в соответствии с FLS - просто не вернет тебе данные, которые ты не должен видеть. Смысл в проверке перед DML операцией - предотвратить exception и правильно отреагировать на ограничение прав доступа.