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

CRUD and FLS - как вы проверяете?

Привет!

Я начинающий разработчик под Sf и меня интересует, собственно, сабж.

Например, есть у меня


update item;

Если я перед его выполнением делаю проверку (далее - обычная проверка)
if(Schema.SObjectType.Attachment.fields.Name.isUpdateable()) { 
update item;
}

То Security Scanner не ругает.

Но есть случаи, когда нужно проверять не одно поле, а 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 говорит

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;

Почему он может не видеть проверки?

Привет!

Я начинающий разработчик под 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)

Вроде с этой либой проверка проходит (хотя не уверен). Но если проверка сканером и не сработает, то на "человеческом" ревью все будет ок.