Aller au contenu

Faux positifs

IDRègleGravitéFichierStatut
FP-01ApexCRUDViolationHighObjectTeamMemberTriggerHandler.clsSupprimé — Contexte de déclencheur
FP-02ApexCRUDViolationHighObjectTeamMemberController.cls (TeamMemberSelector)Supprimé — Conception intentionnelle
FP-03ApexSOQLInjectionHighObjectTeamMemberTriggerHandler.clsFaux positif — Source sûre
FP-04ApexSOQLInjectionHighShareRecordQueueable.clsFaux positif — Liste blanche
FP-05ApexSOQLInjectionHighObjectTeamMemberController.clsFaux positif — Source sûre
FP-06DebugStatementsLowPlusieurs fichiersRisque accepté

FP-01 : ApexCRUDViolation dans ObjectTeamMemberTriggerHandler

Section intitulée « FP-01 : ApexCRUDViolation dans ObjectTeamMemberTriggerHandler »
AttributValeur
FichierObjectTeamMemberTriggerHandler.cls
LigneNiveau classe
RègleApexCRUDViolation
GravitéHigh
StatutSupprimé avec @SuppressWarnings

Raison : Ce gestionnaire de déclencheur s’exécute dans le contexte du déclencheur où les permissions CRUD ont déjà été validées par le contrôleur appelant (ObjectTeamMemberController). Le gestionnaire effectue des opérations au niveau système, y compris la création automatique d’enregistrements Owner et la gestion des enregistrements de partage, qui nécessitent un accès élevé.

Atténuation : Les vérifications CRUD sont appliquées dans ObjectTeamMemberController avant que toute opération DML n’atteigne le déclencheur.


AttributValeur
FichierObjectTeamMemberController.cls
Ligne129-150 (classe interne)
RègleApexCRUDViolation
GravitéHigh
StatutSupprimé avec @SuppressWarnings

Raison : La classe interne TeamMemberSelector utilise intentionnellement “without sharing” pour permettre aux utilisateurs de voir les membres d’équipe sur les enregistrements auxquels ils ont accès. Cela reflète le comportement standard de Salesforce AccountTeamMember.

Atténuation : Les utilisateurs ne peuvent accéder à cela que via les composants LWC sur les enregistrements qu’ils peuvent déjà voir. Le paramètre recordId provient du contexte UI d’un enregistrement accessible.


FP-03 : ApexSOQLInjection dans ObjectTeamMemberTriggerHandler

Section intitulée « FP-03 : ApexSOQLInjection dans ObjectTeamMemberTriggerHandler »
AttributValeur
FichierObjectTeamMemberTriggerHandler.cls
Lignes135, 305
RègleApexSOQLInjection
GravitéHigh
StatutFaux positif

Raison : Le nom d’objet utilisé dans SOQL dynamique est dérivé d’un ID Salesforce en utilisant la méthode de plateforme Id.valueOf(actualRecordId).getSObjectType().getDescribe().getName(). Cela ne peut pas être manipulé par les utilisateurs.

Modèle de code :

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

Atténuation : Le nom d’objet provient de l’ID Salesforce (pas d’entrée utilisateur). Variables liées utilisées pour les valeurs contrôlées par l’utilisateur. Échappement supplémentaire appliqué comme défense en profondeur.


FP-04 : ApexSOQLInjection dans ShareRecordQueueable

Section intitulée « FP-04 : ApexSOQLInjection dans ShareRecordQueueable »
AttributValeur
FichierShareRecordQueueable.cls
Lignes138-141, 163-167
RègleApexSOQLInjection
GravitéHigh
StatutFaux positif

Raison : Les noms d’objets de partage proviennent d’une liste blanche codée en dur d’objets standard ou suivent un modèle déterministe pour les objets personnalisés.

Liste blanche :

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

Atténuation : Noms d’objets validés par rapport à la liste blanche. Les objets personnalisés suivent un modèle sûr (ObjectName__c -> ObjectName__Share). Variables liées utilisées pour toutes les valeurs contrôlées par l’utilisateur.


FP-05 : ApexSOQLInjection dans ObjectTeamMemberController

Section intitulée « FP-05 : ApexSOQLInjection dans ObjectTeamMemberController »
AttributValeur
FichierObjectTeamMemberController.cls
Ligne89
RègleApexSOQLInjection
GravitéHigh
StatutFaux positif

Raison : Identique à FP-03. Nom d’objet dérivé de l’ID Salesforce en utilisant l’API de plateforme.

Atténuation : Nom d’objet depuis Id.getSObjectType().getDescribe().getName(). Ne peut pas être falsifié. Variable liée utilisée pour l’ID d’enregistrement.


AttributValeur
FichiersObjectTeamMemberTriggerHandler.cls, ShareRecordQueueable.cls, ExpiredTeamMemberCleanupBatch.cls
RègleDebugStatements
GravitéLow
StatutRisque accepté

Raison : Les instructions de débogage sont conservées pour le dépannage en production. Elles ne journalisent qu’aux niveaux ERROR/WARN et ne contiennent aucune donnée sensible.

Contenu journalisé : Messages d’exception, comptages d’enregistrements, informations sur l’état des tâches.

Atténuation : La sortie de débogage peut être filtrée via les paramètres Debug Log de Salesforce. Aucune PII ou identifiant journalisé.

ContrôleStatutImplémentation
Vérifications CRUD dans les contrôleursImplémentéisAccessible(), isCreateable(), isUpdateable(), isDeletable()
Application FLSImplémentéLes ensembles de permissions contrôlent l’accès aux champs
Prévention de l’injection SOQLImplémentéVariables liées pour l’entrée utilisateur, liste blanche pour les noms d’objets
Modèle de partageImplémentéwith sharing sur les contrôleurs, without sharing uniquement là où documenté
Validation des entréesImplémentéVérifications null, validation de format, règles métier
Prévention XSSImplémentéLe framework LWC gère l’encodage de sortie
VérificationRésultat
HTTP CalloutsAucun — le package ne fait aucun appel externe
Named CredentialsNon utilisé
External ObjectsNon utilisé
Remote Site SettingsNon requis