Questa pagina si applica ad Apigee e Apigee hybrid.
Visualizza la documentazione di Apigee Edge.
Cosa
Estrae le informazioni da un messaggio (ad es. percorso URI, parametro di query, intestazione, parametro di modulo, variabile, payload XML o payload JSON) e valuta i contenuti in base a espressioni regolari predefinite. Se una delle espressioni regolari specificate restituisce true, il messaggio viene considerato una minaccia e il criterio genera un errore.
Questo criterio è un criterio estensibile e il suo utilizzo potrebbe comportare implicazioni in termini di costi o utilizzo, a seconda della licenza Apigee. Per informazioni sui tipi di criteri e sulle implicazioni per l'utilizzo, consulta Tipi di criteri.
Video
Guarda il seguente video per saperne di più sulle norme relative alla protezione delle espressioni regolari.
Video | Descrizione |
---|---|
Protezione dagli attacchi di SQL injection | Proteggiti dagli attacchi SQL injection utilizzando il criterio di protezione delle espressioni regolari nell'UI di Apigee. |
Esempi
GitHub
L'esempio regex-protection
su GitHub illustra come intercettare potenziali attacchi di SQL injection effettuati tramite un
parametro di query che potrebbe contenere codice dannoso in un tag <script>
.
L'esempio illustra anche una buona prassi di impostazione di uno stato di errore generico 400 per impedire agli hacker di ottenere informazioni utili dalla risposta.
JavaScript include la protezione dagli attacchi
<RegularExpressionProtection name="JsonPathRegExProtection"> <Source>request</Source> <JSONPayload escapeSlashCharacter="true"> <JSONPath> <Expression>$</Expression> <Pattern><![CDATA[ <\s*script\b[^>]*>[^<]+<\s*\/\s*script\s*> ]]></Pattern> </JSONPath> </JSONPayload> </RegularExpressionProtection>
L'esempio riportato sopra illustra come utilizzare il criterio di protezione delle espressioni regolari per valutare
i payload JSON per gli attacchi JavaScript include. In particolare, i contenuti estratti da
<JSONPath>
/<Expression>
vengono valutati in base all'espressione regolare in <JSONPath>
/<Pattern>
.
Se l'espressione regolare in <JSONPath>
/<Pattern>
include caratteri riservati XML (", &, ', < o >), devi racchiuderla in una sezione CDATA (Character Data), come mostrato nell'esempio precedente, o codificare i caratteri riservati in XML: ad esempio, sostituendo <
con <
e >
con >
.
Inoltre, se l'espressione regolare include barre (/), devi aggiungere un carattere di escape impostando l'attributo <JSONPayload>
escapeSlashCharacter
su true
.
Corrispondenza senza distinzione tra maiuscole e minuscole
È un caso d'uso comune eseguire una ricerca senza distinzione tra maiuscole e minuscole. Ecco un esempio di come puoi
farlo in un'espressione regolare utilizzando la costruzione (?i)
. In questo
esempio, ad esempio, DELETE
, delete
e Delete
avranno valore true.
<Pattern>[\s]*(?i)((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b))</Pattern>
Controlli dei parametri dei moduli
<RegularExpressionProtection name="REP-Formparam"> <Source>request</Source> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <FormParam name="firstname"> <Pattern><![CDATA[[-+=$%&]]]></Pattern> </FormParam> <FormParam name="lastname"> <Pattern><![CDATA[[-+=$%&]]]></Pattern> </FormParam> </RegularExpressionProtection>
Questa configurazione del criterio RegularExpressionProtection valuterà i parametri del modulo
per l'eventuale presenza di caratteri speciali all'interno dell'insieme [-+=$%&]
.
Questo criterio avrà effetto solo quando l'intestazione content-type nella richiesta è application/x-www-form-urlencoded
. La configurazione dei criteri utilizza
una sezione CDATA (Character Data) per avvolgere le espressioni regolari, a causa della presenza
del carattere &, che è speciale in XML.
Informazioni sul criterio di protezione delle espressioni regolari
Apigee ti consente di configurare espressioni regolari che possono essere valutate in base al traffico dell'API in fase di esecuzione per identificare le minacce comuni a livello di contenuti che seguono determinati pattern.
Un'espressione regolare, o regex in breve, è un insieme di stringhe che specificano un pattern in una stringa. Le espressioni regolari consentono di valutare i contenuti in modo programmatico per rilevare pattern. Le espressioni regolari possono essere utilizzate, ad esempio, per valutare un indirizzo email per assicurarsi che sia strutturato correttamente. Per ulteriori informazioni, consulta Espressioni regolari nei tutorial Java.
L'utilizzo più comune di RegularExpressionProtection è la valutazione dei payload JSON e XML per contenuti dannosi.
Nessuna espressione regolare può eliminare tutti gli attacchi basati sui contenuti e devono essere combinati più meccanismi per attivare la difesa in profondità. Questa sezione descrive alcuni pattern consigliati per escludere i contenuti.
Pattern di esclusione di esempio
Le espressioni regolari devono essere codificate in XML nel file di configurazione XML del criterio. Vedi anche Antipattern: utilizzare quantificatori greedy nel criterio RegularExpressionProtection.
Nome | Espressione regolare |
---|---|
SQL injection |
[\s]*((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b)) |
Iniezione di Server Side Include |
<!--#(include|exec|echo|config|printenv)\s+.* XML codificato: <!--#(include|exec|echo|config|printenv)\s+.* |
Iniezione di sintassi abbreviata XPath |
(/(@?[\w_?\w:\*]+(\[[^]]+\])*)?)+ |
Iniezione di sintassi espansa XPath |
/?(ancestor(-or-self)?|descendant(-or-self)?|following(-sibling)) |
Iniezione di JavaScript |
<\s*script\b[^>]*>[^<]+<\s*/\s*script\s*> XML codificato: <\s*script\b[^>]*>[^<]+<\s*/\s*script\s*> |
Impostare l'intestazione Content-Type in una richiesta con un payload XML o JSON
Il payload del criterio di protezione tramite espressioni regolari può includere i seguenti elementi:
-
Elemento
<XMLPayload>
: specifica che le informazioni devono essere estratte da un payload XML e valutate in base all'espressione regolare fornita.Se utilizzi
<XMLPayload>
nel criterio, l'Content-Type
dell'intestazione della richiesta deve essere un tipo di contenuto XML comeapplication/xml
otext/xml
. -
Elemento
<JSONPayload>
: specifica che le informazioni devono essere estratte da un payload JSON e valutate in base all'espressione regolare fornita.Se utilizzi
<JSONPayload>
nel criterio, l'Content-Type
della richiesta deve essere un tipo di contenuto JSON comeapplication/json
.
In genere, un'API viene progettata per accettare XML o JSON. Tuttavia, potrebbe verificarsi uno scenario in cui l'API abbia accettato entrambi. Potresti quindi definire un criterio di protezione con espressioni regolari
che utilizzi sia gli elementi <XMLPayload>
che <JSONPayload>
.
Per una richiesta specifica viene applicato un solo elemento in base al valore dell'intestazione Content-Type
.
Riferimento elemento
Il riferimento all'elemento descrive gli elementi e gli attributi del criterio RegularExpressionProtection.
<RegularExpressionProtection async="false" continueOnError="false" enabled="true" name="Regular-Expression-Protection-1"> <DisplayName>Regular Expression Protection 1</DisplayName> <Source>response</Source> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <URIPath> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </URIPath> <QueryParam name="a-query-param"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </QueryParam> <Header name="a-header"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </Header> <FormParam name="a-form-param"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </FormParam> <Variable name="request.content"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </Variable> <XMLPayload> <Namespaces> <Namespace prefix="apigee">http://www.apigee.com</Namespace> </Namespaces> <XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath> </XMLPayload> <JSONPayload> <JSONPath> <Expression>$.store.book[*].author</Expression> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </JSONPath> </JSONPayload> </RegularExpressionProtection>
Attributi <RegularExpressionProtection>
<RegularExpressionProtection async="false" continueOnError="false" enabled="true" name="Regular-Expression-Protection-1">
La tabella seguente descrive gli attributi comuni a tutti gli elementi principali dei criteri:
Attributo | Descrizione | Predefinito | Presenza |
---|---|---|---|
name |
Il nome interno del criterio. Il valore dell'attributo Se vuoi, utilizza l'elemento |
N/D | Obbligatorio |
continueOnError |
Imposta su Imposta su |
falso | Facoltativo |
enabled |
Imposta su Imposta |
true | Facoltativo |
async |
Questo attributo è stato ritirato. |
falso | Ritirato |
Elemento <DisplayName>
Da utilizzare insieme all'attributo name
per etichettare il criterio nell'editor proxy dell'interfaccia utente di gestione con un nome diverso in linguaggio naturale.
<DisplayName>Policy Display Name</DisplayName>
Predefinito |
N/D Se ometti questo elemento, viene utilizzato il valore dell'attributo |
---|---|
Presenza | Facoltativo |
Tipo | Stringa |
Elemento <Source>
Indica il messaggio da cui devono essere estratte le informazioni.
Se l'elemento <Source>
viene omesso, il valore predefinito è
message
. Ad esempio: <Source>message</Source>
. Se impostato su
message
, il criterio utilizza il messaggio di richiesta come origine quando è associato a un flusso di richiesta. Analogamente, il criterio utilizza il messaggio di risposta quando è associato a un flusso di risposta.
Se il messaggio di origine non può essere risolto o se si risolve in un tipo diverso da un messaggio, il criterio restituisce un errore.
<Source>response</Source>
Valore predefinito: | N/D |
Presenza: | Facoltativo |
Tipo: | Stringa |
Elemento <IgnoreUnresolvedVariables>
Determina se il criterio restituisce un errore quando rileva una variabile non risolvibile.
Se impostato su false
(il valore predefinito), il criterio restituisce un errore quando viene rilevata una variabile non risolvibile. Se impostato su true
, la variabile non risolta viene considerata come stringa vuota (Null).
<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
Valore predefinito: | falso |
Presenza: | Facoltativo |
Tipo: | Booleano |
Elemento <URIPath>
Specifica che le informazioni devono essere estratte dal percorso dell'URI della richiesta e valutate rispetto alle espressioni regolari fornite. Devi fornire almeno un elemento <Pattern>
che specifichi un pattern di espressioni regolari da associare.
<URIPath> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </URIPath>
Valore predefinito: | N/D |
Presenza: | Facoltativo |
Tipo: | N/D |
Elemento <QueryParam>
Specifica che le informazioni devono essere estratte dal parametro di query della richiesta e valutate in base alle espressioni regolari fornite. Devi fornire almeno un elemento <Pattern>
che specifichi un pattern di espressioni regolari da associare.
<QueryParam name="a-query-param"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </QueryParam>
Valore predefinito: | N/D |
Presenza: | Facoltativo |
Tipo: | N/D |
Attributi
Attributo | Descrizione | Predefinito | Presenza |
---|---|---|---|
nome | Nome del parametro di query della richiesta da cui devono essere estratte le informazioni per la valutazione rispetto alle espressioni regolari fornite. | N/D | Obbligatorio |
Elemento <Header>
Specifica che le informazioni devono essere estratte dagli intestazioni di richiesta e risposta e valutate in base alle espressioni regolari fornite. Devi fornire almeno un elemento <Pattern>
che specifichi un pattern di espressioni regolari da associare.
<Header name="a-header"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </Header>
Valore predefinito: | N/D |
Presenza: | Facoltativo |
Tipo: | N/D |
Attributi
Attributo | Descrizione | Predefinito | Presenza |
---|---|---|---|
nome |
Nome dell'intestazione della richiesta e della risposta da cui devono essere estratte le informazioni per la valutazione in base alle espressioni regolari fornite. |
N/D | Obbligatorio |
Elemento <FormParam>
Specifica che le informazioni devono essere estratte dal parametro del modulo di richiesta e valutate in base alle espressioni regolari fornite. Devi fornire almeno un elemento <Pattern>
che specifichi un pattern di espressioni regolari da associare.
<FormParam name="a-form-param"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </FormParam>
Valore predefinito: | N/D |
Presenza: | Facoltativo |
Tipo: | N/D |
Attributi
Attributo | Descrizione | Predefinito | Presenza |
---|---|---|---|
nome |
Nome del parametro del modulo di richiesta da cui devono essere estratte le informazioni per la valutazione in base alle espressioni regolari fornite. |
N/D | Obbligatorio |
Elemento <Variable>
Specifica che le informazioni devono essere estratte dalla variabile specificata e valutate in base alle espressioni regolari fornite.
<Variable name="request.content"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </Variable>
Valore predefinito: | N/D |
Presenza: | Facoltativo |
Tipo: | N/D |
Attributi
Attributo | Descrizione | Predefinito | Presenza |
---|---|---|---|
nome |
Nome della variabile da cui devono essere estratte le informazioni per la valutazione rispetto alle espressioni regolari fornite. |
N/D | Obbligatorio |
Elemento <XMLPayload>
Specifica che le informazioni devono essere estratte da un payload XML e valutate in base alle espressioni regolari fornite.
<XMLPayload> <Namespaces> <Namespace prefix="apigee">http://www.apigee.com</Namespace> </Namespaces> <XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath> </XMLPayload>
Valore predefinito: | N/D |
Presenza: | Facoltativo |
Tipo: | N/D |
Elemento <XMLPayload>/<Namespaces>
Specifica gli spazi dei nomi da utilizzare nella valutazione XPath.
<XMLPayload> <Namespaces> <Namespace prefix="apigee">http://www.apigee.com</Namespace> </Namespaces> <XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath> </XMLPayload>
Valore predefinito: | N/D |
Presenza: | Facoltativo |
Tipo: | Stringa |
Elemento <XMLPayload>/<Namespaces>/<Namespace>
Specifica ogni spazio dei nomi da utilizzare nella valutazione XPath.<Namespaces> <Namespace prefix="apigee">http://www.apigee.com</Namespace> </Namespaces>
Valore predefinito: | N/D |
Presenza: | Facoltativo |
Tipo: | Stringa |
Attributi
Attributo | Descrizione | Predefinito | Presenza |
---|---|---|---|
prefisso |
Fornisce un prefisso per specificare un determinato spazio dei nomi. |
N/D | Obbligatorio |
Elemento <XMLPayload>/<XPath>
Specifica l'XPath da valutare.<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
Valore predefinito: | N/D |
Presenza: | Facoltativo |
Tipo: | N/D |
Elemento <XMLPayload>/<XPath>/<Expression>
Specifica l'espressione XPath definita per la variabile. Sono supportate solo le espressioni XPath 1.0. Ad esempio,<Expression>/company/employee[@age>=$request.header.age]</Expression>
estrae i dettagli dei dipendenti la cui età è maggiore o uguale al valore specificato in
request.header.age
.<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
Valore predefinito: | N/D |
Presenza: | Facoltativo |
Tipo: | Stringa |
Elemento <XMLPayload>/<XPath>/<Type>
Specifica il tipo di dati di output desiderato.
In genere viene utilizzato "stringa" o "nodeset". Utilizza "stringa" se hai la certezza che la query XPath restituirà al massimo un valore o se vuoi controllare al massimo un valore. Se la query XPath può restituire più valori, specifica "nodeset" per controllare tutti i valori.
Ad esempio, considera l'espressione XPath //*/@*
. Corrisponde a tutti
gli attributi di tutti gli elementi. Se specifichi "stringa" come Type
, Apigee imposterà il risultato di questa query su una singola stringa. Sarà il valore di uno degli attributi di uno degli elementi del documento XML, ma non è definito quale attributo e quale elemento. Apigee eseguirà quindi la corrispondenza del pattern rispetto al valore di quel singolo
attributo. Probabilmente non è quello che vuoi.
Al contrario, se specifichi "nodeset" come Type
per l'espressione XPath, Apigee effettuerà la corrispondenza del pattern con ciascuno dei valori dell'attributo in ogni elemento del documento XML.
<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
Valore predefinito: | string |
Presenza: | Facoltativo |
Tipo: | Stringa |
Valori validi: |
Una di queste parole chiave: |
Elemento <XMLPayload>/<XPath>/<Pattern>
Definisce il pattern dell'espressione regolare. Se un'espressione regolare nell'elemento<Pattern>
include caratteri riservati XML (", &, ', < o
.), devi codificarla in XML prima di includerla.
<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
Valore predefinito: | N/D |
Presenza: | Obbligatorio |
Tipo: | Stringa |
Elemento <JSONPayload>
Specifica che le informazioni devono essere estratte da un payload JSON e valutate in base alle espressioni regolari fornite.
<JSONPayload> <JSONPath> <Expression>$.store.book[*].author</Expression> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </JSONPath> </JSONPayload>
Valore predefinito: | N/D |
Presenza: | Facoltativo |
Tipo: | N/D |
Attributi
Attributo | Descrizione | Predefinito | Presenza |
---|---|---|---|
escapeSlashCharacter |
Imposta su |
true | Facoltativo |
Elemento <JSONPayload>/<JSONPath>/<Expression>
Specifica l'espressione JSONPath definita per la variabile.
<JSONPath> <Expression>$.store.book[*].author</Expression> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </JSONPath>
Valore predefinito: | N/D |
Presenza: | Facoltativo |
Tipo: | Stringa |
Elemento <JSONPayload>/<JSONPath>/<Pattern>
Definisce il pattern dell'espressione regolare. Se un'espressione regolare nell'elemento <Pattern>
include caratteri riservati XML (", &, ', < o .), devi codificarla in XML prima di includerla.
<JSONPath> <Expression>$.store.book[*].author</Expression> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </JSONPath>
Valore predefinito: | N/D |
Presenza: | Obbligatorio |
Tipo: | Stringa |
Messaggi di errore
This section describes the error codes and messages returned and fault variables
set by Apigee when this policy triggers an error. This information is important to know if
you are developing fault rules to handle faults. If you want to capture an error and raise your own
custom error, set the continueOnError="true"
attribute on the policy root element.
To learn more, see
What you need to know about policy errors and Handling
faults.
Runtime errors
These errors can occur when the policy executes.
Error Code | Message |
---|---|
ExecutionFailed |
Failed to execute the RegularExpressionProtection StepDefinition {0}. Reason: {1} |
InstantiationFailed |
Failed to instantiate the RegularExpressionProtection StepDefinition {0} |
NonMessageVariable |
Variable {0} does not resolve to a Message |
SourceMessageNotAvailable |
{0} message is not available for RegularExpressionProtection StepDefinition {1} |
ThreatDetected |
Regular Expression Threat Detected in {0}: regex: {1} input: {2} |
VariableResolutionFailed |
Failed to resolve variable {0} |
Deployment errors
Error Code | Message | Fix |
---|---|---|
CannotBeConvertedToNodeset |
RegularExpressionProtection {0}: Result of xpath {1} cannot be converted to nodeset.
Context {2} |
build |
DuplicatePrefix |
RegularExpressionProtection {0}: Duplicate prefix {1} |
build |
EmptyJSONPathExpression |
RegularExpressionProtection {0}: Empty JSONPath expression |
build |
EmptyXPathExpression |
RegularExpressionProtection {0}: Empty XPath expression |
build |
InvalidRegularExpression |
RegularExpressionProtection {0}: Invalid Regular Expression {1}, Context {2} |
build |
JSONPathCompilationFailed |
RegularExpressionProtection {0}: Failed to compile jsonpath {1}. Context {2} |
build |
NONEmptyPrefixMappedToEmptyURI |
RegularExpressionProtection {0}: Non-empty prefix {1} cannot be mapped to empty
uri |
build |
NoPatternsToEnforce |
RegularExpressionProtection {0}: No patterns to enforce in {1} |
build |
NothingToEnforce |
RegularExpressionProtection {0}: at least one of URIPath, QueryParam, Header,
FormParam, XMLPayload, JSONPayload is mandatory |
build |
XPathCompilationFailed |
RegularExpressionProtection {0}: Failed to compile xpath {1}. Context {2} |
build |
Fault variables
These variables are set when this policy triggers an error. For more information, see What you need to know about policy errors.
Variables | Where | Example |
---|---|---|
fault.name="fault_name" |
fault_name is the name of the fault, as listed in the table above. | fault.name Matches "ThreatDetected" |
regularexpressionprotection.policy_name.failed |
policy_name is the user-specified name of the policy that threw the fault. | regularexpressionprotection.Regular-Expressions-Protection-1.failed = true |
Schemi
Argomenti correlati
Criteri di protezione dalle minacce in formato JSON
Criteri di protezione dalle minacce