我有以下函数可以在HTML DOM
;
它有效,但当我给出参数$value
时:Levi's Baby Overall,
它裂开了,因为它没有逃脱,并且'chars
如何从DOM XPath Query中转义所有无效字符?
private function extract($file,$url,$value) {
$result = array();
$i = 0;
$dom = new DOMDocument();
@$dom->loadHTMLFile($file);
//use DOMXpath to navigate the html with the DOM
$dom_xpath = new DOMXpath($dom);
$elements = $dom_xpath->query("//*[text()[contains(., '" . $value . "')]]");
if (!is_null($elements)) {
foreach ($elements as $element) {
$nodes = $element->childNodes;
foreach ($nodes as $node) {
if (($node->nodeValue != null) && ($node->nodeValue === $value)) {
$xpath = preg_replace("/\/text\(\)/", "", $node->getNodePath());
$result[$i]['url'] = $url;
$result[$i]['value'] = $node->nodeValue;
$result[$i]['xpath'] = $xpath;
$i++;
}
}
}
}
return $result;
}
答案 0 :(得分:1)
不应该使用任意的,用户提供的字符串替换XPath表达式中的占位符 - 因为(恶意)XPath注入的风险。
为了安全地处理这些未知字符串,解决方案是使用预编译的XPath表达式并将用户提供的字符串作为变量传递给它。这也完全消除了在代码中处理嵌套引号的需要。
答案 1 :(得分:1)
PHP没有内置函数来转义/引用XPath查询的字符串。此外,为XPath转义字符串是非常困难的,这里有更多关于原因的信息:https://stackoverflow.com/a/1352556/1067003,这里是他的C#XPath引用函数的PHP端口:
function xpath_quote(string $value):string{
if(false===strpos($value,'"')){
return '"'.$value.'"';
}
if(false===strpos($value,'\'')){
return '\''.$value.'\'';
}
// if the value contains both single and double quotes, construct an
// expression that concatenates all non-double-quote substrings with
// the quotes, e.g.:
//
// concat("'foo'", '"', "bar")
$sb='concat(';
$substrings=explode('"',$value);
for($i=0;$i<count($substrings);++$i){
$needComma=($i>0);
if($substrings[$i]!==''){
if($i>0){
$sb.=', ';
}
$sb.='"'.$substrings[$i].'"';
$needComma=true;
}
if($i < (count($substrings) -1)){
if($needComma){
$sb.=', ';
}
$sb.="'\"'";
}
}
$sb.=')';
return $sb;
}
示例用法:
$elements = $dom_xpath->query("//*[contains(text()," . xpath_quote($value) . ")]");
"
),因为xpath_quote函数为我做了(或者如果需要的话,还是concat()等价物)