【发布时间】:2008-12-12 16:06:48
【问题描述】:
我有用于形成 XPath 查询的输入字段值。 我应该检查输入字符串中的哪些符号以最大程度地减少 XML 注入的可能性?
【问题讨论】:
我有用于形成 XPath 查询的输入字段值。 我应该检查输入字符串中的哪些符号以最大程度地减少 XML 注入的可能性?
【问题讨论】:
这个document 详细描述了“盲 XPath 注入”的概念。
它提供了 XPath 注入的具体示例并讨论了防止这种情况的方法。
在“防御 XPath 注入”一节中说:
"防御 XPath 注入本质上类似于防御 SQL 注射。应用程序必须清理用户输入。具体来说,单双 引号字符应该是不允许的。这可以在应用程序中完成 本身,或在第三方产品中(例如应用程序防火墙)。 测试应用程序对 XPath 注入的敏感性可以通过以下方式轻松执行 注入单引号或双引号,并检查响应。如果有错误 发生了,那么很可能 XPath 注入是可能的。”
正如其他人所说,还应注意使用轴和 // 缩写。如果正在使用XPath 2.0,则不应允许使用doc() 函数,因为它可以访问任何具有已知URI(或文件名)的文档。
建议使用预编译 XPath 表达式的 API,但保留它与动态定义的参数或变量一起工作的可能性。那么用户输入将只定义这些参数的内容,永远不会被视为对已编译表达式的修改。
【讨论】:
颠覆你的策略。
不要试图过滤掉不可接受的字符 - “假设它没问题,除非我知道它不好”
相反,过滤可接受的字符 - “这东西没问题,我会假设其他一切都不好”的策略。
在安全方面,采用“默认拒绝”而不是“默认接受”的策略。
例如...
...如果您要向某人询问搜索词,请说出一个人的名字,请将输入限制为您希望在姓名中找到的字符。
一种方法是限制为 A-Z,然后确保您的搜索技术能够识别重音(例如 i = ì = í = î = ï 等等),尽管这取决于非欧洲命名。
...如果您要一个数字,请限制为数字并拒绝其他所有内容。
【讨论】:
我会先考虑什么是您的特定用例的有效输入,然后,看看限制其他所有内容的方法。如果您有固定范围的条目值,我会将条目限制为这些值。否则,如果您的用例要求您考虑未来,那么您可能需要检查轴修饰符和路径分隔符,例如 : 和 \。
【讨论】:
这取决于您所说的“XML 注入”是什么意思。文档中是否有敏感部分不允许用户查看?或者您是否将其作为可写状态打开并允许用户更新文档的某些部分,而他们应该只被允许更新某些部分?
在基本层面上,要回答您的问题,您至少需要查找 xpath 轴操作(例如 //、/、::)和通配符(@*、*)。但我的感觉是,直接使用用户输入来构建xpath可能不是最优的解决方案。如果您向我们提供更多关于您想要实现的目标的背景信息,我们可能会建议替代方法?
【讨论】:
关闭此漏洞只是一个修补程序。所以现在应用“默认拒绝”策略太危险了。 我决定检查以下符号的输入 [,",',*,=,{,\,.,space。我认为这可以防止最常见的攻击 谢谢大家的解答!
【讨论】:
输入字符串的验证会很有帮助,也许,基于不允许特殊字符使用正则表达式(类似这样的 ^\w+)。
【讨论】: