当前位置:  开发笔记 > 编程语言 > 正文

清理/清理xpath属性

如何解决《清理/清理xpath属性》经验,为你挑选了1个好方法。

我需要为元素属性动态构造XPath查询,其中属性值由用户提供.我不确定如何清理或清理此值以防止XPath等同于SQL注入攻击.例如(在PHP中):

xpath("//myElement[@content='{$attr}']");
}

xPathQuery('This should work fine');
# //myElement[@content='This should work fine']

xPathQuery('As should "this"');
# //myElement[@content='As should "this"']

xPathQuery('This\'ll cause problems');
# //myElement[@content='This'll cause problems']

xPathQuery('\']/../privateElement[@content=\'private data');
# //myElement[@content='']/../privateElement[@content='private data']

特别是最后一个让人想起昔日的SQL注入攻击.

现在,我知道会有包含单引号和包含双引号的属性的属性.由于这些是作为函数的参数提供的,因此对这些函数进行消毒的理想方法是什么?



1> gz...:

XPath确实包含一种安全地执行此操作的方法,因为它允许表达式中的表单中的变量引用$varname.PHP的SimpleXML所基于的库提供了一个提供变量的接口,但是这个示例中的xpath函数没有公开.

作为一个真实的示范,这可以是多么简单:

>>> from lxml import etree
>>> n = etree.fromstring('')
>>> n.xpath("@a=$maybeunsafe", maybeunsafe='He said "I\'m here"')
True

这是使用lxml,一个与SimpleXML相同的底层库的python包装器,具有类似的xpath函数.布尔值,数字和节点集也可以直接传递.

如果不能选择切换到功能更强大的XPath接口,那么给定外部字符串时的解决方法就是(可随意适应PHP):

def safe_xpath_string(strvar):
    if "'" in strvar:
        return "',\"'\",'".join(strvar.split("'")).join(("concat('","')"))
    return strvar.join("''")

返回值可以直接插入表达式字符串中.因为它实际上不是非常易读,所以它的行为方式如下:

>>> print safe_xpath_string("basic")
'basic'
>>> print safe_xpath_string('He said "I\'m here"')
concat('He said "I',"'",'m here"')

注意,您不能在'XML文档之外的表单中使用转义,也不能使用通用的XML序列化例程.但是,XPath concat函数可用于在任何上下文中创建具有两种类型引号的字符串.

PHP变种:

function safe_xpath_string($value)
{
    $quote = "'";
    if (FALSE === strpos($value, $quote))
        return $quote.$value.$quote;
    else
        return sprintf("concat('%s')", implode("', \"'\", '", explode($quote, $value)));
}

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有