Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 他们在我的现场测试中发现了什么;和1=0]|/*|/*[“0”型)_Xml_Xpath - Fatal编程技术网

Xml 他们在我的现场测试中发现了什么;和1=0]|/*|/*[“0”型)

Xml 他们在我的现场测试中发现了什么;和1=0]|/*|/*[“0”型),xml,xpath,Xml,Xpath,我发现有人在我的网站上执行了“test”和1=0]|/*|/*/*[“0”)”,这看起来像XPATH,因为我在我的网站上使用XML,但它实际上意味着什么?这是一个尝试递归获取文档中所有节点的方法(/*部分)。要理解发生了什么,最好通过一个示例 假设您动态构造一个XPath表达式,以按用户输入的文本搜索子节点值。您使用的.XML文档: <root> <node> <subnode>value1</subnode>

我发现有人在我的网站上执行了“test”和1=0]|/*|/*/*[“0”)”,这看起来像XPATH,因为我在我的网站上使用XML,但它实际上意味着什么?

这是一个尝试递归获取文档中所有节点的方法(
/*
部分)。要理解发生了什么,最好通过一个示例

假设您动态构造一个XPath表达式,以按用户输入的文本搜索
子节点
值。您使用的.XML文档:

<root>
    <node>
        <subnode>value1</subnode>
        <subnode>value2</subnode>
    </node>
</root>

价值1
价值2
您有这样一个表达式:
//node[.=“%s”]
其中
%s
是用户输入值的占位符。用户可以输入
value1
,这将生成
//node[.=“value1”]
表达式,该表达式非常安全,并将返回
value1
,好的

但是现在,想象一下,如果用户输入
test”和1=0]|//*|//*[“0
query,您将得到
//节点[.=“test”和1=0]|//*|//*[“0”]
这在语法上也是正确的,但在这种情况下,用户将获得所有节点,包括
根节点
节点
子节点
访问用户不应该访问的内容

让我们分解
//node[.=“test”和1=0]|//*|//*[“0”]
表达式。攻击者使用
test”和1=0]
部分脱离现有条件,并添加
1=0
条件使其与任何内容都不匹配
|
在XPath中表示“或”。
/*
将递归地匹配文档中的每个节点-这就是攻击者的目的所在。需要
/*[“0
部分来保持表达式语法正确并平衡引号


有几种方法可以防止这种情况发生,总结如下:

  • 清理/验证用户输入。至少可以转义引号
  • 使用预编译的XPath表达式:
预编译的XPath在程序执行之前已经预设好了,而不是在用户的输入添加到字符串之后动态创建。这是一个更好的路由,因为您不必担心丢失本应转义的字符

  • 使用参数化XPath表达式:
参数化会将输入限制在某些域中,例如字符串或整数,并且这些域之外的任何输入都被视为无效,查询将失败

另见:


非常感谢,有没有办法确保这种情况不再发生?@AlexBouttelgier好的,当然,用更多的信息和链接更新了答案。好的,谢谢,我是负责网络的人,所以我会把它交给负责网站的人,这是他的问题;)非常感谢你的帮助,我真的很感激。