開発者は、システム内に存在する ContactSearch Apex クラスのセキュリティ レビューを実行するように指示されています。開発者は、クラス内で次のメソッドをセキュリティ上の脅威として特定しました。 ist<連絡先> performSearch (String lastName} [ return Database.query('SELECT Id, FirstName, LastName FROM Contact WHERE LastName Like s'+lastName+'s'")?; 開発者がメソッドを更新して SOQL インジェクション攻撃を防ぐ 2 つの方法は何ですか? 2つの回答を選択してください
正解:A,B
Option A: Using variable binding eliminates the need for concatenating dynamic values in the query, which is the safest approach. Option B: UsingString.escapeSingleQuotesensures special characters are handled safely, reducing the risk of SOQL injection. Not Suitable: Option C: Whilewith sharingensures sharing rules are applied, it does not prevent SOQL injection. Option D: Regular expressions are not a reliable method for sanitizing input. Preventing SOQL Injection
最新のコメント (最新のコメントはトップにあります。)
正解は **A** と **B** です。
このコードは、ユーザー入力(`lastName`)を直接クエリ文字列に結合しているため、**SOQL インジェクション** の脆弱性があります。これを防ぐための標準的な対策は以下の2つです。
### 正解の解説
**A. 変数バインディングを使用し、動的クエリを静的 SOQL に置き換えます。**
これが最も推奨される方法です。
Apex の **静的 SOQL(`[SELECT ...]`)** と **バインド変数(`:変数名`)** を使用すると、Salesforce プラットフォームが自動的に入力をエスケープし、インジェクションを防いでくれます。
* **修正後のコード例:**
```apex
// %を付けた検索文字列を準備
String searchStr = '%' + lastName + '%';
// 静的SOQLとバインド変数を使用
return [SELECT Id, FirstName, LastName FROM Contact WHERE LastName LIKE :searchStr];
```
**B. パラメータを使用する前に、escapeSingleQuotes メソッドを使用してパラメータをサニタイズします。**
動的 SOQL(`Database.query`)を使い続ける必要がある場合の対策です。
SOQL インジェクションは、攻撃者がシングルクォート(`'`)を入力してクエリの構造を破壊することで発生します。**`String.escapeSingleQuotes()`** メソッドを使用すると、入力内のシングルクォートがエスケープ(無効化)され、単なる文字列として扱われるようになります。
* **修正後のコード例:**
```apex
// 入力をサニタイズ(無害化)
String sanitizedLastName = String.escapeSingleQuotes(lastName);
// サニタイズされた値を使用
return Database.query('SELECT Id, FirstName, LastName FROM Contact WHERE LastName LIKE \'%' + sanitizedLastName + '%\'');
```
-----
### 不正解の解説
**C. クラスで Readonly アノテーションと with sharing キーワードを使用します。**
* `@ReadOnly`: クエリで取得できるレコード数の上限を緩和するもので、セキュリティ対策ではありません。
* `with sharing`: ユーザーの「レコード共有権限(見えるかどうか)」を適用するものですが、「どのようなクエリが実行されるか(インジェクション)」を防ぐことはできません。
**D. パラメータに正規表現を使用して特殊文字を削除します。**
* 独自の正規表現でフィルタリングを行うのは、実装漏れのリスクがあり、推奨...