在哪里使用strip_tags()和htmlspecialchars()

时间:2013-12-03 20:59:20

标签: php xss

我放置strip_tagshtmlspecialchars代码的位置有区别吗?我读到示例2优于示例1.

但我不明白这是怎么回事,这些不一样吗?我不知道我是否将它重新设置为$_POST[]变量也是有意义的。

在我的情况下,使用示例1要容易得多,因为无论我在哪里使用$_POST['test'],我都知道它是安全的...而我需要找到我echo $_POST['test']的实例并放置示例2中的标签。

对XSS Leaks来说,一个真正的版本更安全吗?

示例1:

<?php
    $_POST['test'] = htmlspecialchars(strip_tags($_POST['test']));

    // other code
    <form action="" method="POST">
        <input type="hidden" name="test" value="<?=$_POST['test']?>" />
    </form>
?>

示例2:

<?php
    // other code
    <form action="" method="POST">
        <input type="hidden" name="test" value="<?=htmlspecialchars(strip_tags($_POST['test']))?>" />
    </form>
?>

3 个答案:

答案 0 :(得分:1)

两个例子都相同(在输出中)。 我能看到的问题是示例#1会覆盖$_POST数据。   我建议不要这样做,因为您无法在脚本中稍后恢复原始数据(例如,如果您希望将数据保存到数据库中或在非HTML上下文中输出它)。

<小时/> 我在某种程度上误解了这个问题,但这部分旧答案仍然适用。

它们是两个不同的功能。

在您的情况下,您应该只使用htmlspecialchars(),因为此功能旨在转义特殊HTML字符(<, >, ")。

strip_tags()相反剥离HTML标记(以及其他一些内容,see the docs)。你真的想要这种行为吗?我不信。剥离HTML标记与逃避它们不同之处在于它确实删除了标记。转义只是“逃避”它们,以便浏览器将它们呈现为普通文本。

答案 1 :(得分:0)

如果你必须在多个地方使用$ _POST ['test']我将使用示例1,因为你不必再处理其他函数(strip_tags,htmlspecialchars)再次清理你已经拥有的相同数据。

答案 2 :(得分:0)

这部分代码完美地阻止了XSS。

=