您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件。 info
結果
解決 API 上的 XML 安全漏洞並盡可能降低攻擊的威脅。您也可以選擇根據設定的限制偵測 XML 酬載攻擊。使用下列方法防範 XML 威脅:
- 根據 XML 架構 (
.xsd) 驗證訊息 - 評估訊息內容是否含有要排除的特定關鍵字或模式
- 在剖析郵件前,偵測損毀或格式錯誤的郵件
元素參考資料
元素參考資料說明 XMLThreatProtection 政策的元素和屬性。
<XMLThreatProtection async="false" continueOnError="false" enabled="true" name="XML-Threat-Protection-1"> <DisplayName>XML Threat Protection 1</DisplayName> <NameLimits> <Element>10</Element> <Attribute>10</Attribute> <NamespacePrefix>10</NamespacePrefix> <ProcessingInstructionTarget>10</ProcessingInstructionTarget> </NameLimits> <Source>request</Source> <StructureLimits> <NodeDepth>5</NodeDepth> <AttributeCountPerElement>2</AttributeCountPerElement> <NamespaceCountPerElement>3</NamespaceCountPerElement> <ChildCount includeComment="true" includeElement="true" includeProcessingInstruction="true" includeText="true">3</ChildCount> </StructureLimits> <ValueLimits> <Text>15</Text> <Attribute>10</Attribute> <NamespaceURI>10</NamespaceURI> <Comment>10</Comment> <ProcessingInstructionData>10</ProcessingInstructionData> </ValueLimits> </XMLThreatProtection>
<XMLThreatProtection> 屬性
<XMLThreatProtection async="false" continueOnError="false" enabled="true" name="XML-Threat-Protection-1">
下表說明所有政策父項元素的共同屬性:
| 屬性 | 說明 | 預設 | 存在必要性 |
|---|---|---|---|
name |
政策的內部名稱。 視需要使用 |
不適用 | 必填 |
continueOnError |
如果設為「 如果設為 |
false | 選用 |
enabled |
如要強制執行政策,請設為 設為 |
true | 選用 |
async |
此屬性已淘汰。 |
false | 已淘汰 |
<DisplayName>元素
除 name 屬性外,一併使用
管理 UI Proxy 編輯器,使用不同的自然語言名稱。
<DisplayName>Policy Display Name</DisplayName>
| 預設 |
不適用 如果省略這個元素,政策的 |
|---|---|
| 存在必要性 | 選用 |
| 類型 | 字串 |
<NameLimits> 元素
指定政策要檢查及強制執行的字元限制。
<NameLimits> <Element>10</Element> <Attribute>10</Attribute> <NamespacePrefix>10</NamespacePrefix> <ProcessingInstructionTarget>10</ProcessingInstructionTarget> </NameLimits>
| 預設值: | N/A |
| 外觀狀態: | 選用 |
| 類型: | N/A |
<NameLimits>/<Element> 元素
指定 XML 文件中任何元素名稱允許的字元數上限。
舉例來說,請參考下列 XML:
<book category="WEB"> <title>Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> </book>
分析上述 XML 時,下方政策程式碼片段中的 <Element> 元素值會驗證元素名稱 (book、title、author 和 year)) 不超過 10 個字元。
<NameLimits> <Element>10</Element> <Attribute>10</Attribute> <NamespacePrefix>10</NamespacePrefix> <ProcessingInstructionTarget>10</ProcessingInstructionTarget> </NameLimits>
| 預設值: | 如未指定限制,系統會套用預設值 -1,這相當於沒有限制。 |
| 外觀狀態: | 選用 |
| 類型: | 整數 |
<NameLimits>/<Attribute> 元素
指定 XML 文件中任何屬性名稱允許的字元數上限。
舉例來說,請參考下列 XML:
<book category="WEB"> <title>Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> </book>
分析上述 XML 時,下方政策程式碼片段中的 <Attribute> 元素值會驗證屬性名稱 category 不超過 10 個字元。
<NameLimits> <Element>10</Element> <Attribute>10</Attribute> <NamespacePrefix>10</NamespacePrefix> <ProcessingInstructionTarget>10</ProcessingInstructionTarget> </NameLimits>
| 預設值: | 如未指定限制,系統會套用預設值 -1,這相當於沒有限制。 |
| 外觀狀態: | 選用 |
| 類型: | 整數 |
<NameLimits> 元素/<NamespacePrefix>
指定 XML 文件中命名空間前置字元允許的字元數上限。
舉例來說,請參考下列 XML:
<ns1:myelem xmlns:ns1="http://ns1.com"/>
分析上述 XML 時,以下政策程式碼片段中的 <NamespacePrefix> 元素值會驗證命名空間前置字元 ns1 是否超過 10 個字元。
<NameLimits> <Element>10</Element> <Attribute>10</Attribute> <NamespacePrefix>10</NamespacePrefix> <ProcessingInstructionTarget>10</ProcessingInstructionTarget> </NameLimits>
| 預設值: | 如未指定限制,系統會套用預設值 -1,這相當於沒有限制。 |
| 外觀狀態: | 選用 |
| 類型: | 整數 |
<NameLimits> 元素/<ProcessingInstructionTarget>
指定 XML 文件中任何處理指令目標允許的字元數上限。
舉例來說,請參考下列 XML:
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
分析上述 XML 時,以下政策程式碼片段中的 <ProcessingInstructionTarget> 元素值會驗證處理指令目標 xml-stylesheet 不超過 10 個字元。
<NameLimits> <Element>10</Element> <Attribute>10</Attribute> <NamespacePrefix>10</NamespacePrefix> <ProcessingInstructionTarget>10</ProcessingInstructionTarget> </NameLimits>
| 預設值: | 如未指定限制,系統會套用預設值 -1,這相當於沒有限制。 |
| 外觀狀態: | 選用 |
| 類型: | 整數 |
<Source> 元素
要篩選 XML 酬載攻擊的訊息。這項設定最常設為 request,因為您通常需要驗證來自用戶端應用程式的連入要求。如果設為 message,這個元素會自動評估要求訊息 (附加至要求流程時) 和回應訊息 (附加至回應流程時)。
<Source>request</Source>
| 預設值: | 申請。 |
| 外觀狀態: | 選用 |
| 類型: |
字串。 選取 |
<StructuralLimits> 元素
指定政策要檢查及強制執行的結構限制。
<StructureLimits> <NodeDepth>5</NodeDepth> <AttributeCountPerElement>2</AttributeCountPerElement> <NamespaceCountPerElement>3</NamespaceCountPerElement> <ChildCount includeComment="true" includeElement="true" includeProcessingInstruction="true" includeText="true">3</ChildCount> </StructureLimits>
| 預設值: | N/A |
| 外觀狀態: | 選用 |
| 類型: | N/A |
<StructuralLimits>/<NodeDepth> 元素
指定 XML 中允許的最大節點深度。
<StructureLimits> <NodeDepth>5</NodeDepth> <AttributeCountPerElement>2</AttributeCountPerElement> <NamespaceCountPerElement>3</NamespaceCountPerElement> <ChildCount includeComment="true" includeElement="true" includeProcessingInstruction="true" includeText="true">3</ChildCount> </StructureLimits>
| 預設值: | 如未指定限制,系統會套用預設值 -1,這相當於沒有限制。 |
| 外觀狀態: | 選用 |
| 類型: |
整數 |
<StructuralLimits>/<AttributeCountPerElement> 元素
指定任何元素允許的屬性數量上限。
舉例來說,請參考下列 XML:
<book category="WEB"> <title>Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> </book>
<AttributeCountPerElement> 元素值會驗證 book、title、author 和 year 元素各自的屬性數量是否超過 2 個。請注意,用於定義命名空間的屬性不會計入。
<StructureLimits> <NodeDepth>5</NodeDepth> <AttributeCountPerElement>2</AttributeCountPerElement> <NamespaceCountPerElement>3</NamespaceCountPerElement> <ChildCount includeComment="true" includeElement="true" includeProcessingInstruction="true" includeText="true">3</ChildCount> </StructureLimits>
| 預設值: | 如未指定限制,系統會套用預設值 -1,這相當於沒有限制。 |
| 外觀狀態: | 選用 |
| 類型: |
整數 |
<StructuralLimits>/<NameSpaceCountPerElement> 元素
指定任何元素允許的命名空間定義數量上限。
舉例來說,請參考下列 XML:
<e1 attr1="val1" attr2="val2">
<e2 xmlns="http://apigee.com" xmlns:yahoo="http://yahoo.com" one="1" yahoo:two="2"/>
</e1>分析上述 XML 時,以下政策程式碼片段中的 <NamespaceCountPerElement> 元素值會驗證 e1 和 e2 元素是否各自有多個 2 命名空間定義。在本例中,<e1> 有 0 個命名空間定義,而 <e2> 有 2 個命名空間定義:xmlns="http://apigee.com" 和 xmlns:yahoo="http://yahoo.com"。
<StructureLimits> <NodeDepth>5</NodeDepth> <AttributeCountPerElement>2</AttributeCountPerElement> <NamespaceCountPerElement>3</NamespaceCountPerElement> <ChildCount includeComment="true" includeElement="true" includeProcessingInstruction="true" includeText="true">3</ChildCount> </StructureLimits>
| 預設值: | 如未指定限制,系統會套用預設值 -1,這相當於沒有限制。 |
| 外觀狀態: | 選用 |
| 類型: |
整數 |
<StructuralLimits>/<ChildCount> 元素
指定任何元素允許的子項元素數量上限。
<StructureLimits> <NodeDepth>5</NodeDepth> <AttributeCountPerElement>2</AttributeCountPerElement> <NamespaceCountPerElement>3</NamespaceCountPerElement> <ChildCount includeComment="true" includeElement="true" includeProcessingInstruction="true" includeText="true">3</ChildCount> </StructureLimits>
| 預設值: | 如未指定限制,系統會套用預設值 -1,這相當於沒有限制。 |
| 外觀狀態: | 選用 |
| 類型: |
整數 |
屬性
| 屬性 | 預設 | 存在必要性 |
|---|---|---|
| includeComment | true | 選用 |
| includeElement | true | 選用 |
| includeProcessingInstructions | true | 選用 |
| includeText | true | 選用 |
<ValueLimits> 元素
指定政策檢查及強制執行的值字元限制。
<ValueLimits> <Text>15</Text> <Attribute>10</Attribute> <NamespaceURI>10</NamespaceURI> <Comment>10</Comment> <ProcessingInstructionData>10</ProcessingInstructionData> </ValueLimits>
| 預設值: | N/A |
| 外觀狀態: | 選用 |
| 類型: |
N/A |
<ValueLimits> 元素/<Text> 元素
指定 XML 文件中任何文字節點的字元限制。
舉例來說,請參考下列 XML:
<book category="WEB"> <title>Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> </book>
<Text> 元素值會驗證元素文字值 Learning XML、Erik T.
Ray, 和 2003 是否未超過 15 個字元。<ValueLimits> <Text>15</Text> <Attribute>10</Attribute> <NamespaceURI>10</NamespaceURI> <Comment>10</Comment> <ProcessingInstructionData>10</ProcessingInstructionData> </ValueLimits>
| 預設值: | 如未指定限制,系統會套用預設值 -1,這相當於沒有限制。 |
| 外觀狀態: | 選用 |
| 類型: |
整數 |
<ValueLimits> 元素/<Attribute> 元素
指定 XML 文件中任何屬性值的字元限制。
舉例來說,請參考下列 XML:
<book category="WEB"> <title>Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> </book>
<Attribute> 元素值會驗證屬性值 WEB 是否未超過 10 個字元。<ValueLimits> <Text>15</Text> <Attribute>10</Attribute> <NamespaceURI>10</NamespaceURI> <Comment>10</Comment> <ProcessingInstructionData>10</ProcessingInstructionData> </ValueLimits>
| 預設值: | 如未指定限制,系統會套用預設值 -1,這相當於沒有限制。 |
| 外觀狀態: | 選用 |
| 類型: |
整數 |
<ValueLimits>/<NamespaceURI> 元素
指定 XML 文件中任何命名空間 URI 的字元限制。
舉例來說,請參考下列 XML:
<ns1:myelem xmlns:ns1="http://ns1.com"/>
<NamespaceURI> 元素值會驗證命名空間 URI 值 http://ns1.com 是否超過 10 個字元。
<ValueLimits> <Text>15</Text> <Attribute>10</Attribute> <NamespaceURI>10</NamespaceURI> <Comment>10</Comment> <ProcessingInstructionData>10</ProcessingInstructionData> </ValueLimits>
| 預設值: | 如未指定限制,系統會套用預設值 -1,這相當於沒有限制。 |
| 外觀狀態: | 選用 |
| 類型: |
整數 |
<ValueLimits> 元素/<Comment> 元素
指定 XML 文件中任何註解的字元限制。
舉例來說,請參考下列 XML:
<book category="WEB"> <!-- This is a comment --> <title>Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> </book>
<Comment> 元素值會驗證註解文字 This is a comment 是否超過 10 個字元。
<ValueLimits> <Text>15</Text> <Attribute>10</Attribute> <NamespaceURI>10</NamespaceURI> <Comment>10</Comment> <ProcessingInstructionData>10</ProcessingInstructionData> </ValueLimits>
| 預設值: | 如未指定限制,系統會套用預設值 -1,這相當於沒有限制。 |
| 外觀狀態: | 選用 |
| 類型: |
整數 |
<ValueLimits>/<ProcessingInstructionData> 元素
指定 XML 文件中任何處理指令文字的字元限制。
舉例來說,請參考下列 XML:
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<ProcessingInstructionData> 元素值會驗證處理指令文字 type="text/xsl" href="style.xsl" 是否未超過 10 個字元。<ValueLimits> <Text>15</Text> <Attribute>10</Attribute> <NamespaceURI>10</NamespaceURI> <Comment>10</Comment> <ProcessingInstructionData>10</ProcessingInstructionData> </ValueLimits>
| 預設值: | 如未指定限制,系統會套用預設值 -1,這相當於沒有限制。 |
| 外觀狀態: | 選用 |
| 類型: |
整數 |
錯誤參考資料
本節說明在這項政策觸發錯誤時,所傳回的錯誤代碼和錯誤訊息,以及 Edge 所設定的錯誤變數。 請務必瞭解這份資訊,以便瞭解您是否要擬定錯誤規則, 處理錯誤詳情請參閱這篇文章 瞭解政策錯誤和處理方式 發生錯誤
執行階段錯誤
執行政策時,可能會發生這些錯誤。
| 錯誤程式碼 | HTTP 狀態 | 原因 | 修正 |
|---|---|---|---|
steps.xmlthreatprotection.ExecutionFailed |
500 | XMLThreatProtection 政策可能會擲回許多不同類型的 Execution 失敗錯誤。 這類錯誤大多會在超過政策中設定的特定門檻時發生。這些 錯誤類型包括: 元素名稱長度 子項數量、 節點深度 屬性計數、 屬性名稱長度 以及其他許多工具如要查看完整清單,請參閱「排解 XMLThreatProtection 政策執行階段錯誤疑難排解」主題。 | build |
steps.xmlthreatprotection.InvalidXMLPayload |
500 |
如果 XMLThreatProtection 政策的 <Source> 元素指定的輸入訊息酬載不是有效的 XML 文件,就會發生這個錯誤。
|
build |
steps.xmlthreatprotection.SourceUnavailable |
500 |
如果系統傳回這個錯誤,表示 message
<Source> 元素中指定的變數為以下任一種形式:
|
build |
steps.xmlthreatprotection.NonMessageVariable |
500 |
如果 <Source> 元素設為變數,
非類型
訊息。
|
build |
注意:
- 錯誤名稱「 ExecutionFailed」是預設錯誤名稱。不論 偵測到的錯誤類型;但只要設定一個 機構層級資源設定這個屬性後,錯誤名稱將反映實際的 錯誤。例如「TextExceeded」或「AttrValueExceeded」請參閱「使用注意事項」 詳細資料。
- 預設值為 500 HTTP 狀態。但可以將 HTTP 狀態 來要求流程錯誤。請參閱「使用注意事項」 詳細資料。
部署錯誤
無。
錯誤變數
系統會在發生執行階段錯誤時設定這些變數。詳情請參閱重要須知 政策錯誤。
錯誤回應範例
{ "fault": { "faultstring": "XMLThreatProtection[XPT-SecureRequest]: Execution failed. reason: XMLThreatProtection[XTP-SecureRequest]: Exceeded object entry name length at line 2", "detail": { "errorcode": "steps.xmlthreatprotection.ExecutionFailed" } } }
錯誤規則範例
<FaultRule name="XML Threat Protection Policy Faults">
<Step>
<Name>AM-CustomErrorResponse</Name>
<Condition>(fault.name Matches "ExecutionFailed") </Condition>
</Step>
<Condition>(xmlattack.XPT-SecureRequest.failed = true) </Condition>
</FaultRule>結構定義
使用須知
接收線上資料的伺服器都可能遭到攻擊,無論是惡意或無意。 部分攻擊會利用 XML 的彈性建構無效文件,藉此破壞後端系統。如果 XML 文件損毀或極為複雜,伺服器可能會分配超過可用量的記憶體,導致 CPU 和記憶體資源耗盡、剖析器停止運作,以及一般訊息處理作業遭到停用,進而造成應用程式層級的阻斷服務攻擊。
威脅保護措施錯誤設定
為這項政策建立 FaultRule 時的重要資訊:根據預設,如果訊息無法通過 JSON 或 XML 威脅防護政策,Edge 會擲回 HTTP 500 內部伺服器錯誤狀態碼和 ExecutionFailed 錯誤碼。您可以透過新的機構層級屬性變更這項錯誤行為。將機構屬性 features.isPolicyHttpStatusEnabled 設為 true 時,會發生下列行為:
- 要求:如果任何要求流程附加了威脅防護政策,無效訊息會傳回 400 Bad Request 狀態碼,以及相應的政策錯誤代碼 (而非僅傳回 ExecutionFailed)。
- 回應:如果任何回應流程附加了威脅防護政策,無效訊息仍會傳回 500 Internal Server Error 狀態碼,並擲回其中一個對應的政策錯誤碼 (而非僅擲回 ExecutionFailed)。
Cloud 客戶必須與 Apigee Edge 支援團隊聯絡,才能設定機構屬性。