2012-10-23 75 views
0

我有以下功能,發現HTML DOM內的值;如何從DOM DOM查詢中轉義所有無效字符?

它的工作原理,但是當我給參數$value,如:Levi's Baby Overall, 它的裂縫,因爲它不逃避,和「字符

如何逃避DOM的XPath查詢所有無效字符?

​​
+0

你可能會發現你在這裏回答:http://stackoverflow.com/questions/4452323/xpath-query-with-single-quote。 – matthias

+0

我不認爲是可能的,他的代碼不適用於所有的DOM的 –

回答

1

由於存在(惡意)XPath注入的風險,因此XPath表達式中的佔位符不能用用戶提供的任意字符串代替。

爲了安全處理這些未知的字符串,解決方案是使用預編譯的XPath表達式並將用戶提供的字符串作爲變量傳遞給它。這也完全消除了在代碼中處理嵌套引號的需要。

+0

將字符串放在首位的全部原因,是爲了確保它在xpath中沒有特別的含義,這樣黑客無法注入任何東西,它可以可靠地搜索確切的文本字符串,如'// parent :: * [@ password]' – hanshenrik

+0

'解決方案是使用預編譯的XPath表達式並將用戶提供的字符串作爲「 - 呃,不,這不是PHP的解決方案,因爲PHP的DOMXPath不支持變量(只是另一個避免PHP的原因,我猜) – hanshenrik

+0

@hanshenrik,是的,我不知道PHP,in .NET可以使用XsltContext類:https://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltcontext(v = vs.110).aspx –

0

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本身的引號字符("),因爲(如果需要的話或CONCAT()當量)的xpath_quote功能,它會爲我