OWASP网站发布了一系列有关如何保护RESTful服务的步骤。一点是XML DoS保护。现在我不确定以下两个。
根据第一点,如果我在我的XSD架构中应用xs:sequence
,它是否有效:
<xs:complexType name="addressType">
<xs:sequence>
<xs:element name="city" type="addressCity" />
<xs:element name="number" type="addressNumber" />
<xs:element name="street" type="addressStreet" />
<xs:element name="zipCode" type="zipCodeMoreThan4Digits" />
</xs:sequence>
<xs:attribute name="id" type="unsignedInteger" use="required">
</xs:attribute>
</xs:complexType>
现在第二点。如果我应用这样的RegEx就足够了:
<xs:simpleType name="addressCity">
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-ZöäüÖÄÜß -]{2,32}" />
</xs:restriction>
</xs:simpleType>
答案 0 :(得分:1)
XML可以嵌套,无限次。具有深层嵌套标记的XML仍然可以很好地形成,因此解析器将接受它。如果您的解析器是DOM解析器(很可能),它将尝试在内存中构建整个树。如果您的Web服务收到的XML是深度嵌套的,那么您的服务器将耗尽其所有内存并崩溃,然后才能意识到xml消息无效 - &gt; DoS是成功的。 这里的解决方案是尝试在将MXL消息传输到Web服务服务器之前对其进行验证。您可以使用应用程序层网关实现此目的,该网关将XML消息验证为XSD架构。该模式应该只允许所需的嵌套深度。您需要在不构建DOM树的情况下进行此验证,否则最终会遇到相同的问题。
这里我们有类似的攻击类型。 XML的大小会影响DOM解析器的内存消耗。如果在序列中放入许多元素,或者只是将一个元素的文本设置得太长,则可以使XML更大。
<?xml version=”1.0” encoding=”UTF-8”?> xmlsoap.org/soap/envelope/”>
<soap:Envelope xmlns:soap=”http://schemas. xmlsoap.org/soap/envelope/”>
<soap:Body>
<oversize>
<item1>x</item1>
<item1>x</item1>
<item1>x</item1>
<!-- The element <item1> may continue on, until the SOAP message reaches a size of megabytes or even gigabytes -->
</oversize>
</soap:Body>
</soap:Envelope>
OR
<?xml version=”1.0” encoding=”UTF-8”?> xmlsoap.org/soap/envelope/”>
<soap:Envelope xmlns:soap=”http://schemas. xmlsoap.org/soap/envelope/”>
<soap:Header>
<!-- Arbitrary function call -->
</soap:Header>
<soap:oversize>
<item1>x</item1>
<item1>x</item1>
<item1>x</item1>
<!-- The element <item1> may continue on, until the SOAP message reaches a size of megabytes or even gigabytes -->
</soap:oversize>
<soap:Body>
<!-- Arbitrary function call -->
</soap:Body>
</soap:Envelope>
这里的解决方案是使用例如。 maxOccurs的=&#34; 1000&#34;而不是maxOccurs =&#34;无界&#34;在序列元素和限制标签内的文本长度。看看这个:http://clawslab.nds.rub.de/wiki/index.php/Oversize_payload_attack
希望这有帮助!