更新
(我可以删除这个问题 - 但我不妨把它留给每个人,有时候错误是在别的地方而不是我们看的地方......)
我很抱歉,我让你思考这个问题:“实际结果”的原因是在一个完全不同的位置,与htmlentities
无关。
感谢所有试图提供帮助的人。
为什么这段代码在我的PHP 5.4.32站点中不起作用?
代码:
$returnValue = htmlentities(urldecode('//echo \'<textarea name="comments" id="comments">$theData</textarea>\';'), ENT_QUOTES, 'UTF-8');
echo '<textarea>' . $returnValue . '</textarea>';
预期结果:
具有确切字符串
的textarea//echo '<textarea name="comments" id="comments">$theData</textarea>';
实际结果:
具有确切字符串
的textarea//echo '<textarea name="comments" id="comments">$theData
(原始字符串中的“”实际上关闭了html textarea。)
以同样的方式,可以注入脚本(这就是我最初使用htmlentities的原因)。
非常奇怪的事情:
如果我只是将上面的示例代码添加到我的php文件的开头,它会按预期工作。所以必须有一些理由说明为什么它不能在页面上进一步发挥作用。我不知道,在代码中没有可能的原因。
怎么了?
btw:使用htmlspecialchars
不会改变效果。
答案 0 :(得分:3)
美元符号$
不能用单引号解释。
选择并使用以下其中一项:
echo '<textarea name="comments" id="comments">' . $theData . '</textarea>';
echo "<textarea name='comments' id='comments'>$theData</textarea>";
echo "<textarea name='comments' id='comments'>" . $theData . "</textarea>";
echo "<textarea name=\"comments\" id=\"comments\">$theData</textarea>";
答案 1 :(得分:2)
在这种情况下,您不应该使用urldecode()
。 urldecode()
将为您提供url编码字符串的原始值(在PHP中为urlencode()
的返回值)。您在此处未使用网址编码字符串。
以下内容应该为您提供预期的结果:
$returnValue = htmlentities('//echo \'<textarea name="comments" id="comments">$theData</textarea>\';', ENT_QUOTES, 'UTF-8');
echo '<textarea>' . $returnValue . '</textarea>';
答案 2 :(得分:0)
此代码没有任何问题。完美的工作 - 错误是我的PHP文件中的其他地方......