2017-07-27 120 views
0

说,我有与用户输入的一些信息和使用PHP和PHP代码submited到服务器,我有说防止JavaScript注入

$data = $_POST['data']; 
// or 
$data = strip_tags(@$_POST['data']); 
  1. 我想知道strip_tags()就够形式通过HTML表单停止JavaScript注入。如果不是如何可以防止这种情况。我已阅读here

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

谢谢。

+0

使用'filter_input()'和'filter_input_array()'函数通常是更好的方法。你应该完全避免使用超级全局变量'$ _GET'和'$ _POST'等, – Octopus

+0

即使是着名的网站也没有那么强大的保护。 Facebook有一个很好的保护,它仍然可以调用功能,取决于浏览器的c –

回答

1

这取决于你试图得到哪个输出。

在某些情况下,你要离开HTML标签,包括script标签,但你要,这些元素将无法运行,当你输出它们,在这种情况下,你应该使用htmlspecialchars($_POST['data']),(它的建议来定义作为第三个参数也是utf8)。

但是如果你想比strip_tags删除entierly标签将防止XSS

+0

非常感谢。你的回答有帮助。 – diagold

1

我建议使用htmlspecialchars当过你想要输出的东西到浏览器

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

结账this

+0

非常感谢。你的回答有帮助。 – diagold

1

对于问题2,我不确定这是否可以预防。这不是我以前考虑过的事情。这听起来像是你试图阻止执行任何你没有在页面上包含的javascript,这也意味着阻止浏览器中的devtools执行控制台中的任何东西。这可能会对您的用户产生不利影响,例如如果他们想使用Instapaper的小书签。

对于1,最终您的目标是避免在生成新页面时将此注入的JavaScript从表单中包含。从表单输出数据时,可以将其包装在htmlspecialchars中。

+0

非常感谢。你的回答有帮助。 – diagold

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保护将无法运行我的简单示例。如果你想尝试使用一个没有保护,或找到一个向导来击败它(不知道是否有一个例如铬)。