反XSS脚本不起作用,或者有更好的方法吗


Anti-XSS script does not work, or is there a better method?

我一直在为某个脚本而苦恼,它是PHP中使用的3个函数的函数组合,用于从特殊字符、空格和斜杠/反斜杠中"清除"或"清除"表单中的输入。

问题是,它似乎不起作用,这真的很奇怪,因为我查看了关于它、W3schools和堆栈溢出的PHP官方页面,但没有找到它可能不起作用的答案,因为我THINK我有合适的函数格式。

但我可能错了,我毕竟是一个知识不多的年轻学生。

这是我谈到的功能:

<?php       
    $data = clean_data('d/ in' g<script>e %&*$^s #% ');
    function clean_data($data) {
        $data = trim($data);
        $data = stripslashes($data);
        $data = htmlspecialchars($data);
    return $data;
    }
    echo $data;
?>

第二行的'符号中的随机内容是输入(当我将其与表单一起使用时,结果相同(,它是为了测试,当然,在现实中,会有$_POST函数,从表单中获取数据,并将其放入另一个变量中(与$data不同(。

如果有人能给我指明正确的方向,我将不胜感激:(

编辑:说到一些非常有用的评论,我了解了我的脚本中的某些函数的真正作用,在gettig指出该脚本在某种程度上适用于除我之外的所有人之后,我感到困惑,所以如果其他人有建议,如果有更好的方法来"预防",或者通过在我的PHP脚本中实现安全性(例如,清除实体(来至少减少XSS攻击,将通知

如果你要付出这么多努力。。。你做错了。

以下是一些必须小心处理用户输入的上下文,以及正确的处理方法:

  1. HTML。发送到浏览器的用户输入的任何内容都被所述浏览器解释为HTML。因此,必须小心防止用户注入自己选择的代码。幸运的是,它很简单。htmlspecialchars将转义所有必要的字符,以确保用户键入的内容就是他们返回的内容1

  2. JavaScript。有时,您可能需要将一个变量从PHP拖放到JavaScript中。无论它是否包含用户输入,您都必须小心生成有效的JavaScript。幸运的是,json_encode实际上就是为此而设计的。给它一个变量,它就会以JavaScript完全理解的方式输出它。字符串将添加引号,其中的字符将进行适当的转义。

  3. MySQL。也许是争论最多的,但也是最容易纠正的!如果(并且onlyIf(您一直在维护古老的代码,您可以使用mysql_real_escape_string来净化您的输入并防止SQL注入,但实际上您应该使用PDO的准备语句功能。就像上面的json_encode一样,准备好的语句只需要一个变量,就可以为您完成所有的艰苦工作!

  4. PHP。只是不要将eval与用户输入一起使用。曾经可以

  5. 重击/外壳。很少将shell_exec和相关函数与用户输入一起使用,但为了以防万一,请确保始终将参数包装在escapeshellarg中。这再次处理字符串的自动引用和危险字符的转义。

总的来说,有一些内置的、简单的方法可以根据你所处的环境来做事。没有包罗万象的解决方案,因为环境因其不同的规则而不同。限制用户可以输入的内容是不好的,尤其是当以安全的方式允许任意输入非常容易的时候。

1:空格仍然会被折叠,就像在源代码中键入几个空格一样。这可以根据需要保留,也可以使用CSS white-space: pre-wrap;进行修复。还可以考虑word-wrap: break-word;,以确保人们不会输入愚蠢的长词来破坏你的布局