如何避免XML注入

时间:2008-12-12 16:06:49

标签: .net xml

我有输入字段值用于形成XPath查询。 我应该检查输入字符串中的哪些符号以最小化XML注入的可能性?

6 个答案:

答案 0 :(得分:7)

这个document详细描述了“盲目XPath注入”的概念。

它提供了XPath注入的具体示例,并讨论了防止这种情况的方法。

在“防范XPath注入”一节中,有人说:

防御XPath注入基本上类似于防御SQL 注射。应用程序必须清理用户输入。具体来说,单和双 引号字符应该被禁止。这可以在应用程序中完成 本身,或在第三方产品(例如应用程序防火墙)。 测试应用程序对XPath注入的敏感性可以很容易地执行 注入单引号或双引号,并检查响应。如果有错误 发生了,那么很可能是XPath注入。“

正如其他人所说,还应该注意使用轴和//缩写。如果正在使用XPath 2.0,则不应允许doc()函数,因为它允许访问具有已知URI(或文件名)的任何文档。

建议使用预编译XPath表达式的API,但可以使用动态定义的参数或变量。然后,用户输入将仅定义这些参数的内容,并且永远不会被视为已编译表达式的修改。

答案 1 :(得分:6)

将你的战术颠倒过来。

不要试图过滤掉不可接受的字符 - 的政策“假设它没问题,除非我知道它不好”

相反,过滤掉可接受的字符 - 的政策“这个东西没问题,我会假设其他一切都不好”

在安全方面,采用“默认拒绝”政策,而不是“默认接受”

例如......

...如果您要求某人提供搜索字词,请说出人名,请将输入限制为您希望在姓名中找到的字符。

一种方法是限制AZ,然后确保您的搜索技术具有重音感知(例如i =ì=í=î=ï等),尽管这取决于非欧洲命名。

...如果你要求一个数字,只限数字并拒绝其他一切。

答案 2 :(得分:1)

我首先考虑什么是您的特定用例的有效输入,然后查看限制其他所有内容的方法。如果您有一个固定范围的条目值,我会将条目限制为这些值。否则,如果您的用例要求您考虑未来,那么您可能需要检查轴修改器和路径分隔符,例如:\

答案 3 :(得分:1)

这取决于'XML注入'的含义。文档的某些部分是否敏感且不允许用户查看?或者您是将其打开为可写状态并允许用户更新文档的某些部分,并且只允许他们更新某些部分?

在基本级别回答您的问题,您需要查找xpath轴操作(例如///::)和通配符(@*,{{ 1}})作为最低限度。但我的感觉是使用用户输入直接构建xpath可能不是最佳解决方案。也许如果你给我们更多关于你想要达到的目标的背景,我们可以建议其他方法吗?

答案 4 :(得分:0)

关闭此漏洞只是一个修补程序。所以应用政策“默认拒绝”现在太危险了。 我决定检查输入以下符号[,“,',*,=,{,\,。,space。我认为这可以防止最常见的攻击 谢谢大家的答案!

答案 5 :(得分:0)

输入字符串的验证可能会有所帮助,可能会使用正则表达式(类似于^ \ w +)之类的东西,基于不允许使用特殊字符。