1

HTML DOM;内の値を見つける次の関数があります。

$valueそれは機能しますが、次のようなパラメーターを指定Levi's Baby Overall, すると、 , および ' chars をエスケープしないため、クラックします

DOM XPath クエリからすべての無効な文字をエスケープするには?

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;
}
4

2 に答える 2

1

(悪意のある) XPath インジェクションのリスクがあるため、XPath 式のプレースホルダーを任意のユーザー提供の文字列に置き換えるべきではありません。

このような不明な文字列を安全に処理するための解決策は、事前にコンパイルされた XPath 式を使用し、ユーザー提供の文字列を変数として渡すことです。これにより、コード内のネストされた引用符を処理する必要も完全になくなります。

于 2012-10-24T04:22:16.753 に答える