Привет!
Я начинающий разработчик под Sf и меня интересует, собственно, сабж.
Например, есть у меня
update item;
if(Schema.SObjectType.Attachment.fields.Name.isUpdateable()) {
update item;
}
Но есть случаи, когда нужно проверять не одно поле, а 5 полей. Тогда условие if с обычной проверкой разрастается до 5 проверок через &&.
Я написал метод, который получает на вход название класса обьекта и поля которые нужно проверить и делает эту проверку в цикле, что позволяет не мусорить в коде кучей проверок.
...
public static boolean isUpdateable(String objectName, String[] fieldsArr)
{
Schema.SObjectType typeObject = convertToSObjectType(objectName);
Map<String,Schema.SObjectField> m = typeObject.getDescribe().fields.getMap();for (String fieldToCheck : fieldsArr) {
if (!m.get(addNamespace(fieldToCheck)).getDescribe().isUpdateable()) {
throwMessage(objectName, fieldToCheck);
return false;
}}
return true;
}
...
Вызывается теперь проверка вот так
if(CheckPermissions.isUpdateable('Attachment', new String[] {'Name'})) {
update item;
}
Но в данном случает security scanner говорит
Object: name in file: /classes/FAttachment.cls
L 32: item.Name = newName;
Object: item in file: /classes/FAttachment.cls
L 34: update item;
Почему он может не видеть проверки?
Привет! Я начинающий разработчик под Sf и меня интересует, собственно, сабж. Например, есть у меня [code]update item;[/code] Если я перед его выполнением делаю проверку (далее - обычная проверка) [code] if(Schema.SObjectType.Attachment.fields.Name.isUpdateable()) { update item; } [/code] То Security Scanner не ругает. Но есть случаи, когда нужно проверять не одно поле, а 5 полей. Тогда условие if с обычной проверкой разрастается до 5 проверок через &&. Я написал метод, который получает на вход название класса обьекта и поля которые нужно проверить и делает эту проверку в цикле, что позволяет не мусорить в коде кучей проверок. [code] ... public static boolean isUpdateable(String objectName, String[] fieldsArr) { Schema.SObjectType typeObject = convertToSObjectType(objectName); Map<String,Schema.SObjectField> m = typeObject.getDescribe().fields.getMap(); for (String fieldToCheck : fieldsArr) { if (!m.get(addNamespace(fieldToCheck)).getDescribe().isUpdateable()) { throwMessage(objectName, fieldToCheck); return false; } } return true; } ... [/code] Вызывается теперь проверка вот так [code] if(CheckPermissions.isUpdateable('Attachment', new String[] {'Name'})) { update item; } [/code] Но в данном случает security scanner говорит [quote] FLS Update result path 1: Object: name in file: /classes/FAttachment.cls L 32: item.Name = newName; Object: item in file: /classes/FAttachment.cls L 34: update item; [/quote] Почему он может не видеть проверки?
Есть такая проблема у Сканера. Он всего лишь сканер, а не искусственный интеллект - если ты динамически проверяешь права доступа, то он может это не понять.
Попробуй посмотри как реализована проверка вот здесь
https://github.com/CodeScience/CSUtils/wiki/Using-Security-Coding-Library-(ESAPI)
Вроде с этой либой проверка проходит (хотя не уверен). Но если проверка сканером и не сработает, то на "человеческом" ревью все будет ок.
Есть такая проблема у Сканера. Он всего лишь сканер, а не искусственный интеллект - если ты динамически проверяешь права доступа, то он может это не понять. Попробуй посмотри как реализована проверка вот здесь https://github.com/CodeScience/CSUtils/wiki/Using-Security-Coding-Library-(ESAPI) Вроде с этой либой проверка проходит (хотя не уверен). Но если проверка сканером и не сработает, то на "человеческом" ревью все будет ок.