我有输入字段值用于形成XPath查询。 我应该检查输入字符串中的哪些符号以最小化XML注入的可能性?
答案 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 +)之类的东西,基于不允许使用特殊字符。