コンテンツにスキップ

誤検出

IDルール重大度ファイルステータス
FP-01ApexCRUDViolationHighObjectTeamMemberTriggerHandler.cls抑制 — トリガーコンテキスト
FP-02ApexCRUDViolationHighObjectTeamMemberController.cls(TeamMemberSelector)抑制 — 意図的な設計
FP-03ApexSOQLInjectionHighObjectTeamMemberTriggerHandler.cls誤検出 — 安全なソース
FP-04ApexSOQLInjectionHighShareRecordQueueable.cls誤検出 — ホワイトリスト
FP-05ApexSOQLInjectionHighObjectTeamMemberController.cls誤検出 — 安全なソース
FP-06DebugStatementsLow複数のファイル許容可能なリスク

FP-01:ObjectTeamMemberTriggerHandlerのApexCRUDViolation

Section titled “FP-01:ObjectTeamMemberTriggerHandlerのApexCRUDViolation”
属性
ファイルObjectTeamMemberTriggerHandler.cls
クラスレベル
ルールApexCRUDViolation
重大度High
ステータス@SuppressWarningsで抑制

理由: このトリガーハンドラーはトリガーコンテキストで実行され、CRUD権限は呼び出し側のコントローラー(ObjectTeamMemberController)によってすでに検証されています。ハンドラーは、Ownerレコードの自動作成や共有レコードの管理を含むシステムレベルの操作を実行し、昇格されたアクセスが必要です。

緩和策: CRUD チェックは、DML操作がトリガーに到達する前にObjectTeamMemberControllerで実施されます。


FP-02:TeamMemberSelectorのApexCRUDViolation

Section titled “FP-02:TeamMemberSelectorのApexCRUDViolation”
属性
ファイルObjectTeamMemberController.cls
129-150(内部クラス)
ルールApexCRUDViolation
重大度High
ステータス@SuppressWarningsで抑制

理由: TeamMemberSelector内部クラスは、ユーザーがアクセスできるレコードのチームメンバーを表示できるように、意図的に「without sharing」を使用しています。これは標準のSalesforce AccountTeamMemberの動作を反映しています。

緩和策: ユーザーはすでに表示できるレコードのLWCコンポーネントを介してのみこれにアクセスできます。recordIdパラメータは、アクセス可能なレコードのUIコンテキストから取得されます。


FP-03:ObjectTeamMemberTriggerHandlerのApexSOQLInjection

Section titled “FP-03:ObjectTeamMemberTriggerHandlerのApexSOQLInjection”
属性
ファイルObjectTeamMemberTriggerHandler.cls
135、305
ルールApexSOQLInjection
重大度High
ステータス誤検出

理由: 動的SOQLで使用されるオブジェクト名は、プラットフォームメソッドId.valueOf(actualRecordId).getSObjectType().getDescribe().getName()を使用してSalesforce IDから導出されます。これはユーザーによって操作できません。

コードパターン:

String objectName = Id.valueOf(actualRecordId)
.getSObjectType().getDescribe().getName();
String query = 'SELECT OwnerId FROM '
+ String.escapeSingleQuotes(objectName)
+ ' WHERE Id = :actualRecordId';

緩和策: オブジェクト名はSalesforce IDから取得(ユーザー入力ではない)。ユーザー制御値にはバインド変数を使用。多層防御として追加のエスケープを適用。


FP-04:ShareRecordQueueableのApexSOQLInjection

Section titled “FP-04:ShareRecordQueueableのApexSOQLInjection”
属性
ファイルShareRecordQueueable.cls
138-141、163-167
ルールApexSOQLInjection
重大度High
ステータス誤検出

理由: 共有オブジェクト名は標準オブジェクトのハードコードされたホワイトリストから取得されるか、カスタムオブジェクトの決定論的パターンに従います。

ホワイトリスト:

Map<String, String> standardShareObjects = new Map<String, String>{
'Account' => 'AccountShare',
'Contact' => 'ContactShare',
'Case' => 'CaseShare',
'Lead' => 'LeadShare',
'Opportunity' => 'OpportunityShare',
'Campaign' => 'CampaignShare',
'Order' => 'OrderShare'
};

緩和策: オブジェクト名はホワイトリストに対して検証されます。カスタムオブジェクトは安全なパターン(ObjectName__c -> ObjectName__Share)に従います。すべてのユーザー制御値にはバインド変数を使用。


FP-05:ObjectTeamMemberControllerのApexSOQLInjection

Section titled “FP-05:ObjectTeamMemberControllerのApexSOQLInjection”
属性
ファイルObjectTeamMemberController.cls
89
ルールApexSOQLInjection
重大度High
ステータス誤検出

理由: FP-03と同じ。プラットフォームAPIを使用してSalesforce IDから導出されたオブジェクト名。

緩和策: Id.getSObjectType().getDescribe().getName()からのオブジェクト名。スプーフィング不可。レコードIDにはバインド変数を使用。


属性
ファイルObjectTeamMemberTriggerHandler.cls、ShareRecordQueueable.cls、ExpiredTeamMemberCleanupBatch.cls
ルールDebugStatements
重大度Low
ステータス許容可能なリスク

理由: デバッグステートメントは本番環境のトラブルシューティングのために保持されています。ERROR/WARNレベルでのみログを記録し、機密データは含まれていません。

ログに記録される内容: 例外メッセージ、レコード数、ジョブステータス情報。

緩和策: デバッグ出力はSalesforceのDebug Log設定でフィルタリングできます。PIIや認証情報はログに記録されません。

制御ステータス実装
コントローラーでのCRUDチェック実装済みisAccessible()isCreateable()isUpdateable()isDeletable()
FLS実施実装済みPermission Setsがフィールドアクセスを制御
SOQLインジェクション防止実装済みユーザー入力にはバインド変数、オブジェクト名にはホワイトリスト
共有モデル実装済みコントローラーでwith sharing、文書化された場所でのみwithout sharing
入力検証実装済みNullチェック、形式検証、ビジネスルール
XSS防止実装済みLWCフレームワークが出力エンコーディングを処理
チェック結果
HTTPコールアウトなし — パッケージは外部呼び出しを行いません
Named Credentials使用していません
External Objects使用していません
Remote Site Settings不要