如果用户有能力使用结构化XML 文档作为输入,那么他能够通过在数据字段中插入 XML 标签来 重写这个 XML 文档的内容。 XML 解析器会将这些标签按照正常标签进行解析。下面是一段在线商 店的 XML 代码,主要用于查询后台数据库。
-
- <description>Widget
-
price> -
- <quantity>1
-
-
恶意用户可以在1.01 会生成以下的 XML 文档:
-
- <description>Widget
-
price> -
-
-
通过使用简单的API 解析器(org.xml.sax and javax.xml.parsers.SAXParser)可以解析该 XML 文 件,如果解析XML 的代码获取的是最后一个元素
对于预防 XML 注入的情况,示例1给出了不规范用法(Java 语言)示例。示例2给出了规范用法 (Java 语言)示例。
- 示例1:
-
- public class OnlineStore {
-
- private static void createXMLStreamBad(final BufferedOutputStreamoutStream, final String quantity) throws IO- Exception {
-
- String xmlString ="
- Widget
-
- +"
+"+ +" ; -
- outStream.write(xmlString.getBytes());
-
- outStream.flush();
-
- }
-
- }
上面的代码样例中,一个方法简单的使用了字符串拼接来创建一个 XML 查询,然后将其发送到服务器。在这时就有可能出现XML注入问题,因为这个方法没有进行任何输入验证。
当XML可能已经载入还未处理的输入数据时,一般情况下使用XML模板或者DTD验证 XML。如果还没有创建这样的XML字符串,那么应在创建 XML之前处理输入,这种方式性能较高。
- 示例2(输入验证):
-
- public class OnlineStore {
-
- private static void createXMLStream(final BufferedOutputStreamoutStream,
-
- final String quantity) throws IOException, NumberFormatException {
-
- // Write XML string only if quantity is an unsigned integer(count).
-
- int count = Integer.parseUnsignedInt(quantity);
-
- String xmlString ="
- Widget
-
- +"
+"〈quantity)"+ count+"; -
- outStream.write(xmlString.getBytes());
-
- outStream.flush();
-
- }
-
- }
代码的解决方案是验证 quantity 是一个无符号整数。
-
相关阅读:
多探头高频读写器|读卡器CK-FR104ANS系列安装与新旧功能对比分析
统计十进制数对应二进制数中1的个数
煤矿视频监控分析系统
Navicat的使用--mysql
Golang 的三个核心调度模块:G、M 和 P
大学生期末网页大作业:基于HTML+CSS+JavaScript蓝色的汽车设备营销企业网站模板13页面
力扣1.两数之和(JavaScript版本)
TASK04分组|joyfulpandas
使用React和ResizeObserver实现自适应ECharts图表
博客项目(前后端分离)(servlet实战演练)
-
原文地址:https://blog.csdn.net/wzh305365294/article/details/134238686