欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【使用HTTP Headers 防御WEB攻击(二)】,下面是详细的分享!
使用HTTP Headers 防御WEB攻击(二)
在前一篇文章《使用HTTP Headers防御WEB攻击(一)》中我们了解到如何使用X-Frame选项防御点击劫持攻击。在本文中我们将会讨论另外一个HTTP Header选项,X-XSS-Protection。和前一篇文章类似,我们会先看看漏洞网页然后再使用这个HTTP头选项来防御。
从源码分析
设置与前一篇文章类似,用户成功登录之后会出现一个控制台界面,这里可以进行搜索,如下代码即实现代码:
<?php
session_start();
session_regenerate_id();
if(!isset($_SESSION['admin_loggedin']))
{
header('Location: index.php');
}
if(isset($_GET['search']))
{
if(!empty($_GET['search']))
{
$text=$_GET['search'];
}
else
{
$text="No text Entered";
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Admin Home</title>
<link rel="stylesheet" href="http://www.chinaz.com/program/2015/0512/styles.css">
</head>
<body>
<div id="home"><center>
</br><legend><text id=text><text id="text2">Welcome to Dashboard...</text>
</br></br> You are logged in as: <?php echo $_SESSION['admin_loggedin']; ?>
<a href="http://www.chinaz.com/program/2015/0512/logout.php">[logout]</a></text></legend></br>
<form action="" method="GET">
<div id="search">
<text id="text">Search Values</text><input type="text" name="search" id="textbox">
</br></br>
<input type="submit" value="Search" name="Search" id="but"/>
<div id="error"><text id="text2">You Entered:</text><?php echo $text; ?></div>
</div>
</form></center>
</div>
</body>
</html>
从上面的代码中,我们可以看到应用程序没有对用户输入进行过滤而留下了漏洞。
接着,我们从HTTP响应头信息中看到应用程序没有任何额外的保护机制。
HTTP/1.1 200 OK Date: Sun, 12 Apr 2015 14:53:37 GMT Server: Apache/2.2.29 (Unix) mod_fastcgi/2.4.6 mod_wsgi/3.4 Python/2.7.8 PHP/5.6.2 mod_ssl/2.2.29 OpenSSL/0.9.8y DAV/2 mod_perl/2.0.8 Perl/v5.20.0 X-Powered-By: PHP/5.6.2 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Set-Cookie: PHPSESSID=f94dc2ac2aa5763c636f9e75365102b5; path=/ Content-Length: 820 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html; charset=UTF-8
测试进行时
在搜索框执行一个简单的JavaScript脚本,看看是否成功执行

好吧,我承认这看起来似乎没有成功执行,那就打开控制台看看错误信息吧。

从控制台信息中可以看到谷歌Chrome阻止了这个脚本。另外,错误提示信息中指出服务器没有启用X-XSS-Protection或者Content-Security-Policy头。
我们可以通过启用X-XSS-Protection或者Content-Security-Policy头进行过滤。
使用如下代码禁用保护
- header("X-XSS-Protection: 0");
将上面的代码添加进源码
<?php
session_start();
session_regenerate_id();
header("X-XSS-Protection: 0");
if(!isset($_SESSION['admin_loggedin']))
{
header('Location: index.php');
}
if(isset($_GET['search']))
{
if(!empty($_GET['search']))
{
$text=$_GET['search'];
}
else
{
$text="No text Entered";
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Admin Home</title>
<link rel="stylesheet" href="http://www.chinaz.com/program/2015/0512/styles.css">
</head>
<body>
<div id="home"><center>
</br><legend><text id=text><text id="text2">Welcome to Dashboard...</text>
</br></br> You are logged in as: <?php echo $_SESSION['admin_loggedin']; ?>
<a href="http://www.chinaz.com/program/2015/0512/logout.php">[logout]</a></text></legend></br>
<form action="" method="GET">
<div id="search">
<text id="text">Search Values</text><input type="text" name="search" id="textbox">
</br></br>
<input type="submit" value="Search" name="Search" id="but"/>
<div id="error"><text id="text2">You Entered:</text><?php echo $text; ?></div>
</div>
</form></center>
</div>
</body>
</html>
再次加载页面,便会弹出一个警告框

在FireFox中进行同样的测试,成功执行。

现在将X-XSS-Protection头的值修改为1,再次尝试。
- header("X-XSS-Protection: 1");
你能够轻松体会到已经成功开启了X-XSS-Protection。
HTTP/1.1 200 OK Date: Sun, 12 Apr 2015 14:54:42 GMT Server: Apache/2.2.29 (Unix) mod_fastcgi/2.4.6 mod_wsgi/3.4 Python/2.7.8 PHP/5.6.2 mod_ssl/2.2.29 OpenSSL/0.9.8y DAV/2 mod_perl/2.0.8 Perl/v5.20.0 X-Powered-By: PHP/5.6.2 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Set-Cookie: PHPSESSID=8dfb86b13ec9750d1f1afdfc004f5042; path=/ X-XSS-Protection: 1 Content-Length: 820 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html; charset=UTF-8
再次在漏洞页面执行JavaScript,脚本不会执行。进入Chrome的控制台,看看发生了什么事

从上面的控制台信息中,我们可以得知脚本没有得到执行。
- header("X-XSS-Protection: 1");
上面这个头没有添加其他的参数,仅仅只是阻止脚本的执行。
我们可以添加一些其他参数,比如:
- header("X-XSS-Protection: 1; mode=block");
这时再次测试,浏览器会阻止脚本执行,并且返回一个空白页。

下面为HTTP头信息
HTTP/1.1 200 OK Date: Mon, 13 Apr 2015 09:59:22 GMT Server: Apache/2.2.29 (Unix) mod_fastcgi/2.4.6 mod_wsgi/3.4 Python/2.7.8 PHP/5.6.2 mod_ssl/2.2.29 OpenSSL/0.9.8y DAV/2 mod_perl/2.0.8 Perl/v5.20.0 X-Powered-By: PHP/5.6.2 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Set-Cookie: PHPSESSID=729f2f716310ccfe353c81ced1602cf0; path=/ X-XSS-Protection: 1; mode=block Content-Length: 846 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html; charset=UTF-8
尽管在一些主流浏览器(IE,Chrome,Safari)中可以完美实现。但在FireFox中并不支持这个头,所以我们仍然可以看到弹出警告框

总结
所以,X-XSS-Protection头应该用于深度防御。由于它无法完全保护网站,因此开发者必须确保他们有其他一些手段来进行防护。
延伸阅读:
- 使用HTTP Headers防御WEB攻击(三)
以上所分享的是关于使用HTTP Headers 防御WEB攻击(二),下面是编辑为你推荐的有价值的用户互动:
相关问题:如何使用live http headers调试http post get请求
答:一、LiveHttpHeaders的安装 LiveHttpHeaders是一个用于分析HTTP流量的 Firefox 扩展,我们可以用它来分析和重放http请求。我们下面详细的说明该插件的安装步骤。 如果Firefox阻止了该扩展的安装,可以在单击右边的“允许”按钮以继续安装。 单击上... >>详细
相关问题:如何使用httpwebrequestpost数据时设置connection=...
答:文档说HttpRequestHeader.Connection 是不能设置的, 你试试 WebClient.Headers.Add(HttpRequestHeader.KeepAlive,"TRUE") >>详细
相关问题:HttpWebRequest.Headers.Add出错 指定的值含有无效...
答:header里不是所有字符都可以放的, 如果低字节为 01111111 则是被留作控制字节. 不允许低字节为01111111的字符放入header, 在中文里有少数字 比如 布, 合, 板 等字都最后一个字节是01111111, 这些字不能进入header. 其他语言也有这类字符,所以最... >>详细
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
