本节讨论MySQL中的XML和相关功能。
可以从MySQL中获得xml格式的输出<一个class="link" href="//www.delbede.com/doc/refman/en/mysql.html" title="">mysql而且<一个class="link" href="//www.delbede.com/doc/refman/en/mysqldump.html" title="">, mysqldump方法调用客户端<一个class="link" href="//www.delbede.com/doc/refman/en/mysql-command-options.html">——xml
选择。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/mysql.html" title="第4.5.1节,mysql命令行客户端">第4.5.1节,mysql命令行客户端一个>,<一个class="xref" href="//www.delbede.com/doc/refman/en/mysqldump.html" title="“mysqldump -一个数据库备份程序”4.5.4节">”, mysqldump-一个数据库备份程序”4.5.4节一个>.
有两个函数提供基本的XPath 1.0 (XML路径语言,版本1.0)功能。本节稍后将提供关于XPath语法和用法的一些基本信息;然而,对这些主题的深入讨论超出了本手册的范围,您应该参考<一个class="ulink" href="http://www.w3.org/TR/xpath" target="_top">XML路径语言(XPath) 1.0标准一个>明确的信息。对于那些刚刚接触XPath或希望复习基础知识的人来说,一个有用的参考资料是<一个class="ulink" href="http://www.zvon.org/xxl/XPathTutorial/" target="_top">Zvon.org XPath教程一个>这本书有几种语言版本。
这些功能仍在开发中。在MySQL 8.0及以后版本中,我们将继续改进XML和XPath功能的这些方面和其他方面。您可以讨论这些问题,询问关于它们的问题,并从其他用户那里获得帮助<一个class="ulink" href="https://forums.mysql.com/list.php?44" target="_top">MySQL XML用户论坛一个>.
与这些函数一起使用的XPath表达式支持用户变量和本地存储程序变量。弱检查用户变量;对存储程序的本地变量进行强检查(参见Bug #26518):
用户变量(弱检查)。使用语法的变量$ @
(即,用户变量)不被检查。如果变量的类型错误或之前没有分配值,服务器不会发出警告或错误。这也意味着用户要对任何排版错误负全部责任,因为如果(例如)variable_name
@myvairable美元
在哪里使用@myvariable美元
的目的是。
例子:
mysql> SET @xml = 'XY';查询OK, 0 rows affected (0.00 sec) mysql> SET @i =1, @j = 2;查询OK, 0 rows affected (0.00 sec) mysql> SELECT @i, ExtractValue(@xml, '//b[$@i]');+------+--------------------------------+ | @ 我| ExtractValue (@xml, ' / / b [@i美元 ]') | +------+--------------------------------+ | 1 | X | +------+--------------------------------+ 1行集(0.00秒)mysql >选择@j ExtractValue (@xml, ' / / b (@j美元)');+------+--------------------------------+ | @ j | ExtractValue (@xml, ' / / b [@j美元 ]') | +------+--------------------------------+ | 2 | Y | +------+--------------------------------+ 1行集(0.00秒)mysql >选择@k ExtractValue (@xml, ' / / b (@k美元)');+------+--------------------------------+ | @ k | ExtractValue (@xml, ' / / b [@k美元 ]') | +------+--------------------------------+ | 零 | | +------+--------------------------------+ 1行集(0.00秒)
存储程序中的变量(强检查)。使用语法的变量$
当在存储程序中调用这些函数时,可以与它们一起声明和使用。这类变量是定义它们的存储程序的局部变量,并对其类型和值进行强检查。variable_name
例子:
mysql> DELIMITER | mysql> CREATE PROCEDURE myproc () -> BEGIN -> DECLARE i INT DEFAULT 1;- >声明xml VARCHAR(25)默认的< > X < / > < > Y < / > < > Z < / > ';-> -> WHILE i < 4 DO -> SELECT xml, i, ExtractValue(xml, '//a[$i]');SET i = i+1;- >结束时;-> END | Query OK, 0 rows affected (0.01 sec) mysql> DELIMITER;mysql >调用myproc ();+--------------------------+---+------------------------------+ | xml | | ExtractValue (xml / / [$ i ]') | +--------------------------+---+------------------------------+ | < X > < / > < > Y < / > < > Z < / > | 1 | X | +--------------------------+---+------------------------------+ 1行组(0.00秒 ) +--------------------------+---+------------------------------+ | xml | | ExtractValue (xml、/ / [$ i ]') | +--------------------------+---+------------------------------+ | < X > < / > < > Y < / > < > Z < / > | 2 | Y | +--------------------------+---+------------------------------+ 1行组(0.01秒 ) +--------------------------+---+------------------------------+ | xml | | ExtractValue (xml / / [$ i ]') | +--------------------------+---+------------------------------+ | < X > < / > < > Y < / > < > Z < / > | 3 | Z | +--------------------------+---+------------------------------+ 1行集(0.01秒)
参数。在作为参数传入的存储例程中XPath表达式中使用的变量也受到强检查。
包含用户变量或存储程序本地变量的表达式必须符合XPath 1.0规范中给出的包含变量的XPath表达式规则(符号除外)。
用于存储XPath表达式的用户变量被视为空字符串。因此,不可能将XPath表达式存储为用户变量。(错误# 32911)
ExtractValue (
xml_frag
,xpath_expr
)
ExtractValue ()
接受两个字符串参数,即XML标记的一个片段xml_frag
和XPath表达式xpath_expr
(也称为a定位器);它返回文本(CDATA
)的第一个文本节点,它是XPath表达式匹配的元素的子元素。
方法执行匹配xpath_expr
后追加/ text ()
.换句话说,<一个class="link" href="//www.delbede.com/doc/refman/en/xml-functions.html">ExtractValue(“< > < b > Sakila < / b > < / > ', ' / a / b ')
而且<一个class="link" href="//www.delbede.com/doc/refman/en/xml-functions.html">ExtractValue(“< > < b > Sakila < / b > < / > ', ' / a / b / text()”)
产生相同的结果。
如果找到多个匹配项,则将每个匹配元素的第一个子文本节点的内容(按照匹配的顺序)作为一个空格分隔的字符串返回。
如果没有为表达式(包括隐式/ text ()
)——不管什么原因,只要xpath_expr
是有效的,xml_frag
由正确嵌套和关闭的元素组成—返回空字符串。在空元素上的匹配和根本不匹配之间没有区别。这是设计好的。
如果您需要确定是否没有找到匹配的元素xml_frag
或者找到了这样的元素但不包含子文本节点,则应该测试使用XPath的表达式的结果count ()
函数。例如,这两个语句都返回一个空字符串,如下所示:
mysql >选择ExtractValue(“< > < / b > < / > ', ' / a / b ');+-------------------------------------+ | ExtractValue(“< > < / b > < / > ', ' / a / b ') | +-------------------------------------+ | | +-------------------------------------+ 1行组(0.00秒)mysql >选择ExtractValue(“<一> < c / > < / > ', ' / a / b ');+-------------------------------------+ | ExtractValue(“< > < c / > < / > ', ' / a / b ') | +-------------------------------------+ | | +-------------------------------------+ 1行集(0.00秒)
但是,您可以使用以下命令确定是否存在匹配的元素:
mysql >选择ExtractValue(“< > < / b > < / > ', '计数(/ a / b) ');+-------------------------------------+ | ExtractValue(“< > < / b > < / > ', '计数(/ a / b )') | +-------------------------------------+ | 1 | +-------------------------------------+ 1行组(0.00秒)mysql >选择ExtractValue(“<一> < c / > < / > ', '计数(/ a / b) ');+-------------------------------------+ | ExtractValue(“< > < c / > < / > ', '计数(/ a / b )') | +-------------------------------------+ | 0 | +-------------------------------------+ 1行集(0.01秒)
ExtractValue ()
只返回CDATA
,并且不返回匹配标记中可能包含的任何标记,也不返回它们的任何内容(请参阅返回的结果为val1
在下面的例子中)。
mysql >选择- > ExtractValue(“< > ccc ddd < / b > < b > < / > ', ' / '), val1 - > ExtractValue (ccc < b > ddd的<一> < / b > < / > ', ' / a / b”)作为val2,——> ExtractValue (ccc < b > ddd的<一> < / b > < / > ', / / b) val3,——> ExtractValue (ccc < b > ddd的<一> < / b > < / > ', / b) val4,——> ExtractValue (ccc < b > ddd的<一> < / b > < b > eee < / b > < / > ', / / b) val5;+------+------+------+------+---------+ | val1 | val2 | val3 | val4 | val5 | +------+------+------+------+---------+ | ddd eee ccc ddd ddd | | | | | +------+------+------+------+---------+
此函数使用当前SQL排序规则进行比较包含()
,执行与其他字符串函数相同的排序聚合(例如<一个class="link" href="//www.delbede.com/doc/refman/en/string-functions.html">CONCAT ()
),考虑到他们论点的强制性;看到<一个class="xref" href="//www.delbede.com/doc/refman/en/charset-collation-coercibility.html" title="第10.8.4节,“表达式中的排序强制力”">第10.8.4节,“表达式中的排序强制力”一个>,以了解管理此行为的规则的解释。
(以前总是使用二进制比较,即区分大小写的比较。)
零
如果返回xml_frag
包含没有正确嵌套或关闭的元素,并生成一个警告,如下例所示:
mysql> SELECT ExtractValue('c < / > < b ', ' / / a ') | +-----------------------------------+ | 零 | +-----------------------------------+ 1行集,警告(0.00秒)mysql >显示警告\ G *************************** 1。row ***************************级别:警告代码:1525消息:错误的XML值:'parse error at line 1 pos 11: end - input unexpected ('>' wanted)' 1 row in set (0.00 sec) mysql> SELECT ExtractValue('c', '//a');+-------------------------------------+ | c ExtractValue(“< > < / > < b / > ', ' / / ') | +-------------------------------------+ | c | +-------------------------------------+ 1行集(0.00秒)
UpdateXML (
xml_target
,xpath_expr
,new_xml
)
这个函数替换给定XML标记片段的单个部分xml_target
使用一个新的XML片段new_xml
,然后返回更改后的XML。的部分xml_target
替换后的表达式与XPath表达式匹配xpath_expr
由用户提供。
如果没有匹配的表达式xpath_expr
,或者如果找到多个匹配,函数返回原始的xml_target
XML片段。所有三个参数都应该是字符串。
mysql >选择- > UpdateXML(“< > < b > ccc < / b > < d > < / d > < / > ', ' / ', ' < e > fff < / e >”)作为val1,——> UpdateXML(“<一> < b > ccc < / b > < d > < / d > < / > ', ' / b ', ' < e > fff < / e >”)作为val2,——> UpdateXML(“<一> < b > ccc < / b > < d > < / d > < / > ', ' / / b ', ' < e > fff < / e >”)作为val3,——> UpdateXML(“<一> < b > ccc < / b > < d > < / d > < / > ', ' / a / d ', ' < e > fff < / e >”)作为val4,——> UpdateXML(“<一> < d > < / d > < b > ccc < / b > < d > < / d > < / > ', ' / a / d ', ' < e > fff < / e > ') val5 - > \ G *************************** 1。行 *************************** val1: < e > fff < / e > val2: <一> < b > ccc < / b > < d > < / d > < / > val3: <一> < e > fff < / e > < d > < / d > < / > val4: <一> < b > ccc < / b > < e > fff < / e > < / > val5: <一> < d > < / d > < b > ccc < / b > < d > < / d > < / >
XPath语法和用法的深入讨论超出了本手册的范围。请参见<一个class="ulink" href="http://www.w3.org/TR/xpath" target="_top">XML路径语言(XPath) 1.0规范一个>明确的信息。对于XPath新手或希望复习基础知识的人来说,一个有用的参考资料是<一个class="ulink" href="http://www.zvon.org/xxl/XPathTutorial/" target="_top">Zvon.org XPath教程一个>这本书有几种语言版本。
下面是一些基本XPath表达式的描述和示例:
/
标签
匹配<
当且仅当标签
/><
是根元素。标签
/>
例子:/一个
有一场比赛<一> < / b > < / >
因为它匹配最外层(根)标记。它和内在不匹配一个
元素< b > < / > < / b >
因为在这个例子中,它是另一个元素的子元素。
/
标签1
/标签2
匹配<
当且仅当它是的子标签2
/><
,标签1
/><
是根元素。标签1
/>
例子:/ / b
匹配b
元素<一> < / b > < / >
因为它是根元素的子元素一个
.它没有匹配< b > < / > < / b >
因为在这种情况下,b
是根元素(因此不是其他元素的子元素)。XPath表达式也没有匹配< > < c > < / b > < / c > < / >
;在这里,b
是一个
,但实际上不是的孩子一个
.
该结构可扩展到三个或更多的元素。例如,XPath表达式/ a / b / c
匹配c
片段中的元素<一> < b > < c / > < / b > < / >
.
//
标签
的任何实例匹配<
.标签
>
例子:/ /一个
匹配一个
下列任何一项的元素:<一> < b > < c / > < / b > < / >
;b c < > < > < / > < / > < / b >
;< c > < b > < / > < / b > < / c >
.
//
可与/
.例如,/ / a / b
匹配b
元素中的任何一个片段<一> < / b > < / >
或b c < > < > < / > < / > < / c >
.
//
相当于标签
/子轴或self:: * /
.一个常见的错误是混淆这与标签
/子轴或self::
,尽管后一种表达实际上会导致非常不同的结果,如下所示:标签
mysql >设置@xml = ' < > < b > < c > w < / c > < b > x < / b > < d > y z < / d > < / b > < / > ';查询OK, 0行影响(0.00 sec) mysql> SELECT @xml;+-----------------------------------------+ | @ xml | +-----------------------------------------+ | < > < b > < c > w < / c > < b > x < / b > < d > y z < / d > < / b > < / a > | +-----------------------------------------+ 1行组(0.00秒)mysql >选择ExtractValue (@xml, / / b [1]);+------------------------------+ | ExtractValue (@xml’/ / b [1 ]') | +------------------------------+ | x z | +------------------------------+ 1行组(0.00秒)mysql >选择ExtractValue (@xml, / / b [2]);+------------------------------+ | ExtractValue (@xml’/ / b [2 ]') | +------------------------------+ | | +------------------------------+ 1行组(0.01秒)mysql >选择ExtractValue (@xml, ' /子轴或self:: * / b [1] ");+---------------------------------------------------+ | ExtractValue (@xml, ' /子轴或self:: * / b [1 ]') | +---------------------------------------------------+ | x z | +---------------------------------------------------+ 1行组(0.06秒)mysql >选择ExtractValue (@xml, ' /子轴或self:: * / b [2] ");+---------------------------------------------------+ | ExtractValue (@xml, ' /子轴或self:: * / b [2 ]') | +---------------------------------------------------+ | | +---------------------------------------------------+ 1行组(0.00秒)mysql >选择ExtractValue (@xml,“b /子轴或self::[1]”);+-------------------------------------------------+ | ExtractValue (@xml ' /子轴或self:: b (1 ]') | +-------------------------------------------------+ | z | +-------------------------------------------------+ 1行组(0.00秒)mysql >选择ExtractValue (@xml,“b /子轴或self::[2]”);+-------------------------------------------------+ | ExtractValue (@xml ' /子轴或self:: b [2 ]') | +-------------------------------------------------+ | x | +-------------------------------------------------+ 1行集(0.00秒)
的*
运算符充当”通配符”它匹配任何元素。例如,表达式/ * / b
匹配b
元素<一> < / b > < / >
或< c > < / b > < / c >
.然而,表达式不会在片段中产生匹配< b > < / > < / b >
因为b
一定是其他元素的子元素。通配符可以用在任何位置/ * / / *
匹配的任意子元素b
元素本身不是根元素。
方法可以匹配多个定位器中的任何一个|
(<一个class="link" href="//www.delbede.com/doc/refman/en/union.html" title="">联盟
)算子。例如,表达式/ / b | / / c
匹配所有b
而且c
XML目标中的元素。
还可以根据元素的一个或多个属性的值匹配元素。这是使用语法完成的
.例如,表达式标签
(@属性
= "价值
”)/ / b [@ id = " idB ")
比赛第二b
片段中的元素<一> < b id =“艾达”/ > < c / > < b id = " idB " / > < / >
.来匹配任何元素有
,使用XPath表达式属性
= "价值
"/ / * [
.属性
= "价值
”)
要过滤多个属性值,只需连续使用多个属性比较子句。例如,表达式/ / b [@c = " x "] [@d = " y ")
匹配的元素< b c = " x " d = " y " / >
发生在给定XML片段的任何地方。
属性连接的多个定位器可以用于查找相同属性与多个值中的任意一个相匹配的元素|
操作符。例如,匹配所有b
元素的c
属性值为23或17,请使用表达式/ / b [@c = " 23 "] | / / b (@c =“17”)
.您也可以使用逻辑或
为此目的的操作员:/ / b [@c =“23”或@c =“17”)
.
之间的区别或
而且|
是,或
加入条件,而|
连接结果集。
XPath的局限性。这些函数支持的XPath语法目前受到以下限制:
节点集到节点集的比较(例如' / a / b [@c = @d]
)不支持。
支持所有标准XPath比较运算符。(错误# 22823)
相对定位器表达式在根节点的上下文中解析。例如,考虑以下查询和结果:
mysql >选择ExtractValue(- >的< > < b c = " 1 " > < / b > X Y < b c = " 2 " > < / b > < / >”,- - - - - - >“a / b”- >)的结果;+--------+ | 结果 | +--------+ | X Y | +--------+ 1行集(0.03秒)
在本例中,是定位器a / b
解析为/ / b
.
在谓词中也支持相对定位器。在下面的例子中,d (. . / @c =“1”)
被解析为/ a / b / d @c =“1”
:
mysql >选择ExtractValue(- >的< > - > < b c = " 1 " > < d > X < / d > < / b > - > < b c = " 2 " > < d > X < / d > < / b > - > < / >”,- - - - - - >“a / b / d (. . / @c = " 1 "]) - >结果;+--------+ | 结果 | +--------+ | X | +--------+ 1行集(0.00秒)
不允许以计算为标量值的表达式为前缀的定位器(包括变量引用、字面量、数字和标量函数调用),使用它们会导致错误。
的::
操作符不支持与以下节点类型组合使用:
轴
::评论()
轴
:: text ()
轴
::处理指令()
轴
::节点()
但是,名称测试(例如
而且轴
::的名字
),如下示例所示:轴
:: *
mysql >选择ExtractValue(“< > < b > x < / b > < c > y < / c > < / > ', ' b / a /孩子::');+-------------------------------------------------------+ | ExtractValue(“< > < b > x < / b > < c > y < / c > < / > ', ' / /子::b ') | +-------------------------------------------------------+ | x | +-------------------------------------------------------+ 1行组(0.02秒)mysql >选择ExtractValue(“<一> < b > x < / b > < c > y < / c > < / > ', ' / /子::* ');+-------------------------------------------------------+ | ExtractValue(“< > < b > x < / b > < c > y < / c > < / > ', ' / /子 ::*') | +-------------------------------------------------------+ | x y | +-------------------------------------------------------+ 1行集(0.01秒)
”上下起伏的”在路径通向的情况下不支持导航”以上”根元素。也就是说,不能使用与给定元素的祖先的后代匹配的表达式,因为当前元素的一个或多个祖先也是根元素的祖先(参见Bug #16321)。
以下XPath函数不受支持,或存在已知问题:
id ()
朗()
本地名称()
名称()
名称空间uri ()
normalize - space ()
始于()
字符串()
substring-after ()
substring-before ()
翻译()
不支持以下轴:
祖辈
后
preceding-sibling
前
作为参数传递的XPath表达式<一个class="link" href="//www.delbede.com/doc/refman/en/xml-functions.html">ExtractValue ()
而且<一个class="link" href="//www.delbede.com/doc/refman/en/xml-functions.html">UpdateXML ()
可包含冒号字符(:
)在元素选择器中,这使它们能够与使用XML名称空间表示法的标记一起使用。例如:
mysql >设置@xml = ' < > 111 < b: c > 222 < d > 333 < / d > < e: f > 444 < f / e: > < / b: c > < / > ';查询OK, 0 rows affected (0.00 sec) mysql> SELECT ExtractValue(@xml, '//e:f');+-----------------------------+ | ExtractValue (@xml ' / / e: f ') | +-----------------------------+ | 444年 | +-----------------------------+ 1行组(0.00秒)mysql >选择UpdateXML (@xml ' / / b: c ', ' < g: h > 555 < / g: h >);+--------------------------------------------+ | UpdateXML (@xml ' / / b: c ', ' < g: h > 555 < / g: h >') | +--------------------------------------------+ | < > 111 < g: h > 555 < / g: h > < / > | +--------------------------------------------+ 1行集(0.00秒)
这在某些方面与《法律》所允许的类似<一个class="ulink" href="http://xalan.apache.org/" target="_top">Apache Xalan一个>和其他一些解析器,并且比要求名称空间声明或使用名称空间uri ()
而且本地名称()
功能。
错误处理。对于这两个<一个class="link" href="//www.delbede.com/doc/refman/en/xml-functions.html">ExtractValue ()
而且<一个class="link" href="//www.delbede.com/doc/refman/en/xml-functions.html">UpdateXML ()
,使用的XPath定位器必须是有效的,要搜索的XML必须由正确嵌套和关闭的元素组成。如果定位器无效,则会生成一个错误:
c mysql >选择ExtractValue(“< > < / > < b / > ', ' /和');XPATH语法错误:'&a'
如果xml_frag
不包含正确嵌套和闭合的元素,零
返回并生成一个警告,如下例所示:
mysql> SELECT ExtractValue('c < / > < b ', ' / / a ') | +-----------------------------------+ | 零 | +-----------------------------------+ 1行集,警告(0.00秒)mysql >显示警告\ G *************************** 1。row ***************************级别:警告代码:1525消息:错误的XML值:'parse error at line 1 pos 11: end - input unexpected ('>' wanted)' 1 row in set (0.00 sec) mysql> SELECT ExtractValue('c', '//a');+-------------------------------------+ | c ExtractValue(“< > < / > < b / > ', ' / / ') | +-------------------------------------+ | c | +-------------------------------------+ 1行集(0.00秒)
的第三个参数的替换XML<一个class="link" href="//www.delbede.com/doc/refman/en/xml-functions.html">UpdateXML ()
是不检查以确定它是否仅由嵌套和关闭的元素组成。
XPath注入。代码注入当恶意代码被引入系统以获得对特权和数据的未经授权访问时发生。它基于开发人员对用户输入数据的类型和内容所做的假设。XPath在这方面也不例外。
可能发生这种情况的常见场景是,应用程序通过将登录名和密码的组合与XML文件中的登录名和密码进行匹配来处理授权,使用如下XPath表达式:
/ /用户(登录/ text() =“那不勒斯”和密码/ text () = ' 1 c3cr34m '] /属性:id
这是XPath等价的SQL语句,如下所示:
SELECT id FROM users WHERE login=' napolitan ' AND password='1c3cr34m';
使用XPath的PHP应用程序可能会像这样处理登录过程:
<?PHP $file = "users.xml";登录=美元后(“登录”);密码=美元后(“密码”);$xpath = "//user[login/text()=$login and password/text()=$password]/attribute::id";If (file_exists($file)) {$xml = simplexml_load_file($file);if($result = $xml->xpath($xpath)) echo "你现在以用户$result[0]登录";否则返回“登录名或密码无效”;} else exit("无法打开$file.");? >
不对输入执行检查。这意味着恶意用户可以”短路”通过进入' or 1 = 1
对于登录名和密码,结果为xpath美元
被评估如下所示:
//user[login/text()= " or 1=1 and password/text()= " or 1=1]/attribute::id
因为方括号内的表达式总是计算为真正的
,它实际上与这个相同,它匹配id
属性的每一用户
元素:
/ /用户/属性:id
的定义中要插入的变量名是可以避免这种攻击的一种方法xpath美元
,强制从Web表单传递的值转换为字符串:
$xpath = "//user[login/text()='$login' and password/text()='$password']/attribute::id";
这与通常推荐用于防止SQL注入攻击的策略相同。通常,您应该遵循的防止XPath注入攻击的实践与防止SQL注入的实践相同:
永远不要接受应用程序中来自用户的未经测试的数据。
检查所有用户提交的数据的类型;拒绝或转换错误类型的数据
测试数值数据是否超出范围;截断、舍入或拒绝超出范围的值。测试字符串是否非法字符,将其删除或拒绝包含这些字符的输入。
不要输出显式错误消息,这可能为未经授权的用户提供可能被用来破坏系统的线索;将这些记录到文件或数据库表中。
正如SQL注入攻击可用于获取数据库模式的信息一样,XPath注入也可用于遍历XML文件以揭示其结构,这在Amit Klein的论文中进行了讨论<一个class="ulink" href="http://www.packetstormsecurity.org/papers/bypass/Blind_XPath_Injection_20040518.pdf" target="_top">XPath盲注一个>(PDF文件,46个kb)。
检查发送回客户机的输出也很重要。考虑一下当我们使用MySQL时会发生什么<一个class="link" href="//www.delbede.com/doc/refman/en/xml-functions.html">ExtractValue ()
功能:
mysql> SELECT ExtractValue(-> LOAD_FILE('users.xml'), -> '//user[login/text()="" or 1=1 and password/text()="" or 1=1]/attribute::id' ->) AS id;+-------------------------------+ | id | +-------------------------------+ | 00327 13579 02403 42354 28570 | +-------------------------------+ 1行集(0.01秒)
因为<一个class="link" href="//www.delbede.com/doc/refman/en/xml-functions.html">ExtractValue ()
返回多个匹配作为一个空格分隔的字符串,这种注入攻击提供包含在其中的每个有效IDusers.xml
作为单行输出传递给用户。作为额外的安全措施,您还应该在将输出返回给用户之前对其进行测试。下面是一个简单的例子:
mysql> SELECT @id = ExtractValue(-> LOAD_FILE('users.xml'), -> '//user[login/text()="" or 1=1 and password/text()="" or 1=1]/attribute::id' ->);查询OK, 0 rows affected (0.00 sec) mysql> SELECT IF(-> INSTR(@id, ' ') = 0, -> @id, -> 'Unable to retrieve user ID') -> AS singleID;+----------------------------+ | singleID | +----------------------------+ | 无法检索用户ID | +----------------------------+ 1行集(0.00秒)
通常,安全地将数据返回给用户的指导原则与接受用户输入的指导原则相同。这些可以总结为:
总是测试传出数据的类型和允许值。
永远不要允许未经授权的用户查看可能提供应用程序信息的错误消息,这些信息可能被用来利用它。