Przeglądasz dokumentację Apigee Edge.
Przejdź do
Dokumentacja Apigee X. informacje.
Co
Wyodrębnia informacje z wiadomości (na przykład Ścieżka URI, parametr zapytania, nagłówek, parametr formularza, zmiennej, XML Payload lub JSON Payload) i ocenia tę treść w porównaniu ze wstępnie zdefiniowanym zwykłym. wyrażeń. Jeśli określone wyrażenia regularne mają wartość prawda, wiadomość jest traktowana jako i zostanie odrzucone.
Filmy
Aby dowiedzieć się więcej o zasadach ochrony wyrażeń regularnych, obejrzyj poniższe filmy.
Wideo | Opis |
---|---|
Ochrona przed atakami typu wstrzykiwanie kodu SQL (New Edge) | Ochrona przed atakami typu wstrzykiwanie kodu SQL przy użyciu zasady ochrony wyrażeń regularnych w interfejsu nowej wersji Edge. |
Ochrona przed atakami typu wstrzykiwanie kodu SQL (Classic Edge) | Ochrona przed atakami typu wstrzykiwanie kodu SQL przy użyciu zasady ochrony wyrażeń regularnych w klasycznego interfejsu Edge. |
Przykłady
GitHub
Stosuje zabezpieczenia regularne przykład z GitHuba pokazuje, jak przechwytywać potencjalne ataki polegające na wstrzykiwaniu kodu SQL za pomocą parametru zapytania. Ten przykład pokazuje też dobrą praktykę ustawiania ogólnej wartości 400, aby hakerzy nie uzyskali z odpowiedzi przydatnych informacji.
JavaScript obejmuje ochronę przed atakami
<RegularExpressionProtection name="JsonPathRegExProtection"> <DisplayName>Regular Expression Protection 1</DisplayName> <Source>request</Source> <JSONPayload escapeSlashCharacter="true"> <JSONPath> <Expression>$</Expression> <Pattern><\s*script\b[^>]*>[^<]+<\s*\/\s*script\s*> </Pattern> <Pattern>n\s*\\\\\s*slash</Pattern> <Pattern>n\s*\/\s*slash</Pattern> <Pattern>n\s*\\"\s*quotes</Pattern> <Pattern>n\s*\\b\s*space</Pattern> <Pattern>n\s*\\f\s*forwardfeed</Pattern> <Pattern>n\s*\\n\s*newline</Pattern> <Pattern>n\s*\\r\s*carria</Pattern> <Pattern>n\s*\\t\s*tab</Pattern> <Pattern>n\s*\\uFFFF\s*hex</Pattern> </JSONPath> </JSONPayload> </RegularExpressionProtection>
Przykład powyżej pokazuje, jak używać zasady RegularExpressionProtection do oceny
Ładunki JSON używane w języku JavaScript obejmują ataki. Konkretnie chodzi tu o treści wyodrębnione przez
<JSONPath>
/<Expression>
jest oceniany w oparciu o
wyrażenie regularne w formacie <JSONPath>
/<Pattern>
.
Jeśli wyrażenie regularne w parametrze
Kod <JSONPath>
/<Pattern>
zawiera znaki zarezerwowane dla formatu XML
(", &, ', < lub .), musisz go zakodować w formacie XML przed umieszczeniem go w pliku XML zasad
. W przykładzie powyżej wyrażenie regularne
Poprzednia wartość „<\s*script\b[^>]*>[^<]+<\s*\/\s*script\s*>
” to
Zakodowany w formacie XML jako
<\s*script\b[^>]*>[^<]+<\s*\/\s*script\s*>
Ponadto, jeśli wyrażenie regularne zawiera ukośniki (/), musisz użyć znaku zmiany znaczenia
je, ustawiając <JSONPayload>
escapeSlashCharacter
do wartości true
.
Dopasowanie bez rozróżniania wielkości liter
Częstym przypadkiem użycia jest dopasowywanie wielkości liter bez rozróżniania wielkości liter. Oto przykład,
możesz to zrobić w wyrażeniu regularnym z użyciem konstrukcji (?i)
. W tym
na przykład DELETE
, delete
i Delete
będą
wartość prawda.
<Pattern>[\s]*(?i)((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b))</Pattern>
Informacje o zasadach ochrony wyrażeń regularnych
Apigee Edge umożliwia konfigurowanie wyrażeń regularnych, których można używać oceniane na podstawie ruchu API w czasie działania w celu identyfikowania typowych zagrożeń na poziomie treści, które występują pewnych wzorców.
Wyrażenie regularne, w skrócie wyrażenie regularne, to zestaw ciągów znaków. określające wzorzec w ciągu znaków. Wyrażenia regularne umożliwiają automatyzację treści analizowanych pod kątem wzorców. Wyrażeń regularnych możesz użyć na przykład do oceny adresu e-mail. aby mieć pewność, że jest poprawnie zorganizowany. Więcej informacji znajdziesz w sekcji Zwykłe wyrażenia w samouczkach Java.
Najczęstszym zastosowaniem funkcji RegularExpressionProtection jest ocena kodu JSON i XML. pod kątem szkodliwych treści.
Żadne wyrażenie regularne nie może wyeliminować wszystkich ataków opartych na treści, a wiele mechanizmów powinien należy łączyć w celu włączenia obrony w głąb. W tej sekcji opisano kilka zalecanych wzorców wykluczając treści.
Przykładowe wykluczenie wzory
Wyrażenia regularne muszą być zakodowane w formacie XML w pliku konfiguracji zasady.
Nazwa | Wyrażenie regularne |
---|---|
Wstrzyknięcie kodu SQL |
[\s]*((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b)) |
Wstrzyknięcie kodu Uwzględnij po stronie serwera |
<!--#(include|exec|echo|config|printenv)\s+.* Zakodowany w formacie XML: <!--#(include|exec|echo|config|printenv)\s+.* |
Wstrzyknięcie skróconej składni XPath |
(/(@?[\w_?\w:\*]+(\[[^]]+\])*)?)+ |
Wstrzykiwanie rozszerzonej składni XPath |
/?(ancestor(-or-self)?|descendant(-or-self)?|following(-sibling)) |
Wstrzyknięcie kodu JavaScript |
<\s*script\b[^>]*>[^<]+<\s*/\s*script\s*> Zakodowany w formacie XML: <\s*script\b[^>]*>[^<]+<\s*/\s*script\s*> |
Wstrzykiwanie wyjątków Javy |
.*?Exception in thread.* |
Ustaw nagłówek Content-Type w żądaniu z ładunkiem XML lub JSON
Ładunek zasady ochrony wyrażeń regularnych może zawierać te elementy: elementy:
-
Element
<XMLPayload>
: określa, że należy wyodrębnić informacje ładunek XML i ocenić go w oparciu o podane wyrażenie regularne.Jeśli w zasadzie używasz atrybutu
<XMLPayload>
, NagłówekContent-Type
żądania musi być typem zawartości XML, takim jakapplication/xml
lubtext/xml
. -
Element
<JSONPayload>
: określa, że należy wyodrębnić informacje z ładunku JSON i ocenić za pomocą podanego wyrażenia regularnego.Jeśli w zasadzie używasz atrybutu
<JSONPayload>
, NagłówekContent-Type
żądania musi być typem treści JSON takim jakapplication/json
Zwykle projektujesz interfejs API w taki sposób, aby akceptował on format XML lub JSON. Istnieje jednak sytuacja,
w których interfejs API akceptuje oba te typy. Możesz następnie zdefiniować zasadę ochrony wyrażeń regularnych.
z elementami <XMLPayload>
i <JSONPayload>
.
Do konkretnego żądania na podstawie wartości atrybutu
Nagłówek Content-Type
.
Odwołanie do elementu
Odwołanie do elementu opisuje elementy i atrybuty elementu 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>
<RegularExpressionProtection> atrybuty
<RegularExpressionProtection async="false" continueOnError="false" enabled="true" name="Regular-Expression-Protection-1">
W tej tabeli opisano atrybuty wspólne dla wszystkich elementów nadrzędnych zasad:
Atrybut | Opis | Domyślny | Obecność |
---|---|---|---|
name |
Wewnętrzna nazwa zasady. Wartość atrybutu Opcjonalnie możesz użyć elementu |
Nie dotyczy | Wymagane |
continueOnError |
Ustaw jako Ustaw jako |
fałsz | Opcjonalnie |
enabled |
Aby egzekwować zasadę, ustaw wartość Aby wyłączyć zasadę, ustaw wartość |
prawda | Opcjonalnie |
async |
Ten atrybut został wycofany. |
fałsz | Wycofano |
<DisplayName> element
Używaj oprócz atrybutu name
do oznaczania zasady w
edytor proxy interfejsu zarządzania z inną nazwą w języku naturalnym.
<DisplayName>Policy Display Name</DisplayName>
Domyślny |
Nie dotyczy Jeśli pominiesz ten element, atrybut |
---|---|
Obecność | Opcjonalnie |
Typ | Ciąg znaków |
<Source> element
Wskazuje wiadomość, z której należy wyodrębnić informacje.
Jeśli element <Source>
zostanie pominięty, domyślną wartością jest
message
Na przykład: <Source>message</Source>
. Po ustawieniu na
message
, zasada używa wiadomości z żądaniem jako źródła po dołączeniu do żądania
przepływu danych. Podobnie zasada korzysta z odpowiedzi, gdy jest dołączona do procesu odpowiedzi.
Jeśli nie można znaleźć komunikatu źródłowego lub przechodzi on w typie innym niż wiadomość, zasada zwraca błąd.
<Source>response</Source>
Domyślne: | Nie dotyczy |
Obecność: | Opcjonalnie |
Typ: | Ciąg znaków |
<IgnoreUnresolvedVariables> element
Określa, czy zasada zwraca błąd po napotkaniu zmiennej, która jest nierozwiązalne.
Jeśli ma wartość false
(domyślna), zasada zwraca błąd w przypadku braku rozwiązania
. Jeśli ma wartość true
, nierozstrzygnięta zmienna jest traktowana jako pusta
ciąg znaków (wartość null).
<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
Domyślne: | fałsz |
Obecność: | Opcjonalnie |
Typ: | Wartość logiczna |
<URIPath> element
Określa, że informacje muszą zostać wyodrębnione ze ścieżki identyfikatora URI żądania i oceniane
z podanymi wyrażeniami regularnymi. Musisz podać co najmniej jeden
Element <Pattern>
określający wzorzec wyrażenia regularnego do dopasowania.
<URIPath> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </URIPath>
Domyślne: | Nie dotyczy |
Obecność: | Opcjonalnie |
Typ: | Nie dotyczy |
<QueryParam> element
Określa, że informacje muszą zostać wyodrębnione z parametru zapytania żądania i
jest oceniana na podstawie podanych wyrażeń regularnych. Musisz podać co najmniej jeden
Element <Pattern>
określający wzorzec wyrażenia regularnego do dopasowania.
<QueryParam name="a-query-param"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </QueryParam>
Domyślne: | Nie dotyczy |
Obecność: | Opcjonalnie |
Typ: | Nie dotyczy |
Atrybuty
Atrybut | Opis | Domyślny | Obecność |
---|---|---|---|
nazwa | Nazwa parametru zapytania żądania, z którego należy wyodrębnić informacje na podstawie podanych wyrażeń regularnych. | Nie dotyczy | Wymagane |
<Header> element
określa, że informacje muszą zostać wyodrębnione z nagłówków żądania i odpowiedzi oraz
jest oceniana na podstawie podanych wyrażeń regularnych. Musisz podać co najmniej jeden
Element <Pattern>
określający wzorzec wyrażenia regularnego do dopasowania.
<Header name="a-header"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </Header>
Domyślne: | Nie dotyczy |
Obecność: | Opcjonalnie |
Typ: | Nie dotyczy |
Atrybuty
Atrybut | Opis | Domyślny | Obecność |
---|---|---|---|
nazwa |
Nazwa nagłówka żądania i odpowiedzi, z którego należy wyodrębnić informacje do oceny na podstawie podanych wyrażeń regularnych. |
Nie dotyczy | Wymagane |
<FormParam> element
Określa, że informacje muszą zostać wyodrębnione z parametru formularza żądania i oceniane
z podanymi wyrażeniami regularnymi. Musisz podać co najmniej jeden
Element <Pattern>
określający wzorzec wyrażenia regularnego do dopasowania.
<FormParam name="a-form-param"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </FormParam>
Domyślne: | Nie dotyczy |
Obecność: | Opcjonalnie |
Typ: | Nie dotyczy |
Atrybuty
Atrybut | Opis | Domyślny | Obecność |
---|---|---|---|
nazwa |
Nazwa parametru formularza żądania, z którego należy wyodrębnić informacje na podstawie podanych wyrażeń regularnych. |
Nie dotyczy | Wymagane |
<Variable> element
Określa, że informacje muszą zostać wyodrębnione z danej zmiennej i oceniane w odniesieniu do z podanych wyrażeń regularnych.
<Variable name="request.content"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </Variable>
Domyślne: | Nie dotyczy |
Obecność: | Opcjonalnie |
Typ: | Nie dotyczy |
Atrybuty
Atrybut | Opis | Domyślny | Obecność |
---|---|---|---|
nazwa |
Nazwa zmiennej, z której należy wyodrębnić informacje na potrzeby oceny z podanymi wyrażeniami regularnymi. |
Nie dotyczy | Wymagane |
<XMLPayload> element
Określa, że informacje muszą zostać wyodrębnione z ładunku XML i oceniane w odniesieniu do wyrażenia regularne.
<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>
Domyślne: | Nie dotyczy |
Obecność: | Opcjonalnie |
Typ: | Nie dotyczy |
<XMLPayload>/<Namespaces> element
Określa przestrzenie nazw, które mają być używane podczas oceny 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>
Domyślne: | Nie dotyczy |
Obecność: | Opcjonalnie |
Typ: | Ciąg znaków |
<XMLPayload>/<Namespaces>/<Namespace> element
Określa każdą przestrzeń nazw do używane do oceny XPath.<Namespaces> <Namespace prefix="apigee">http://www.apigee.com</Namespace> </Namespaces>
Domyślne: | Nie dotyczy |
Obecność: | Opcjonalnie |
Typ: | Ciąg znaków |
Atrybuty
Atrybut | Opis | Domyślny | Obecność |
---|---|---|---|
prefiks |
Zawiera prefiks ułatwiający kwalifikowanie danej przestrzeni nazw. |
Nie dotyczy | Wymagane |
<XMLPayload>/<XPath> element
Określa ścieżkę XPath do oceny.<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
Domyślne: | Nie dotyczy |
Obecność: | Opcjonalnie |
Typ: | Nie dotyczy |
<XMLPayload>/<XPath>/<Expression> element
Określa wyrażenie XPath zdefiniowane dla zmiennej. Tylko wyrażenia XPath 1.0 są obsługiwane. Przykład:<Expression>/company/employee[@age>=$request.header.age]</Expression>
wyodrębnia informacje o pracownikach, których wiek jest równa wartości określonej w
request.header.age
<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
Domyślne: | Nie dotyczy |
Obecność: | Opcjonalnie |
Typ: | Ciąg znaków |
<XMLPayload>/<XPath>/<Type> element
Określa typ danych.<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
Domyślne: | ciąg znaków |
Obecność: | Opcjonalnie |
Typ: | Ciąg znaków |
Prawidłowe wartości: |
Ciąg tekstowy. Prawidłowe wartości to |
<XMLPayload>/<XPath>/<Pattern> element
Definiuje wzorzec wyrażenia regularnego. Jeśli wyrażenie regularne w argumencie
element<Pattern>
zawiera znaki zarezerwowane przez XML (", &, ', < lub
), musisz go zakodować w formacie XML przed dołączeniem.
<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
Domyślne: | Nie dotyczy |
Obecność: | Wymagane |
Typ: | Ciąg znaków |
<JSONPayload> element
Określa, że informacje muszą zostać wyodrębnione z ładunku JSON i oceniane w odniesieniu do wyrażenia regularne.
<JSONPayload> <JSONPath> <Expression>$.store.book[*].author</Expression> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </JSONPath> </JSONPayload>
Domyślne: | Nie dotyczy |
Obecność: | Opcjonalnie |
Typ: | Nie dotyczy |
Atrybuty
Atrybut | Opis | Domyślny | Obecność |
---|---|---|---|
escapeSlashCharacter |
Ustaw jako |
prawda | Opcjonalnie |
<JSONPayload>/<JSONPath>/<Expression> element
Określa wyrażenie JSONPath zdefiniowane dla zmiennej.
<JSONPath> <Expression>$.store.book[*].author</Expression> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </JSONPath>
Domyślne: | Nie dotyczy |
Obecność: | Opcjonalnie |
Typ: | Ciąg znaków |
<JSONPayload>/<JSONPath>/<Pattern> element
Definiuje wzorzec wyrażenia regularnego. Jeśli wyrażenie regularne w parametrze
Element <Pattern>
zawiera znaki zarezerwowane w formacie XML (", &, ', < lub .),
musisz go zakodować w formacie XML, zanim go umieścisz.
<JSONPath> <Expression>$.store.book[*].author</Expression> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </JSONPath>
Domyślne: | Nie dotyczy |
Obecność: | Wymagane |
Typ: | Ciąg znaków |
Informacje o błędzie
W tej sekcji opisujemy kody błędów, zwracane komunikaty i zmienne błędów ustawione przez Edge, gdy ta zasada wywołuje błąd. Te informacje są ważne, aby wiedzieć, czy opracowujesz reguły dotyczące błędów w przypadku błędów. Jeśli chcesz przechwycić błąd i zgłosić własny błąd niestandardowy, ustaw atrybut continueOnError="true"
w głównym elemencie zasad.
Więcej informacji znajdziesz w sekcjach
Co musisz wiedzieć o błędach zasad i Postępowanie w przypadku błędów.
Błędy zwracane z zasad Edge mają spójny format opisany w Informacjach na temat kodów błędów.
Błędy w czasie wykonywania
Te błędy mogą wystąpić podczas wykonywania zasady.
Kod błędu | przekaz, |
---|---|
ExecutionFailed | Nie udało się wykonać definicji kroku RegularExpressionProtection {0}. Przyczyna: {1} |
InstantiationFailed | Nie udało się utworzyć instancji kroku definicji kroku RegularExpressionProtection {0} |
NonMessageVariable | Zmienna {0} nie przyjmuje wartości do komunikatu |
SourceMessageNotAvailable | Komunikat {0} nie jest dostępny dla określenia kroków definicji kroków RegularExpressionProtection {1} |
ThreatDetected | Wykryto zagrożenie związane z wyrażeniem regularnym w {0}: wyrażenie regularne: {1} wejściowe: {2} |
VariableResolutionFailed | Nie udało się znaleźć zmiennej {0} |
Błędy wdrażania
Kod błędu | przekaz, | Napraw |
---|---|---|
CannotBeConvertedToNodeset | RegularExpressionProtection {0}: wynik funkcji xpath {1} nie może zostać przekonwertowany na zbiór węzłów. Kontekst {2} | build |
DuplicatePrefix | RegularExpressionProtection {0}: zduplikowany prefiks {1} | build |
EmptyJSONPathExpression | RegularExpressionProtection{0}: puste wyrażenie JSONPath | build |
EmptyXPathExpression | RegularExpressionProtection{0}: puste wyrażenie XPath | build |
InvalidRegularExpression | RegularExpressionProtection {0}: nieprawidłowe wyrażenie regularne {1}, kontekst {2} | build |
JSONPathCompilationFailed | RegularExpressionProtection {0}: nie udało się skompilować obiektu jsonpath {1}. Kontekst {2} | build |
NONPusty przedrostek mapowany do pustego identyfikatora URI | RegularExpressionProtection {0}: niepustego prefiksu {1} nie można zmapować na pusty identyfikator URI | build |
NoPatternsToEnforce | RegularExpressionProtection {0}: brak wzorców do wyegzekwowania w {1} | build |
NothingToEnforce | RegularExpressionProtection{0}: co najmniej jedna z tych wartości: URIPath, QueryParam, Header, FormParam, XMLPayload, JSONPayload | build |
XPathCompilationFailed | RegularExpressionProtection {0}: nie udało się skompilować pliku xpath {1}. Kontekst {2} | build |
Zmienne błędów
Te zmienne są ustawiane, gdy zasada wywołuje błąd. Więcej informacji znajdziesz w artykule Co musisz wiedzieć o błędach związanych z naruszeniem zasad.
Zmienne | Gdzie | Przykład |
---|---|---|
fault.name="fault_name" |
fault_name to nazwa błędu podana w tabeli powyżej. | fault.name Matches "ThreatDetected" |
regularexpressionprotection.policy_name.failed |
policy_name to określona przez użytkownika nazwa zasady, która spowodowała błąd. | regularexpressionprotection.Regular-Expressions-Protection-1.failed = true |