• 应用软件安全编程--05预防 XML 注入


    如果用户有能力使用结构化XML  文档作为输入,那么他能够通过在数据字段中插入 XML  标签来 重写这个 XML  文档的内容。 XML  解析器会将这些标签按照正常标签进行解析。下面是一段在线商 店的 XML  代码,主要用于查询后台数据库。

    1. <description>Widget
    2. price>
    3. <quantity>1

    恶意用户可以在1.01 会生成以下的 XML  文档:

    1. <description>Widget
    2. price>

    通过使用简单的API 解析器(org.xml.sax and javax.xml.parsers.SAXParser)可以解析该 XML  文 件,如果解析XML  的代码获取的是最后一个元素

    对于预防 XML  注入的情况,示例1给出了不规范用法(Java 语言)示例。示例2给出了规范用法 (Java 语言)示例。

    1. 示例1:
    2. public class OnlineStore {
    3. private static void createXMLStreamBad(final BufferedOutputStreamoutStream, final String quantity) throws IO- Exception {
    4. String xmlString ="Widget
    5. +"+"+ +";
    6. outStream.write(xmlString.getBytes());
    7. outStream.flush();
    8. }

    上面的代码样例中,一个方法简单的使用了字符串拼接来创建一个 XML  查询,然后将其发送到服务器。在这时就有可能出现XML注入问题,因为这个方法没有进行任何输入验证。

    当XML可能已经载入还未处理的输入数据时,一般情况下使用XML模板或者DTD验证 XML。如果还没有创建这样的XML字符串,那么应在创建 XML之前处理输入,这种方式性能较高。

    1. 示例2(输入验证):
    2. public class OnlineStore {
    3. private static void createXMLStream(final BufferedOutputStreamoutStream,
    4. final String quantity) throws IOException, NumberFormatException {
    5. // Write XML string only if quantity is an unsigned integer(count).
    6. int count = Integer.parseUnsignedInt(quantity);
    7. String xmlString ="Widget
    8. +"+"〈quantity)"+         count+";
    9. outStream.write(xmlString.getBytes());
    10. outStream.flush();
    11.  }
    12.  }

    代码的解决方案是验证 quantity 是一个无符号整数。

  • 相关阅读:
    JavaEE-线程基础(上)
    Tips for training DNN
    安卓开发笔记——ListView加载性能优化ViewHolder
    MyCat主从数据库集群搭建
    Linux下socket例子(c/c++)
    COLMAP: Structure-from-Motion Revisited
    【Seata】04 - Seata TCC 模式 Demo 调用流程分析
    Springboot整合常见日志框架
    代码随想录 -- day49 -- 121. 买卖股票的最佳时机 、122.买卖股票的最佳时机II
    教授 Avi Wigderson荣获2023年图灵奖
  • 原文地址:https://blog.csdn.net/wzh305365294/article/details/134238686