我需要为元素属性动态构造一个 XPath 查询,其中属性值由用户提供。我不确定如何清理或清理此值以防止 XPath 等效于 SQL 注入攻击。例如(在 PHP 中):
<?php
function xPathQuery($attr) {
$xml = simplexml_load_file('example.xml');
return $xml->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 注入攻击。
现在,我知道事实上会有包含单引号的属性和包含双引号的属性。由于这些是作为函数的参数提供的,那么清理这些输入的理想方法是什么?