假设我有一个用户输入一些信息的表单,并使用php和PHP代码提交给服务器我说
$data = $_POST['data'];
// or
$data = strip_tags(@$_POST['data']);
我想知道strip_tags()
足以通过html表单停止javascript注入。如果不是,那么如何防止这种情况。我看过here。
并且还说我在浏览器地址栏中输入javascript:void(document.bgColor="blue")
,这会将整个站点背景颜色更改为蓝色。如何防止通过地址栏注入javascript。
感谢。
答案 0 :(得分:2)
答案 1 :(得分:2)
对于问题2
,我不确定是否可以预防。这不是我以前曾经考虑过的事情。听起来你正试图阻止执行你在页面上没有包含的任何javascript,这也意味着阻止浏览器中的devtools在控制台中执行任何操作。这可能会对您的用户产生敌意,例如:如果他们想使用Instapaper的书签。
对于1
,最终您的目标是避免在生成新页面时从表单中包含此注入的javascript。从表单输出数据时,可以将其包装在htmlspecialchars。
答案 2 :(得分:1)
它取决于你想要获得的输出。
在某些情况下,您希望保留包含script
标记的HTML标记,但您希望这些元素在输出时不会运行,在这种情况下您应该使用htmlspecialchars($_POST['data'])
,(建议将utf8
定义为第三个参数)。
但如果您想要删除标签而不是strip_tags
将阻止XSS
答案 3 :(得分:1)
一个功能无法完全保护您免受脚本注入。请考虑以下程序:
<?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保护不会运行我的简单示例。如果你想尝试使用一个没有保护的,或找到一个失败的矢量(不确定是否有一个例如Chrome)。