【问题标题】:Using DOMDocument to Parse HTML with JS code使用 DOMDocument 解析带有 JS 代码的 HTML
【发布时间】:2011-07-19 03:10:02
【问题描述】:

我将 HTML 作为字符串输入,然后解析它以将所有 href 链接更改为其他内容。但是,当 HTML 页面有一些 JS 脚本标签(即<script>)时,它会被删除!例如这一行:

<script type="text/javascript" src="/js/jquery.js"></script>

更改为:

[removed][removed] 

但是,我想保留所有内容。这是我的功能:

function parse_html_code($code, $code_id){

libxml_use_internal_errors(true);

$xml = new DOMDocument();

$xml->loadHTML($code); 

foreach($xml->getElementsByTagName('a') as $link) {

  $link->setAttribute('href', CLK_BASE."clk.php?i=$code_id&j=" . $link->getAttribute('href'));

}

return $xml->saveHTML();

}

感谢您对此提供的任何帮助。

【问题讨论】:

  • DOM 不会自行删除任何标签或在任何地方插入[removed] 标记。请提供一个可重现的示例来说明问题。

标签: php html-parsing


【解决方案1】:

CodeIgniter 的虚假反 XSS “功能”正在破坏您的脚本输入,然后再 DOMDocument 看到它。脚本标签和其他各种字符串将被删除,替换为“[removed]”其他其他乱七八糟的东西,没有充分的理由。请参阅 system/libraries/Security.php 模块了解完整的尴尬细节。

要关闭这个错误的功能,请设置$config['global_xss_filtering']= FALSE。当然,您必须确保您的脚本实际上正确处理了字符串转义(例如,当包含在页面中时,总是对用户输入进行 HTML 转义)。但是无论如何你都必须这样做;反 XSS 并不能解决您的文本处理问题,它只会掩盖它们。

$link->setAttribute('href', CLK_BASE."clk.php?i=$code_id&j=" . $link->getAttribute('href'));

你需要urlencodegetAttribute('href')(如果它不只是数字或其他东西,可能还有 $code_id)。

【讨论】:

  • 感谢另一个不使用 CI 的理由。
  • 感谢您对 URL 编码的解释和提示!我觉得我必须为 CI 辩护,因为我正在使用它,但我不会这样做,因为我不太关心它......但我确信它有它的优点。
猜你喜欢
  • 2011-04-22
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 2015-07-17
  • 2012-06-23
  • 2015-02-28
  • 2011-10-11
  • 2013-02-08
相关资源
最近更新 更多