【问题标题】:PHP DOMDocument createElement obfuscates ampersandPHP DOMDocument createElement 混淆 & 符号
【发布时间】:2014-06-24 00:58:20
【问题描述】:

我正在使用 PHP DOMDocument 库来创建一个带有 javascript 值的“脚本”标签元素并将其插入 DOM。

这就是我的工作:

$scriptElement = $doc->createElement('script',$scriptTagVal);
echo $scriptElement->nodeValue;                                                                  
$someNode->parentNode->insertBefore($scriptElement,$postRttScriptNode); 

这符合我的预期,它在“someNode”之前插入一个元素。然而,它做了一些奇怪的事情,它混淆了 & 符号。单与号 (&) 不存在,双与号 (&&) 被购买为单与号。

疯了吗?好吧,我试过这样做:

$scriptElement = $doc->createElement('script','return "undefined" !== typeof b **&&** null !== b ? b.getAttribute("content") : 0');

如果我回显 $scriptElement->nodeValue,

我明白了

return "undefined" !== typeof b **&** null !== b ? b.getAttribute("content") : 0'

我假设这实际上是闻所未闻的,但我尝试使用包含双 & 符号的值创建不同的元素。比如:

 $scriptElement = $doc->createElement('p','Why does DOMDocument obfuscate double
            ampersands(&&)');    

输出到我的浏览器的结果是一个

标签的值:

为什么 DOMDocument 会混淆 double 和号(

也许是特殊字符?无论如何我可以解决这个问题吗?我的意思是,肯定有一种方法可以使用 DOMDocument 在 HTML 中插入 javascript,对吧?

【问题讨论】:

标签: php obfuscation domdocument


【解决方案1】:

http://www.php.net/manual/en/domdocument.createelement.php中所述

该值不会被转义。使用 DOMDocument::createTextNode() 来 创建一个支持转义的文本节点

你可以试试:

$doc = new DomDocument();
$scriptContent = 'return "undefined" !== typeof b **&&** null !== b ? b.getAttribute("content") : 0';
$scriptElement = $doc->createElement('script');
$scriptElement->appendChild($doc->createTextNode($scriptContent));
$doc->appendChild($scriptElement);
echo $doc->saveXML();

您可能需要在构建文本节点时使用$doc->ownerDocument->createTextNode(),这是未经测试的,因为我没有可运行的代码 sn-p。

【讨论】:

  • 我什至无法弄清楚$value 参数的来源。它应该模仿的对应的WEB API 没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 2015-04-23
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多