您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件。 info
結果
從訊息中擷取資訊 (例如 URI 路徑、查詢參數、標頭、表單參數、變數、XML 酬載或 JSON 酬載),並根據預先定義的規則運算式評估該內容。如果任何指定的規則運算式評估結果為 true,系統就會將郵件視為威脅並拒絕。
影片
如要進一步瞭解規則運算式保護政策,請觀看下列影片。
| 影片 | 說明 |
|---|---|
| 防範 SQL 注入式攻擊 (新版 Edge) | 在 New Edge 體驗的使用者介面中,使用規則運算式防護政策防範 SQL 植入攻擊。 |
| 防範 SQL 注入攻擊 (傳統版 Edge) | 在 Classic Edge UI 中,使用規則運算式防護政策防範 SQL 植入攻擊。 |
範例
GitHub
GitHub 上的 regex-protection 範例說明如何攔截透過查詢參數發出的潛在 SQL 注入攻擊。此外,這個範例也說明瞭設定一般 400 錯誤狀態的最佳做法,可防止駭客從回應中取得任何實用資訊。
JavaScript 納入攻擊防護
<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>
上述範例說明如何使用 RegularExpressionProtection 政策評估 JSON 酬載,防範 JavaScript 插入攻擊。具體來說,我們會根據 <JSONPath>/<Pattern> 中的規則運算式,評估 <JSONPath>/<Expression> 擷取的內容。
如果 <JSONPath>/<Pattern> 中的規則運算式包含 XML 保留字元 (「、&、'、< 或 .),您必須先進行 XML 編碼,再將其納入政策 XML 設定檔。舉例來說,在上述範例中,規則運算式 <\s*script\b[^>]*>[^<]+<\s*\/\s*script\s*> 已 XML 編碼為 <\s*script\b[^>]*>[^<]+<\s*\/\s*script\s*>。
此外,如果規則運算式包含正斜線 (/),您必須將 <JSONPayload> escapeSlashCharacter
屬性設為 true,逸出正斜線。
不區分大小寫的相符項目
不區分大小寫的相符項目是常見的用途。以下範例說明如何使用 (?i) 結構,在規則運算式中達成這項目的。舉例來說,在本範例中,DELETE、delete 和 Delete 會評估為 true。
<Pattern>[\s]*(?i)((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b))</Pattern>
關於規則運算式防護政策
Apigee Edge 可讓您設定規則運算式,在執行階段針對 API 流量進行評估,找出符合特定模式的常見內容層級威脅。
規則運算式 (簡稱 regex) 是一組字串,可指定字串中的模式。規則運算式可讓系統以程式輔助方式評估內容模式。舉例來說,您可以使用規則運算式評估電子郵件地址,確保其結構正確。詳情請參閱 Java 教學課程中的「規則運算式」。
RegularExpressionProtection 最常見的用途是評估 JSON 和 XML 酬載是否含有惡意內容。
沒有任何規則運算式可以完全防範內容型攻擊,因此請結合多種機制,啟用縱深防禦。本節說明排除內容的建議模式。
排除模式範例
政策的 XML 設定檔必須經過 XML 編碼。
| 名稱 | 規則運算式 |
|---|---|
| SQL 注入 |
[\s]*((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b)) |
| 伺服器端包含項目注入 |
<!--#(include|exec|echo|config|printenv)\s+.* XML 編碼: <!--#(include|exec|echo|config|printenv)\s+.* |
| XPath 縮寫語法注入 |
(/(@?[\w_?\w:\*]+(\[[^]]+\])*)?)+ |
| XPath 擴充語法注入 |
/?(ancestor(-or-self)?|descendant(-or-self)?|following(-sibling)) |
| JavaScript 插入 |
<\s*script\b[^>]*>[^<]+<\s*/\s*script\s*> XML 編碼: <\s*script\b[^>]*>[^<]+<\s*/\s*script\s*> |
| Java 例外狀況插入 |
.*?Exception in thread.* |
在含有 XML 或 JSON 酬載的要求中設定 Content-Type 標頭
規則運算式保護政策的酬載可包含下列元素:
-
<XMLPayload>元素:指定需要從 XML 酬載擷取資訊,並根據提供的規則運算式進行評估。如果您在政策中使用
<XMLPayload>,要求中的Content-Type標頭必須是 XML 內容類型,例如application/xml或text/xml。 -
<JSONPayload>元素:指定需要從 JSON 酬載中擷取資訊,並根據提供的規則運算式進行評估。如果在政策中使用
<JSONPayload>,要求的Content-Type標頭必須是 JSON 內容類型,例如application/json。
通常您會設計 API 來接受 XML 或 JSON。不過,API 可能會同時接受這兩者。然後定義使用 <XMLPayload> 和 <JSONPayload> 元素的規則運算式防護政策。根據 Content-Type 標頭的值,特定要求只會套用一個元素。
元素參考資料
元素參考資料說明 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> attributes
<RegularExpressionProtection async="false" continueOnError="false" enabled="true" name="Regular-Expression-Protection-1">
下表說明所有政策父項元素的共同屬性:
| 屬性 | 說明 | 預設 | 存在必要性 |
|---|---|---|---|
name |
政策的內部名稱。 視需要使用 |
不適用 | 必填 |
continueOnError |
如果設為「 如果設為 |
false | 選用 |
enabled |
如要強制執行政策,請設為 設為 |
true | 選用 |
async |
此屬性已淘汰。 |
false | 已淘汰 |
<DisplayName>元素
除 name 屬性外,一併使用
管理 UI Proxy 編輯器,使用不同的自然語言名稱。
<DisplayName>Policy Display Name</DisplayName>
| 預設 |
不適用 如果省略這個元素,政策的 |
|---|---|
| 存在必要性 | 選用 |
| 類型 | 字串 |
<Source> 元素
指出需要擷取資訊的訊息。
如果省略 <Source> 元素,值會預設為 message。例如 <Source>message</Source>。如果設為 message,政策會使用要求訊息做為來源 (附加至要求流程時)。同樣地,如果政策附加至回覆流程,就會使用回覆訊息。
如果無法解析來源訊息,或解析為非訊息類型,政策就會傳回錯誤。
<Source>response</Source>
| 預設值: | N/A |
| 外觀狀態: | 選用 |
| 類型: | 字串 |
<IgnoreUnresolvedVariables> 元素
決定政策在遇到無法解析的變數時,是否會傳回錯誤。
如果設為 false (預設值),當系統遇到無法解析的變數時,這項政策會傳回錯誤。如果設為 true,系統會將未解析的變數視為空字串 (空值)。
<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
| 預設值: | false |
| 外觀狀態: | 選用 |
| 類型: | 布林值 |
<URIPath> 元素
指定要從要求 URI 路徑擷取資訊,並根據提供的規則運算式進行評估。您必須提供至少一個 <Pattern> 元素,指定要比對的規則運算式模式。
<URIPath> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </URIPath>
| 預設值: | N/A |
| 外觀狀態: | 選用 |
| 類型: | N/A |
<QueryParam> 元素
指定需要從要求查詢參數擷取資訊,並根據提供的規則運算式進行評估。您必須提供至少一個 <Pattern> 元素,指定要比對的規則運算式模式。
<QueryParam name="a-query-param"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </QueryParam>
| 預設值: | N/A |
| 外觀狀態: | 選用 |
| 類型: | N/A |
屬性
| 屬性 | 說明 | 預設 | 存在必要性 |
|---|---|---|---|
| 名稱 | 要求查詢參數的名稱,系統會從中擷取資訊,並根據提供的規則運算式進行評估。 | N/A | 必填 |
<Header> 元素
指定需要從要求和回應標頭擷取資訊,並根據提供的規則運算式進行評估。您必須提供至少一個 <Pattern> 元素,指定要比對的規則運算式模式。
<Header name="a-header"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </Header>
| 預設值: | N/A |
| 外觀狀態: | 選用 |
| 類型: | N/A |
屬性
| 屬性 | 說明 | 預設 | 存在必要性 |
|---|---|---|---|
| 名稱 |
要求和回應標頭的名稱,系統會從中擷取資訊,並根據提供的規則運算式進行評估。 |
N/A | 必填 |
<FormParam> 元素
指定需要從要求表單參數擷取資訊,並根據提供的規則運算式進行評估。您必須提供至少一個 <Pattern> 元素,指定要比對的規則運算式模式。
<FormParam name="a-form-param"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </FormParam>
| 預設值: | N/A |
| 外觀狀態: | 選用 |
| 類型: | N/A |
屬性
| 屬性 | 說明 | 預設 | 存在必要性 |
|---|---|---|---|
| 名稱 |
要求表單參數的名稱,系統會從中擷取資訊,並根據提供的規則運算式進行評估。 |
N/A | 必填 |
<Variable> 元素
指定需要從指定變數擷取資訊,並根據提供的規則運算式進行評估。
<Variable name="request.content"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </Variable>
| 預設值: | N/A |
| 外觀狀態: | 選用 |
| 類型: | N/A |
屬性
| 屬性 | 說明 | 預設 | 存在必要性 |
|---|---|---|---|
| 名稱 |
要從中擷取資訊以評估是否符合所提供規則運算式的變數名稱。 |
N/A | 必填 |
<XMLPayload> 元素
指定需要從 XML 酬載擷取資訊,並根據提供的規則運算式進行評估。
<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>
| 預設值: | N/A |
| 外觀狀態: | 選用 |
| 類型: | N/A |
<XMLPayload> 元素/<Namespaces> 元素
指定要在 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>
| 預設值: | N/A |
| 外觀狀態: | 選用 |
| 類型: | 字串 |
<XMLPayload>/<Namespaces>/<Namespace> 元素
指定要在 XPath 評估中使用的每個命名空間。<Namespaces> <Namespace prefix="apigee">http://www.apigee.com</Namespace> </Namespaces>
| 預設值: | N/A |
| 外觀狀態: | 選用 |
| 類型: | 字串 |
屬性
| 屬性 | 說明 | 預設 | 存在必要性 |
|---|---|---|---|
| 前置字串 |
提供前置字元,協助限定特定命名空間。 |
N/A | 必填 |
<XMLPayload>/<XPath> 元素
指定要評估的 XPath。<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
| 預設值: | N/A |
| 外觀狀態: | 選用 |
| 類型: | N/A |
<XMLPayload>/<XPath>/<Expression> element
指定為變數定義的 XPath 運算式。系統僅支援 XPath 1.0 運算式。舉例來說,<Expression>/company/employee[@age>=$request.header.age]</Expression> 會擷取年齡大於或等於 request.header.age 中指定值的員工詳細資料。<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
| 預設值: | N/A |
| 外觀狀態: | 選用 |
| 類型: | 字串 |
<XMLPayload>/<XPath>/<Type> element
指定資料型別。<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
| 預設值: | 字串 |
| 外觀狀態: | 選用 |
| 類型: | 字串 |
| 有效值: |
字串。有效值包括 |
<XMLPayload>/<XPath>/<Pattern> element
定義規則運算式模式。如果 <Pattern> 元素中的規則運算式包含 XML 保留字元 (「"」、「&」、「'」、「<」或「.」),您必須先進行 XML 編碼,才能加入該運算式。
<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
| 預設值: | N/A |
| 外觀狀態: | 必填 |
| 類型: | 字串 |
<JSONPayload> 元素
指定需要從 JSON 酬載擷取資訊,並根據提供的規則運算式進行評估。
<JSONPayload> <JSONPath> <Expression>$.store.book[*].author</Expression> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </JSONPath> </JSONPayload>
| 預設值: | N/A |
| 外觀狀態: | 選用 |
| 類型: | N/A |
屬性
| 屬性 | 說明 | 預設 | 存在必要性 |
|---|---|---|---|
| escapeSlashCharacter |
設為 |
true | 選用 |
<JSONPayload>/<JSONPath>/<Expression> 元素
指定為變數定義的 JSONPath 運算式。
<JSONPath> <Expression>$.store.book[*].author</Expression> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </JSONPath>
| 預設值: | N/A |
| 外觀狀態: | 選用 |
| 類型: | 字串 |
<JSONPayload>/<JSONPath>/<Pattern> element
定義規則運算式模式。如果 <Pattern> 元素中的規則運算式包含 XML 保留字元 (「"」、「&」、「'」、「<」或「.」),您必須先進行 XML 編碼,才能加入該元素。
<JSONPath> <Expression>$.store.book[*].author</Expression> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </JSONPath>
| 預設值: | N/A |
| 外觀狀態: | 必填 |
| 類型: | 字串 |
錯誤參考資料
本節說明這項政策觸發錯誤時,傳回的錯誤代碼和訊息,以及 Edge 設定的錯誤變數。如果您正在開發錯誤規則來處理錯誤,請務必瞭解這項資訊。如要擷取錯誤並引發自訂錯誤,請為政策根元素設定 continueOnError="true" 屬性。詳情請參閱「
政策錯誤須知」和「處理錯誤」。
Edge 政策傳回的錯誤遵循一致的格式,詳情請參閱錯誤代碼參考資料。
執行階段錯誤
執行政策時,可能會發生這些錯誤。
| 錯誤代碼 | 訊息 |
|---|---|
| ExecutionFailed | 無法執行 RegularExpressionProtection StepDefinition {0}。原因:{1} |
| InstantiationFailed | 無法將 RegularExpressionProtection StepDefinition {0} 例項化 |
| NonMessageVariable | 變數「{0}」無法解析為訊息 |
| SourceMessageNotAvailable | {0} 訊息不適用於 RegularExpressionProtection StepDefinition{1} |
| ThreatDetected | 在 {0} 中偵測到規則運算式威脅:規則運算式:{1} 輸入:{2} |
| VariableResolutionFailed | 無法解析變數「{0}」 |
部署錯誤
| 錯誤代碼 | 訊息 | 修正 |
|---|---|---|
| CannotBeConvertedToNodeset | regexProtection {0}:xpath {1} 的結果無法轉換為 nodeset。 內容{2} | build |
| DuplicatePrefix | regexProtection {0}:前置字元重複 {1} | build |
| EmptyJSONPathExpression | regexProtection {0}:空白 JSONPath 運算式 | build |
| EmptyXPathExpression | regexProtection {0}:空白的 XPath 運算式 | build |
| InvalidRegularExpression | regexProtection {0}:無效的規則運算式 {1},內容 {2} | build |
| JSONPathCompilationFailed | regexProtection {0}:無法編譯 jsonpath {1}。內容{2} | build |
| NONEmptyPrefixMappedToEmptyURI | regexProtection {0}:非空白前置字串 {1} 無法對應至空白 URI | build |
| NoPatternsToEnforce | regexProtection {0}:{1} 中沒有可強制執行的模式 | build |
| NothingToEnforce | RegularExpressionProtection {0}:至少須有一個 URIPath、QueryParam、Header、FormParam、XMLPayload 和 JSONPayload | build |
| XPathCompilationFailed | regexProtection {0}:無法編譯 xpath {1}。內容{2} | build |
錯誤變數
系統會在這項政策觸發錯誤時設定這些變數。詳情請參閱「政策錯誤的注意事項」。
| Variables | 地點 | 範例 |
|---|---|---|
fault.name="fault_name" |
fault_name 是錯誤的名稱,如上表所列。 | fault.name Matches "ThreatDetected" |
regularexpressionprotection.policy_name.failed |
policy_name 是擲回錯誤的政策使用者指定的名稱。 | regularexpressionprotection.Regular-Expressions-Protection-1.failed = true |