Questa pagina si applica ad Apigee e Apigee hybrid.
Visualizza documentazione di Apigee Edge.
Cosa
Estrae informazioni da un messaggio (ad esempio, URI Path, Query Param, Header, Form Param, variabile, XML Payload o Payload JSON) e valuta i contenuti rispetto a normali regole predefinite le espressioni regolari. Se una qualsiasi espressione regolare specificata restituisce true, il messaggio viene considerato e il criterio genera un errore.
Questo criterio è una norma estendibile e il suo utilizzo potrebbe comportare costi o di utilizzo delle applicazioni, a seconda della licenza Apigee. Per informazioni sui tipi di norme e le implicazioni sull'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 contro gli attacchi di SQL injection | Proteggiti dagli attacchi di SQL injection utilizzando il criterio di protezione delle espressioni regolari la 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 impostare un valore 400 generico
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 nel tuo
<JSONPath>
/<Pattern>
include caratteri riservati a XML
(", &, ', < o >), devi includerlo in una sezione CDATA (dati carattere), come mostrato.
nell'esempio precedente oppure esegui la codifica XML dei caratteri riservati, 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 la ricerca senza tenere conto delle maiuscole. 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 del modulo
<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>
La configurazione del criterio RegularExpressionProtection valuterà i parametri del modulo
in caso di messaggi 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 (dati carattere) per aggregare le espressioni regolari, per via della presenza
del & , che è speciale in XML.
Informazioni sul criterio di protezione dalle espressioni regolari
Apigee ti consente di configurare espressioni regolari che possono essere valutate in base al traffico delle API in fase di runtime per identificare le minacce più comuni a livello di contenuto che seguono determinati modelli.
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. È possibile utilizzare espressioni regolari, ad esempio, per valutare un indirizzo email per assicurarne la corretta struttura. Per ulteriori informazioni, consulta la sezione espressioni nei tutorial Java.
L'utilizzo più comune di RegularExpressionProtection è la valutazione di JSON e XML per contenuti dannosi.
Nessuna espressione regolare è in grado di eliminare tutti gli attacchi basati sui contenuti e più meccanismi dovrebbero essere combinati per consentire la difesa in profondità. Questa sezione descrive alcuni pattern consigliati per escludendo 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: utilizza quantificatori greedy nel criterio RegularExpressionProtection.
Nome | Espressione regolare |
---|---|
SQL injection |
[\s]*((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b)) |
Iniezione di inclusione lato server |
<!--#(include|exec|echo|config|printenv)\s+.* Codifica XML: <!--#(include|exec|echo|config|printenv)\s+.* |
Inserimento della sintassi abbreviata di 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*> Codifica XML: <\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 delle espressioni regolari può includere quanto segue 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'intestazioneContent-Type
della richiesta deve essere un content-type XML, comeapplication/xml
otext/xml
. -
Elemento
<JSONPayload>
: specifica che le informazioni devono essere estratte da un payload JSON e valutato in base all’espressione regolare fornita.Se utilizzi
<JSONPayload>
nel criterio, L'intestazioneContent-Type
della richiesta deve essere un content-type JSON, comeapplication/json
.
In genere, progetti un'API in modo che accetti i formati XML o JSON. Tuttavia, potrebbe esserci uno scenario
in cui l'API li accettava entrambi. Potresti quindi definire un criterio di protezione con espressioni regolari
che utilizzi sia gli elementi <XMLPayload>
che <JSONPayload>
.
Solo un elemento può essere applicato a una richiesta specifica in base al valore dell'attributo
Intestazione Content-Type
.
Riferimento elemento
Il riferimento agli elementi descrive gli elementi e gli attributi di 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 il valore su Imposta su |
falso | Facoltativo |
enabled |
Imposta su Imposta |
true | Facoltativo |
async |
Questo attributo è stato ritirato. |
falso | Ritirato |
<DisplayName> elemento
Da utilizzare in aggiunta all'attributo name
per etichettare il criterio in
editor proxy della UI di gestione con un nome diverso e in linguaggio naturale.
<DisplayName>Policy Display Name</DisplayName>
Predefinito |
N/D Se ometti questo elemento, il valore dell'attributo |
---|---|
Presenza | Facoltativo |
Tipo | Stringa |
Elemento <Source>
Indica il messaggio da cui è necessario estrarre 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>
Predefinita: | 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 impostata su true
, la variabile non risolta viene considerata vuota
stringa (Null).
<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
Valore predefinito: | falso |
Presenza: | Facoltativo |
Tipo: | Booleano |
<URIPath> elemento
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 di richiesta e
valutati sulla base delle 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 è necessario estrarre le informazioni la valutazione rispetto alle espressioni regolari fornite. | N/D | Obbligatorio |
Elemento <Header>
Specifica che le informazioni devono essere estratte dalle intestazioni della richiesta e della risposta e
valutati sulla base delle espressioni regolari fornite. Devi specificarne almeno uno
Elemento <Pattern>
che specifica un pattern di espressione regolare da trovare.
<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 |
<Variable> elemento
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 al 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>
Predefinita: | N/D |
Presenza: | Facoltativo |
Tipo: | N/D |
<XMLPayload>/<Namespaces> elemento
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 su nella valutazione di XPath.<Namespaces> <Namespace prefix="apigee">http://www.apigee.com</Namespace> </Namespaces>
Predefinita: | 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 |
<XMLPayload>/<XPath>/<Expression> elemento
Specifica l'espressione XPath definita per la variabile. Solo espressioni XPath 1.0 sono supportati. Ad esempio:<Expression>/company/employee[@age>=$request.header.age]</Expression>
estrae i dettagli relativi ai dipendenti la cui età è superiore 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 |
<XMLPayload>/<XPath>/<Type> elemento
Specifica il tipo di dati di output desiderato.
Di solito userai "string" o "nodeset". Usa "stringa" se hai la certezza che la query xpath genererà 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
attributi su 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
eseguirà una corrispondenza del pattern con ogni valore degli attributi su ciascun elemento nel file XML
documento.
<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>
Predefinita: | 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>
Predefinita: | N/D |
Presenza: | Facoltativo |
Tipo: | N/D |
Attributi
Attributo | Descrizione | Predefinito | Presenza |
---|---|---|---|
escapeSlashCharacter |
Imposta su |
true | Facoltativo |
<JSONPayload>/<JSONPath>/<Expression> elemento
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
L'elemento <Pattern>
include caratteri riservati a XML (", &, ', < o .),
devi codificarlo in XML prima di includerlo.
<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
Questa sezione descrive i codici e i messaggi restituiti e le variabili di errore impostate da Apigee quando questo criterio attiva un errore. Queste informazioni sono importanti per sapere se si stanno sviluppando regole di errore per la gestione degli errori. Per acquisire un errore e generare un errore personalizzato, imposta l'attributo continueOnError="true"
nell'elemento principale del criterio.
Per scoprire di più, consulta gli articoli
Cosa devi sapere sugli errori relativi alle norme e Gestione degli errori.
Errori di runtime
Questi errori possono verificarsi quando il criterio viene eseguito.
Codice di errore | Messaggio |
---|---|
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} |
Errori di deployment
Codice di errore | Messaggio | Correggi |
---|---|---|
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 |
Variabili di errore
Queste variabili vengono impostate quando questo criterio attiva un errore. Per maggiori informazioni, consulta la sezione Cosa devi sapere sugli errori relativi ai criteri.
Variabili | Dove | Esempio |
---|---|---|
fault.name="fault_name" |
fault_name è il nome dell'errore, come indicato nella tabella precedente. | fault.name Matches "ThreatDetected" |
regularexpressionprotection.policy_name.failed |
policy_name è il nome specificato dall'utente del criterio che ha generato l'errore. | regularexpressionprotection.Regular-Expressions-Protection-1.failed = true |
Schemi
Argomenti correlati
Minaccia JSON Norme sulla protezione
Minaccia XML Norme sulla protezione