更にSalesforceのApex クラスをスキャンしてみる

やっとのことで、Snyk　CLIを使ってローカルに保存したApex Classのコードをスキャンすることができました...


+ [Snyk（スニーク）って、Salesforceでも使えるの？（前編）](https://qiita.com/Keiji_otsubo/items/def64ad9e061897c6cc2)
+ [Snyk（スニーク）って、Salesforceでも使えるの？（中編）](https://qiita.com/Keiji_otsubo/items/0383ff68b44f451c75da)
+ [Snyk（スニーク）って、Salesforceでも使えるの？（後編）](https://qiita.com/Keiji_otsubo/items/5e2ade6a1c3e91634866)


フリープランの制限を見ているとまだスキャンできそうなので、どんな結果が返ってくるかを調べてみたいと思います。

[Snyk デベロッパーセキュリティツール 料金プラン](https://snyk.io/jp/plans/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2896829d-e2e3-46bf-79c8-01693e89c269.png)

やっと、現在のスキャン回数が分かった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/75faa30b-e748-0a9a-cd43-0ba543fd9969.png)


# では初めてみます。

まずは認証からです。


```
./snyk auth

略

Your account has been authenticated. Snyk is now ready to be used.
```

準備できました。Apex Classをテキストファイルにコピーします。拡張子はclsです。


```
./snyk code test --org=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

Testing C:\Users\user\Desktop\snyk ...

 ✗ [High] Server-Side Request Forgery (SSRF)
   Path: fkd_freee.cls, line 252
   Info: Unsanitized input from a SOQL statement flows into setendpoint, where it is used as an URL to perform a request. This may result in a Server-Side Request Forgery vulnerability.


✔ Test completed

Organization:      a3bd617b-f350-4a80-a2a2-abbe685121b0
Test type:         Static code analysis
Project path:      C:\Users\user\Desktop\snyk

Summary:

  1 Code issues found
  1 [High]
```

おおお、エラーになった。

Unsanitized input from a SOQL statement flows into setendpoint, where it is used as an URL to perform a request. This may result in a Server-Side Request Forgery vulnerability.

SOQL ステートメントからのサニタイズされていない入力は setendpoint に流れ、そこでリクエストを実行するための URL として使用されます。これにより、サーバー側のリクエスト フォージェリの脆弱性が発生する可能性があります。

ちょうどこの部分だけど、何が問題なんだろう？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8e139c6c-05d8-6043-2eae-f72d33100a80.png)

同じような質問がありますが、回答を読んでも解決策は分からないですね。

+ [Security scan is complaining on setEndpoing](https://salesforce.stackexchange.com/questions/404072/security-scan-is-complaining-on-setendpoing)

他にもreq.setEndpoint(path + '?' + parameters);を使ったメソッドはあるのですが、こちらはエラーになってない。違いは直前にレコードタイプを検索するSOQLがあることくらいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/24906ec7-0aa8-fd6e-8c2a-f43bb388afc0.png)


画面からの入力された値は使っていないんですがね。SOQLとsetEndpointの組み合わせに反応しているんでしょうか？
バインド変数とかを使う必要があるのかな？

```
        sobject[] recordTypeList = [select Id, Name from RecordType WHERE Name = '得意先' ];
        if (acc.RecordTypeId == recordTypeList[0].Id ){
            parameters += 'keyword=' + EncodingUtil.urlEncode(acc.customer_code__c, 'UTF-8');
        } else {
            parameters += 'keyword=' + EncodingUtil.urlEncode(acc.supplier_code__c, 'UTF-8');
        }        
        HttpRequest req = new HttpRequest();
        req.setEndpoint(path + '?' + parameters);
```

この部分は取引先オブジェクトのレコードタイプで得意先と仕入先を別けています。それぞれコードを持っているのでレコードタイプを見てどちらかを判断しています。両方入っていることはないので、レコードタイプでの検索を止めて、acc.supplier_code__cがブランクなら得意先コード、そうでないなら仕入先コードをセットするように変えてみます。


以下のように変更してSOQLを完全になくしたのですが、同じエラーになりますね。よくわからん。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/eac4b429-7ebb-dda7-1954-736e85b49bff.png)

```
Testing C:\Users\user\Desktop\snyk ...

 ✗ [High] Server-Side Request Forgery (SSRF)
   Path: fkd_freee.cls, line 252
   Info: Unsanitized input from a SOQL statement flows into setendpoint, where it is used as an URL to perform a request. This may result in a Server-Side Request Forgery vulnerability.


✔ Test completed

Organization:      a3bd617b-f350-4a80-a2a2-abbe685121b0
Test type:         Static code analysis
Project path:      C:\Users\user\Desktop\snyk

Summary:

  1 Code issues found
  1 [High]
```

ソースコードを移動させたら、ターゲットのソースがないってエラーになるかと思ったのですが、同じエラーメッセージが出続けますね。どこかに覚えているのかな？

使い方がはやり分かってないです。マニュアルをちゃんと読まないといけないみたいですね。

# 2023/12/23 追記

PCを再起動して同じようにチェックしてみました。ソースコードは変更されているのですが、同じエラーメッセージです。　う~ん、使い方が分からない。どうも私には難しすぎて活用できないようです。残念...