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

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. И еще Будет просьба пояснить кто его делает и когда.
В общем хотелось бы побольше информации что бы на эту тему аккамулировалось тут.

+ интересует платность и бесплатность этого процесса

Хотел бы собрать во едино список, где бы отражалось то, что не стоит делать, да бы не ругался 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. И еще Будет просьба пояснить кто его делает и когда.
В общем хотелось бы побольше информации что бы на эту тему аккамулировалось тут. 

+ интересует платность и бесплатность этого процесса

Спасибо за подборку, но вот что смутило

Roman Bazylev
то, что не стоит делать, да бы не ругался Security scanner:

так стоит или не стоит? По списку не совсем понятно

Еще хочу добавить:
- если есть интеграция, то в Remote Site только https
- если хранятся пароли от внешних сервисов, то хранить только в private custom labels (или encripted custom fields, про это не уверен) чтобы только пакет имел доступ к этому полю.

Самое зло забыл - SOQL in Loop

Roman Bazylev
Не оставлять в коде System.debug (что бы потом пользователи случайно не увидели не нужную для них инфу в дебаге)

это не страшно. Вывод из пакета отладочной информации не происходит

настройки 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!!!

Roman Bazylev
- Добавлять Asserts в тест методах

И вот это самое интересное!!!
не просто добавлять system.assert(true, true) (привет все кто так делает)
А с умом делать эти проверки для проверки, а не чтобы было!

[quote="Roman Bazylev"]- Добавлять Asserts в тест методах [/quote]
И вот это самое интересное!!! 
не просто добавлять system.assert(true, true) :) (привет все кто так делает)
А с умом делать эти проверки для проверки, а не чтобы было!

Если не ошибаюсь то можно запустить сканер вот с етого сайта.


Security Scanner


Процес бесплатен, но сканер можно кажись запускать только раз в сутки(хотя не уверен). Примерно через час, полтора приходить на почту 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 но потом сканер не запускал.  

Alex Tsitsura
Вопрос: а как например сделать "SELECT COUNT()"?

Вот сканнер заругался что мол нужно лимит указать.

Сделал через Database.countQuery но потом сканер не запускал.


В любом случае есть лимит на soql query rows (50k и 10k), его то нужно и ставить.

[quote="Alex Tsitsura"]Вопрос: а как например сделать "SELECT COUNT()"? 

Вот сканнер заругался что мол нужно лимит указать. 

Сделал через Database.countQuery но потом сканер не запускал.[/quote]
В любом случае есть лимит на soql query rows (50k и 10k), его то нужно и ставить. 

Дима Лисовский
В любом случае есть лимит на soql query rows (50k и 10k), его то нужно и ставить.

Давно хотел эту тему поднять :). Поднял

[quote="Дима Лисовский"]В любом случае есть лимит на soql query rows (50k и 10k), его то нужно и ставить.[/quote]
Давно хотел эту тему поднять :). [url=https://salesforce-developer.ru/forum/topic-select-count]Поднял[/url] :) 

Dmitry Shnyrev
Спасибо за подборку, но вот что смутило
Roman Bazylev
то, что не стоит делать, да бы не ругался Security scanner:

так стоит или не стоит? По списку не совсем понятно

Еще хочу добавить:
- если есть интеграция, то в Remote Site только https
- если хранятся пароли от внешних сервисов, то хранить только в private custom labels (или encripted custom fields, про это не уверен) чтобы только пакет имел доступ к этому полю.

Самое зло забыл - SOQL in Loop

Roman Bazylev
Не оставлять в коде System.debug (что бы потом пользователи случайно не увидели не нужную для них инфу в дебаге)

это не страшно. Вывод из пакета отладочной информации не происходит

настройки Sharing слишком обобщенно - наверное это больше проблема пакета, сканер тут не заругается.

На что точно ругаются - если перед DML операцией нет проверки на GRUD и FLS!!!


За запросы в циклах надо сразу расстреливать и отправлять писать калькулятор

[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]
За запросы в циклах надо сразу расстреливать и отправлять писать калькулятор

Dmitry Shnyrev
На что точно ругаются - если перед 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]

Alex Tsitsura
Я же правильно понимаю, что нужно перед каждым 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]

Alex Tsitsura
Просто никогда этого не делал, и scanner не ругался.

Вот это странно

Alex Tsitsura
А перед SOQL получается нужно проверять FLS?

Перед SOQL не надо ничего проверять, SOQL сам работает в соответствии с FLS - просто не вернет тебе данные, которые ты не должен видеть.

Смысл в проверке перед DML операцией - предотвратить exception и правильно отреагировать на ограничение прав доступа.

[quote="Alex Tsitsura"]Просто никогда этого не делал, и scanner не ругался.[/quote]
Вот это странно :)

[quote="Alex Tsitsura"]А перед SOQL получается нужно проверять FLS? [/quote]
Перед SOQL не надо ничего проверять, SOQL сам работает в соответствии с FLS - просто не вернет тебе данные, которые ты не должен видеть.

Смысл в проверке перед DML операцией - предотвратить exception и правильно отреагировать на ограничение прав доступа.