防止JavaScript注入

时间:2017-07-27 19:44:52

标签: javascript php jquery mysql code-injection

假设我有一个用户输入一些信息的表单,并使用php和PHP代码提交给服务器我说

$data = $_POST['data'];
// or
$data = strip_tags(@$_POST['data']);
  1. 我想知道strip_tags()足以通过html表单停止javascript注入。如果不是,那么如何防止这种情况。我看过here

  2. 并且还说我在浏览器地址栏中输入javascript:void(document.bgColor="blue"),这会将整个站点背景颜色更改为蓝色。如何防止通过地址栏注入javascript。

  3. 感谢。

4 个答案:

答案 0 :(得分:2)

我建议您在想要向浏览器输出内容时使用htmlspecialchars

echo htmlspecialchars($data, ENT_QUOTES, 'UTF-8');

结帐DateFormat

答案 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)。