如何在WSO2 APIM中通过正则或其他方式防范XML/HTML注入?
在WSO2 APIM中防范HTML、脚本、XML及SQL注入的可行方案
当前在WSO2 APIM中使用正则表达式过滤注入风险时,因请求体被封装为XML信封,原始的</、/>及转义后的</、/>等字符无法被正常匹配拦截。结合APIM的特性,可通过以下几种方案实现全面防护:
1. 适配XML转义的正则规则优化
由于请求体被XML封装后,特殊字符会被转义,需调整正则规则覆盖转义后的字符形式,同时优化规则避免误拦截合法请求:
- 针对XML转义字符,补充匹配
</(对应</)、/>(对应/>)、</(十进制转义的</)等多种转义形式 - 优化SQL注入规则,避免直接匹配
SELECT、DELETE等关键词(业务场景可能合法使用),改为匹配带注入特征的模式,比如'.*SELECT、DROP.*--这类组合 - 优化后的示例正则(部分):
<property name="regex" expression="get-property('regex')" value=".*'.*SELECT.*|.*'.*DELETE.*|.*ALTER\s+TABLE.*|.*DROP\s+DATABASE.*|.*</.*|.*>/.*|.*&lt;/.*|.*&#60;/.*|.*<script.*>.*|.*Exception in thread.*|.*#include.*"/>
注:该校验逻辑基于WSO2 APIM网关的RegularExpressionProtector类实现,核心是对请求内容进行全量正则匹配,匹配到风险模式则触发拦截
2. 自定义脚本中介处理XML转义还原
通过Script Mediator在网关层先还原XML转义的请求内容,再执行风险检测,这样可以直接匹配原始危险字符:
- 示例JavaScript脚本(在请求序列中添加):
var payload = mc.getPayloadXML(); var rawContent = payload.toString(); // 还原XML转义字符 var decodedContent = rawContent.replace(/</g, '<').replace(/>/g, '>').replace(/&/g, '&'); // 检测危险模式 var riskyPatterns = /<script.*>|'.*SELECT.*|DROP.*|\/>.*|<\/.*|#exec.*/gi; if(riskyPatterns.test(decodedContent)){ mc.setProperty("HTTP_SC", "403"); mc.setPayloadXML(<error>Request contains malicious content</error>); }
- 该方案可灵活处理不同内容类型的请求,适配JSON、表单等非XML格式的输入校验
3. 启用WSO2 APIM的WAF扩展防护
WSO2 APIM支持集成Web应用防火墙(如ModSecurity),借助成熟的规则集实现标准化防护:
- 启用APIM中的WAF中介,导入OWASP Core Rule Set(CRS)规则,该规则集覆盖了XSS、SQL注入、XML注入、路径遍历等常见攻击场景
- 可根据业务需求自定义WAF规则,比如针对特定API调整规则阈值,避免误拦截
- WAF会自动处理请求的编码、转义问题,无需手动适配XML信封的转义逻辑
4. 后端API的纵深防护
网关防护仅为第一道防线,后端需配合实现安全校验:
- SQL操作强制使用预编译语句(PreparedStatement),禁止直接拼接用户输入生成SQL
- XML处理使用安全解析器,禁用外部实体引用(XXE防护),比如在Java中设置
DocumentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true) - 对用户输入进行类型校验、长度限制,输出内容做HTML/XML编码,避免XSS触发
5. 自定义序列实现精细化校验
创建全局或API级别的自定义序列,针对不同请求类型做针对性校验:
- 对XML请求,使用XPath提取具体节点内容,而非全量匹配XML信封
示例序列配置:
<sequence xmlns="http://ws.apache.org/ns/synapse" name="SecurityValidationSequence"> <property name="requestBody" expression="$body/*"/> <filter regex=".*<script.*>|'.*SELECT.*" source="get-property('requestBody')"> <then> <respond> <payloadFactory media-type="json"> <format>{"error": "Malicious content detected"}</format> </payloadFactory> </respond> </then> </filter> </sequence>
- 将该序列绑定到API的请求流中,实现针对业务数据的精准校验
内容的提问来源于stack exchange,提问作者m.feyzollahi
相关产品推荐
相关产品推荐

