Perl网络应用程序安全 - HTTP头部

HTTP头部包含在每个来自Web服务器的HTTP响应中。设置适当的HTTP头部可以减少Web应用程序受到中间人攻击和跨站脚本攻击的风险。您还可以减少有关Web应用程序配置的信息泄露 - 这是给潜在攻击者提供有关潜在漏洞线索的重要数据。继续阅读以了解如何在您的Perl Web应用程序中设置适当的头部。
应用程序
三个主要的Perl Web框架都提供某种标识头部。Dancer和Mojolicious使用“X-Powered-By”,而Catalyst使用“X-Catalyst”。这个头部的问题在于它向请求者通知了应用程序的语言(Perl)和所使用的Web框架。在某些情况下,它还会显示版本号。有了这些信息,潜在的攻击者可以专注于针对Perl或Web框架的特定漏洞。以下是禁用它的方法
- 默认情况下,Catalyst没有打开其应用程序头部。该头部由“enable_catalyst_header”配置选项控制,通常位于根应用程序类(例如,lib/MyApp.pm)或应用程序配置文件中。
- Mojolicious从版本4.00开始不设置此头部。
- Dancer(和Dancer2)使用服务器令牌指令。
服务器
Web服务器默认情况下通常会广播有关自己的信息。例如
Server: nginx/1.4.6
这与透露关于底层Perl Web应用程序的信息一样有风险。要禁用nginx中的服务器头部,只需将此行添加到您的nginx.conf或虚拟主机文件中
server_tokens off;
对于Apache 1.3x,将这些行添加到您的虚拟主机文件中
ServerTokens Prod
ServerSignature Off
对于Apache 2.x,这些行将加载mod_headers模块,并删除服务器头部
LoadModule headers_module /usr/lib/apache/modules/mod_headers.so
Header unset Server
所有主要的Perl Web框架都附带设置服务器头部的Web服务器
# Catalyst
Server: HTTP::Server::PSGI
# mojolicious
Server: Mojolicious (Perl)
# Dancer
Server: Perl Dancer 1.3121
这些头部可以在应用程序代码中覆盖。例如,如果我们想将服务器更改为看起来是nginx
# Catalyst
$c->response->header('Server' => 'nginx');
# Mojolicious
$self->res->headers->header('Server' => 'nginx');
# Dancer / Dancer2
header 'Server' => 'nginx';
X-Frame-Options
此头部可以防止您的应用程序响应在frame或iframe HTML元素中加载(请参阅规范)。这是为了防止点击劫持请求,其中您的应用程序响应在另一个网站上的不可见iframe中显示,然后当用户在您的网站上点击链接时,它将劫持用户的请求。以下是分别在各自的Web框架中禁用它的方法
# Catalyst
$c->response->header('X-Frame-Options' => 'DENY');
# Mojolicious
$self->res->headers->header('X-Frame-Options' => 'DENY');
# Dancer / Dancer2
header 'X-Frame-Options' => 'DENY';
Strict-Transport-Security
此头部指示请求者通过HTTPS从该域加载所有内容,并且只有在有有效的SSL证书的情况下才加载任何内容。此头部可以帮助防止中间人攻击,因为它确保所有HTTP请求和响应都是加密的。Strict-Transport-Security头部有一个max-age参数,它定义了以秒为单位的策略执行时间。以下是将其添加到您的Perl Web应用程序中的方法
# Catalyst
$c->response->header('Strict-Transport-Security' => 'max-age=3600');
# Mojolicious
$self->res->headers->header('Strict-Transport-Security' => 'max-age=3600');
# Dancer / Dancer2
header 'Strict-Transport-Security' => 'max-age=3600';
Content-Security-Policy
CSP头部设置了一个白名单,列出可以从其中安全加载内容的域名。在恶意内容不由白名单域名托管的情况下,这可以防止大多数类型的XSS攻击。例如,此行指定所有内容都应仅从响应域加载
X-Content-Security-Policy: default-src 'self'
内容安全策略(CSP)有很多内容(更多详情) (规范),浏览器的支持也相当不错(查看兼容性)。使用白名单方法的缺点是它与像谷歌的adsense这样的广告服务不兼容,因为你无法提前知道要添加白名单的域名。要在您喜欢的Perl网络应用程序中设置头部,可以使用以下任意一行:
# Catalyst
$c->response->header('X-Content-Security-Policy' => "default-src 'self'");
# Mojolicious
$self->res->headers->header('X-Content-Security-Policy' => "default-src 'self'");
# Dancer / Dancer2
header 'X-Content-Security-Policy' => "default-src 'self'";
X-Content-Type-Options
这是一个仅适用于IE的头部,用于禁用MIME嗅探。其漏洞在于,当IE尝试检测文件类型时,它会自动执行文件中包含的任何脚本代码。尽管IE默认禁用了这个功能,但为了强制执行它
# Catalyst
$c->response->header('X-Content-Type-Options' => 'nosniff');
# Mojolicious
$self->res->headers->header('X-Content-Type-Options' => 'nosniff');
# Dancer / Dancer2
header 'X-Content-Type-Options' => 'nosniff';
X-Download-Options
这是另一个仅适用于IE的头部,它阻止IE直接从网站下载时打开HTML文件。这里的安全问题是,如果浏览器直接打开文件,它将像网站的一部分一样运行。要添加此头部,可以使用以下任意一行:
# Catalyst
$c->response->header('X-Download-Options' => 'noopen');
# Mojolicious
$self->res->headers->header('X-Download-Options' => 'noopen');
# Dancer / Dancer2
header 'X-Download-Options' => 'noopen';
X-XSS-Protection
这是最后一个仅适用于IE的头部。它是在IE8中作为跨站脚本(XSS)过滤器功能的一部分引入的(更多详情 这里)。此头部可以强制IE打开XSS过滤器。此外,还有一个可选的设置称为“模式”,可以在检测到XSS尝试时强制IE阻止整个页面。以下是添加它的方法
# Catalyst
$c->response->header('X-XSS-Protection' => "1; 'mode=block'");
# Mojolicious
$self->res->headers->header('X-XSS-Protection' => "1; 'mode=block'");
# Dancer / Dancer2
header 'X-XSS-Protection' => "1; 'mode=block'";
在Web服务器中添加头部
您可能更喜欢在Web服务器配置中添加这些头部,而不是在应用程序级别。对于nginx,使用“add_header”指令 - 请参阅这里的示例。对于Apache,使用mod_headers中的“Header set”指令(1.3,2.x)。
测试头部
有多种方法可以检查您的应用程序返回了哪些头部。首先,您可以使用curl(将perltricks.com替换为要检查的URL)
curl -I perltricks.com
这将仅返回HTTP头部
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 31 Mar 2014 01:54:59 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Cache-Control: max-age=3600
X-Frame-Options: DENY
您可以使用SecurityHeaders.com的优秀检查工具。或者,您可以使用浏览器开发者模式自行检查头部。
结论
这些HTTP头部很容易添加,并可以减少您的应用程序对XSS和中间人攻击的脆弱性,尤其是允许用户上传内容的应用程序。
喜欢这篇文章吗?帮助我们,并转发它!
封面照片 © Andy Wright
更新:Mojolicious应用程序头部已修正。Web框架服务器头部已添加。(2014年3月31日)
这篇文章最初发布在PerlTricks.com。
标签
反馈
这篇文章有什么问题吗?请在GitHub上打开一个问题或拉取请求来帮助我们。