【问题标题】:How to remove Inner HTML from parsed HTML with DOMDocument?如何使用 DOMDocument 从解析的 HTML 中删除内部 HTML?
【发布时间】:2019-07-10 18:43:46
【问题描述】:

我必须为特定类型的嵌入处理用户提供的标记,该标记通常采用<script> 标记的形式,通常带有src 属性。这里可以使用多种不同的<script> 组件,每一种都不同。然而,为了避免潜在的XSS 攻击,我们认为有必要去除标签内的任何内容。

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js">document.write("vinny say something funny"); //This should be sanitized out</script>

DOMDocument 确实没有给我们一个简单的方法来改变innerhtml,我有seen a few approaches,但如果标签被破坏,似乎没有人能解决保持属性不变的问题。我在实施最佳方法时是否遗漏了什么,还是有更简单的方法来解决这个问题?

【问题讨论】:

    标签: php domdocument


    【解决方案1】:

    此代码从&lt;script&gt; 节点中删除子节点。在这种情况下,它是文档元素:

    <?php
    $xml = '<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js">document.write("vinny say something funny");</script>';                               
    
    $doc = new DOMDocument();
    $doc->loadXml($xml);
    
    $scriptNode = $doc->documentElement;
    
    while ($scriptNode->hasChildNodes()) {
        $scriptNode->removeChild($scriptNode->lastChild);
    }
    
    echo $doc->saveXML();
    

    输出是:

    <?xml version="1.0"?>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"/>
    

    【讨论】:

      【解决方案2】:

      一种简单的方法是对节点进行浅层克隆(使用cloneNode()),不带可选参数。

      这将遍历加载的文档并将每个脚本节点替换为新内容...

      $html = '<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js">document.write("vinny say something funny");</script>';
      
      $doc = new DOMDocument();
      $doc->loadHTML($html);
      
      foreach ( $doc->getElementsByTagName("script") as $script ){
          $script->parentNode->replaceChild($script->cloneNode(), $script);
      }
      echo $doc->saveHTML();
      

      给...

      <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
      <html><head><script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script></head></html>
      

      【讨论】:

        猜你喜欢
        • 2011-02-04
        • 1970-01-01
        • 1970-01-01
        • 2012-06-23
        • 1970-01-01
        • 2011-10-11
        • 1970-01-01
        • 2013-02-08
        • 2015-02-28
        相关资源
        最近更新 更多