为什么htmlspecialchars不能在函数内部工作?

时间:2014-02-09 12:23:42

标签: php

我有一个非常简单的php脚本,用于测试函数htmlspecialchars:

$question="<script>alert('hacked')</script>";

echo "<br>original question=",$question;

$question = make_secure( $question );

echo "<br>converted question=",$question;     

echo "<br>converted question calling htmlspecialchars=",htmlspecialchars($question);

function make_secure($data)  {
    $data = htmlspecialchars($data);     return $data;  }  

它应该通过调用其中的htmlspecialchars函数从原始字符串$ question中删除特殊字符。但是,该功能似乎没有删除特殊字符。只有在脚本中显式调用htmlspecialchars时才会删除它们。为什么呢?

感谢。

编辑:这是我在运行脚本时看到的内容:

original question=
converted question=<script>alert('hacked')</script>
converted question calling htmlspecialchars=&lt;script&gt;alert('hacked')&lt;/script&gt;

('hacked'脚本也先执行)。要重新解释我的问题,为什么脚本在$question的第converted question=行仍然完全可见?即为什么变量没有被转换?我认为在转换变量之后,脚本应该不再可见了。

1 个答案:

答案 0 :(得分:1)

用户可见的输出应为:

(nothing, script executed)
<script>alert('hacked')</script>
&lt;script&gt;alert('hacked')&lt;/script&gt;

浏览器可见的实际输出是:

<script>alert('hacked')</script>
&lt;script&gt;alert('hacked')&lt;/script&gt;
&amp;lt;script&amp;gt;alert('hacked')&amp;lt;/script&amp;gt;

哪个是完全正确的。第一行未转义,HTML和脚本被解释。第二行被转义一次,将文本显示给用户。第三行被转义两次,将文本显示为一次转发给用户。

你一遍又一遍地逃避同一个变量,所以结果会根据你逃避它的频率而改变。也许从这里开始:The Great Escapism (Or: What You Need To Know To Work With Text Within Text)