Przejdź do głównej zawartości

Fałszywe alarmy

IDRegułaWagaPlikStatus
FP-01ApexCRUDViolationHighObjectTeamMemberTriggerHandler.clsWyciszony — kontekst triggera
FP-02ApexCRUDViolationHighObjectTeamMemberController.cls (TeamMemberSelector)Wyciszony — zamierzony projekt
FP-03ApexSOQLInjectionHighObjectTeamMemberTriggerHandler.clsFałszywy alarm — bezpieczne źródło
FP-04ApexSOQLInjectionHighShareRecordQueueable.clsFałszywy alarm — whitelist
FP-05ApexSOQLInjectionHighObjectTeamMemberController.clsFałszywy alarm — bezpieczne źródło
FP-06DebugStatementsLowWiele plikówZaakceptowane ryzyko

FP-01: ApexCRUDViolation w ObjectTeamMemberTriggerHandler

Dział zatytułowany „FP-01: ApexCRUDViolation w ObjectTeamMemberTriggerHandler”
AtrybutWartość
PlikObjectTeamMemberTriggerHandler.cls
LiniaPoziom klasy
RegułaApexCRUDViolation
WagaHigh
StatusWyciszony za pomocą @SuppressWarnings

Powód: ten handler triggera działa w kontekście triggera, gdzie uprawnienia CRUD zostały już zwalidowane przez wywołujący kontroler (ObjectTeamMemberController). Handler wykonuje operacje na poziomie systemu, w tym automatyczne tworzenie rekordów Owner i zarządzanie rekordami udostępnień, co wymaga podwyższonego dostępu.

Środki zaradcze: sprawdzenia CRUD są egzekwowane w ObjectTeamMemberController przed osiągnięciem triggera przez jakąkolwiek operację DML.


AtrybutWartość
PlikObjectTeamMemberController.cls
Linia129-150 (klasa wewnętrzna)
RegułaApexCRUDViolation
WagaHigh
StatusWyciszony za pomocą @SuppressWarnings

Powód: klasa wewnętrzna TeamMemberSelector celowo używa “without sharing”, aby umożliwić użytkownikom przeglądanie członków zespołu w rekordach, do których mają dostęp. Odzwierciedla to standardowe zachowanie Salesforce AccountTeamMember.

Środki zaradcze: użytkownicy mogą uzyskać dostęp do tego tylko za pośrednictwem komponentów LWC w rekordach, które mogą już przeglądać. Parametr recordId pochodzi z kontekstu UI dostępnego rekordu.


FP-03: ApexSOQLInjection w ObjectTeamMemberTriggerHandler

Dział zatytułowany „FP-03: ApexSOQLInjection w ObjectTeamMemberTriggerHandler”
AtrybutWartość
PlikObjectTeamMemberTriggerHandler.cls
Linie135, 305
RegułaApexSOQLInjection
WagaHigh
StatusFałszywy alarm

Powód: nazwa obiektu używana w dynamicznym SOQL jest wyprowadzana z ID Salesforce za pomocą metody platformowej Id.valueOf(actualRecordId).getSObjectType().getDescribe().getName(). Nie może być manipulowana przez użytkowników.

Wzorzec kodu:

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

Środki zaradcze: nazwa obiektu pochodzi z ID Salesforce (nie danych wejściowych użytkownika). Bind variables używane dla wartości kontrolowanych przez użytkownika. Dodatkowe oczyszczanie zastosowane jako obrona w głąb.


AtrybutWartość
PlikShareRecordQueueable.cls
Linie138-141, 163-167
RegułaApexSOQLInjection
WagaHigh
StatusFałszywy alarm

Powód: nazwy obiektów udostępnień pochodzą z zakodowanej listy dozwolonych obiektów standardowych lub podlegają deterministycznemu wzorcowi dla obiektów niestandardowych.

Whitelist:

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

Środki zaradcze: nazwy obiektów walidowane na podstawie whitelisty. Obiekty niestandardowe podlegają bezpiecznemu wzorcowi (ObjectName__c -> ObjectName__Share). Bind variables używane dla wszystkich wartości kontrolowanych przez użytkownika.


AtrybutWartość
PlikObjectTeamMemberController.cls
Linia89
RegułaApexSOQLInjection
WagaHigh
StatusFałszywy alarm

Powód: tak samo jak FP-03. Nazwa obiektu wyprowadzana z ID Salesforce za pomocą API platformy.

Środki zaradcze: nazwa obiektu z Id.getSObjectType().getDescribe().getName(). Nie może być sfałszowana. Bind variable używana dla record ID.


AtrybutWartość
PlikiObjectTeamMemberTriggerHandler.cls, ShareRecordQueueable.cls, ExpiredTeamMemberCleanupBatch.cls
RegułaDebugStatements
WagaLow
StatusZaakceptowane ryzyko

Powód: instrukcje debug zachowane do rozwiązywania problemów produkcyjnych. Logują tylko na poziomach ERROR/WARN i nie zawierają wrażliwych danych.

Zawartość logowana: komunikaty wyjątków, liczby rekordów, informacje o statusie zadania.

Środki zaradcze: wyjście debug można filtrować za pomocą ustawień Debug Log Salesforce. Brak logowania PII ani poświadczeń.

KontrolaStatusImplementacja
Sprawdzenia CRUD w kontrolerachZaimplementowaneisAccessible(), isCreateable(), isUpdateable(), isDeletable()
Egzekwowanie FLSZaimplementowanePermission Sets kontrolują dostęp do pól
Zapobieganie wstrzykiwaniu SOQLZaimplementowaneBind variables dla danych wejściowych użytkownika, whitelist dla nazw obiektów
Model udostępnianiaZaimplementowanewith sharing na kontrolerach, without sharing tylko tam, gdzie udokumentowane
Walidacja danych wejściowychZaimplementowaneSprawdzenia null, walidacja formatu, reguły biznesowe
Zapobieganie XSSZaimplementowaneFramework LWC obsługuje kodowanie wyjścia
SprawdzenieWynik
Wywołania HTTPBrak — pakiet nie wykonuje wywołań zewnętrznych
Named CredentialsNie używane
External ObjectsNie używane
Remote Site SettingsNiewymagane