【问题标题】:How to ensure the files is an XML file如何确保文件是 XML 文件
【发布时间】:2023-04-03 19:15:01
【问题描述】:
我对文件及其相关的安全性了解不多。我在 XML 文件中有很多数据,我计划解析这些数据以放入数据库中。我从第 3 方的人那里得到这些 XML 文件。我每天至少会收到大约 1000 个文件。所以我将编写一个脚本来解析它们以输入我们的数据库。现在我对此有很多疑问。
- 我知道如何解析单个文件。而且我可以在一个循环中将逻辑扩展到多个文件。但是,有没有更好的方法来做同样的事情?我如何使用多线程编程同时解析文件中的许多文件。将有一个脚本,给定文件,解析单个文件并输出到数据库。如何使用此脚本解析多线程/并行处理
- 如我所说,该文件来自第三方网站。那么我怎么能确定没有安全漏洞。我的意思是,我不太关心文件安全。但是我需要采取的最低限度的常见基本安全检查是什么?(如网络编程中的 sql 注入和 XSS 非常基本)
- 再次与安全相关:如何确保传入的 XML 文件是 XML 本身。我的意思是我可以使用扩展名,但是当我解析这些文件时,是否有可能注入脚本并使它们运行。以及在解析单个文件时应该采取哪些步骤
【问题讨论】:
标签:
php
xml
multithreading
security
xml-parsing
【解决方案1】:
你想validate the XML。这做了两件事:
- 确保它“格式正确” - 一个有效的 XML 文档
- 确保它是“有效的” - 遵循模式、dtd 或其他定义 - 它具有您希望解析的元素。
在php5 the syntax 中用于验证 XML 文档的是:
$dom->validate('articles.dtd');
$dom->relaxNGValidate('articles.rng');
$dom->schemaValidate('articles.xsd');
当然,您需要一个 XSD(XML 模式)或 DTD(文档类型定义)来进行验证。
【解决方案2】:
我不能说第 1 点,但这听起来相当简单 - 每个文件都可以完全独立解析。
第 2 点和第 3 点实际上是关于文件的内容。简单地说,您可以通过解析它并要求解析器验证它是否是有效的 XML,这就是您需要做的所有事情。如果您期望它遵循特定的 DTD,您可以根据它来验证它。 (有多个级别的验证,具体取决于您的数据。)
XML 文件本身就是数据。虽然有可用作 XML 的“处理指令”,但它们与要执行的直接脚本位的指令方式不同,仅解析文件应该没有害处。恶意文件可能会做的两件事:
- 尝试通过引用巨大外部DTD来发起拒绝服务攻击,这将使解析器使用大量带宽。如果您想防止这种情况,您可以禁用外部 DTD 解析。
- 尝试仅通过非常大来占用大量资源。您始终可以限制脚本将处理的最大文件大小。