[Salesforce]Force.com Security Source Scanner の誤検知

2017年1月25日水曜日

Apex Salesforce

ソースコードのセキュリティをチェックすることができる、Force.com Security Source Scanner というサイトを利用してみました。

今回スキャンしたのは、以下のようにApexでレコードのdeleteをしているものを含むソースです。

【レコードをdeleteするApexコード】
  1. List<ScanTest__c> scanTestList = [SELECT Id, Name FROM ScanTest__c];
  2. delete scanTestList;

すると、delete文に対して以下のようなエラーが出ました。


Query: CRUD Delete

This query looks for Delete operations that are performed without checking for isDeletable(). This may be a false positive if your code accesses only objects whose security is managed by your app and not the admin (for example OAuth states). It may also be a false positive if checks are performed outside of the dataflow (automatically in a visualforce inputfield tag or manually in a constructor), or if this is an enterprise object or other object whose permissions are not set by the admin.

References:https://developer.salesforce.com/page/Testing_CRUD_and_FLS_Enforcement
https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_perms_enforcing.htm


ユーザーの権限によっては削除できないレコードがあるので、deleteの前にisDeletable()でそのユーザーがオブジェクトを削除できるかどうかチェックを行いなさい、というものみたいです。
なので、deleteする前にisDeletable()で判定を行うようにソースを書き換えました。

【isDeletable()の判定を入れたApexコード】
  1. if(Schema.sObjectType.ContentDocument.isDeletable()) {
  2. List<ScanTest__c> scanTestList = [SELECT Id, Name FROM ScanTest__c];
  3. delete scanTestList;
  4. } else {
  5. ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR,
  6. 'この項目を削除する権限がありません。'));
  7. }

しかし、上記のようにソースを書き直して再スキャンしても、同じところで引っかかってしまいました。

基本的には、スキャンで指摘されたところを修正していれば再度引っかかることはありません。
例えば、ループ内にSOQLを入れていたものをスキャンして、その後SOQLをループの外に出すと再スキャン時には引っかからなくなります。なので、このdeleteのエラーに関しては、スキャナー側の不具合で修正しても引っかかってしまうのだと思います。

修正をしてこのエラーが残っていても、セキュリティレビュー時に誤検知として報告すれば問題ないので大丈夫です。