我有一个非常简单的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=<script>alert('hacked')</script>
('hacked'脚本也先执行)。要重新解释我的问题,为什么脚本在$question
的第converted question=
行仍然完全可见?即为什么变量没有被转换?我认为在转换变量之后,脚本应该不再可见了。
答案 0 :(得分:1)
用户可见的输出应为:
(nothing, script executed)
<script>alert('hacked')</script>
<script>alert('hacked')</script>
浏览器可见的实际输出是:
<script>alert('hacked')</script>
<script>alert('hacked')</script>
&lt;script&gt;alert('hacked')&lt;/script&gt;
哪个是完全正确的。第一行未转义,HTML和脚本被解释。第二行被转义一次,将文本显示给用户。第三行被转义两次,将文本显示为一次转发给用户。
你一遍又一遍地逃避同一个变量,所以结果会根据你逃避它的频率而改变。也许从这里开始:The Great Escapism (Or: What You Need To Know To Work With Text Within Text)