一个函数不能完全保护您免于脚本注入。考虑下面的程序:
<?php
if(isset($_POST['height']))
$height=htmlspecialchars($_POST['height'], ENT_QUOTES, 'UTF-8');
else $height=200;
if(isset($_POST['width']))
$height=htmlspecialchars($_POST['width'], ENT_QUOTES, 'UTF-8');
else $width=300;
echo("
<!DOCTYPE html>
<html>
<body>
<iframe src='whatever' height=$height width=$width>
</iframe>
</body>
</html>
");
输入被消毒,但JavaScript的还是会通过像一个简单的注射向量执行:
300 onload=alert(String.fromCharCode(88)+String.fromCharCode(83)+String.fromCharCode(83))
你仍然需要引用您的属性,或者你很容易受到这样的例。
当用户输入回显到JavaScript注释中时,存在另一个半公共注入向量,您可以注入新行或关闭注释。我把它归咎于'这个狗屎不应该像它应该那样工作,但是让我们把它留在评论'式的发展中。
注意:许多浏览器的XSS保护将无法运行我的简单示例。如果你想尝试使用一个没有保护,或找到一个向导来击败它(不知道是否有一个例如铬)。
使用'filter_input()'和'filter_input_array()'函数通常是更好的方法。你应该完全避免使用超级全局变量'$ _GET'和'$ _POST'等, – Octopus
即使是着名的网站也没有那么强大的保护。 Facebook有一个很好的保护,它仍然可以调用功能,取决于浏览器的c –