当前位置: 首页 > news >正文

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

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

<item)<description>Widget</description)<price)500.0</price><quantity>1</quantity)</item)

恶意用户可以在<quantity)元素中输入以下字符串:1</quantity)<price>1.0</price〉<quantity>1 会生成以下的 XML  文档:

<item)<description>Widget</description)<price)500.0</price><quantity)1</quantity)<price)1.0</price 〉<quantity)1</quantity)</item)

通过使用简单的API 解析器(org.xml.sax and javax.xml.parsers.SAXParser)可以解析该 XML  文 件,如果解析XML  的代码获取的是最后一个元素<price)的值,那么商品价格就被设置为1.0。

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

示例1:public class OnlineStore {private static void createXMLStreamBad(final BufferedOutputStreamoutStream, final String quantity) throws IO- Exception {String xmlString ="<item 〉\n(description>Widget</description)\n"+"<price)500</price 〉\n"+"<quantity)"+ +"</quantity)</item)";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 ="<item 〉\n(description>Widget</description)\n"+"<price)500(/price 〉\n"+"〈quantity)"+         count+"</quantity)</item)";outStream.write(xmlString.getBytes());outStream.flush();}}

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

http://www.lryc.cn/news/219762.html

相关文章:

  • JavaEE-博客系统3(功能设计)
  • 椭圆滤波器
  • Mac 下安装golang环境
  • 前端面试大纲
  • CAN(Controller Area Network)是一种用于在汽车和工业领域中进行通信的串行总线系统(附加案例)
  • 代码随想录day53|1143.最长公共子序列、 1035.不相交的线、 53. 最大子序和
  • xilinx fpga ddr mig axi
  • 《golang设计模式》第三部分·行为型模式-04-迭代器模式(Iterator)
  • python加上ffmpeg实现音频分割
  • LLM之Prompt(一):5个Prompt高效方法在文心一言3.5的测试对比
  • TreeBERT:基于树的编程语言预训练模型。
  • 生成小程序的二维码的base64码(中间logo可以自定义)
  • 【音视频 | Ogg】Ogg封装格式详解——包含Ogg封装过程、数据包(packet)、页(page)、段(segment)等
  • ubuntu 22.04 安装ros2 iron
  • PHP语言、B/S手术麻醉临床信息管理系统源码
  • Win11安装网络打印机
  • 逆向学习记录(3)工具介绍jadx、gda和jeb
  • C#,数值计算——偏微分方程,Mglin的计算方法与源程序
  • 一机服务万人,拓世法宝AI智能商业数字人一体机,解锁文旅新表达
  • 【源码解析】聊聊SpringBean是如何初始化和创建
  • 【0基础学Java第六课】-- 数组的定义与使用
  • 后台项目Gradle打包jar,不包含依赖jar并放到外部路径
  • NSSCTF web刷题记录4
  • 什么是大模型?一文读懂大模型的基本概念
  • 数据结构之队的实现
  • 【实战Flask API项目指南】之三 路由和视图函数
  • mediasoup udp端口分配策略
  • 山西电力市场日前价格预测【2023-11-07】
  • Microsoft Dynamics 365 CE 扩展定制 - 5. 外部集成
  • 手机升级STM32单片机,pad下载程序,手机固件升级单片机,局域网程序下载,STM32单片机远程下载升级