让浏览器不再显示 https 奥门永利误乐域页面中的 http 请求警报

让浏览器不再显示 https 页面中的 http 请求警报

2015/08/26 · 基础技术 ·
HTTPS,
浏览器

原文出处:
李靖(@Barret李靖)   

HTTPS 是 HTTP over Secure Socket Layer,以安全为目标的 HTTP 通道,所以在
HTTPS 承载的页面上不允许出现 http 请求,一旦出现就是提示或报错:

Mixed Content: The page at ‘https://www.taobao.com/‘ was loaded over
HTTPS, but requested an insecure image ‘http://g.alicdn.com/s.gif’.
This content should also be served over HTTPS.

HTTPS改造之后,我们可以在很多页面中看到如下警报:

奥门永利误乐域 1

很多运营对 https 没有技术概念,在填入的数据中不免出现 http
的资源,体系庞大,出现疏忽和漏洞也是不可避免的。

摘要

目前有许多的恶意攻击都是以网站及其用户作为目标,本文将简要介绍在 Web
服务器一侧的安全加固和测试方法。

攻击方式 防护方式 说明
点击劫持(clickjacking) X-Frame-Options Header —–
基于 SSL 的中间人攻击(SSL Man-in-the-middle) HTTP Strict Transport Security —–
跨站脚本(Cross-site scripting,XSS) X-XSS-Protection、Content-Security-Policy、X-Content-Type-Options —–

CSP设置upgrade-insecure-requests

好在 W3C 工作组考虑到了我们升级 HTTPS 的艰难,在 2015 年 4
月份就出了一个 Upgrade Insecure Requests 的草案,他的作用就是让浏览器自动升级请求。

在我们服务器的响应头中加入:

header(“Content-Security-Policy: upgrade-insecure-requests”);

1
header("Content-Security-Policy: upgrade-insecure-requests");

我们的页面是 https 的,而这个页面中包含了大量的 http
资源(图片、iframe等),页面一旦发现存在上述响应头,会在加载 http
资源时自动替换成 https 请求。可以查看 google
提供的一个 demo

奥门永利误乐域 2

不过让人不解的是,这个资源发出了两次请求,猜测是浏览器实现的 bug:

奥门永利误乐域 3

当然,如果我们不方便在服务器/Nginx
上操作,也可以在页面中加入 meta 头:

XHTML

<meta http-equiv=”Content-Security-Policy”
content=”upgrade-insecure-requests” />

1
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests" />

目前支持这个设置的还只有 chrome 43.0,不过我相信,CSP 将成为未来 web
前端安全大力关注和使用的内容。而 upgrade-insecure-requests 草案也会很快进入
RFC 模式。

从 W3C
工作组给出的 example,可以看出,这个设置不会对外域的
a 链接做处理,所以可以放心使用。

1 赞 收藏
评论

奥门永利误乐域 4

点击劫持(Clickjacking)

点击劫持,clickjacking
是一种在网页中将恶意代码等隐藏在看似无害的内容(如按钮)之下,并诱使用户点击的手段,又被称为界面伪装(UI
redressing)。例如用户收到一封包含一段视频的电子邮件,但其中的“播放”按钮并不会真正播放视频,而是被诱骗进入一个购物网站。

奥门永利误乐域 5

针对点击劫持攻击,开放Web应用程序安全项目(Open Web Application Security
Project
,OWASP)
(非营利组织,其目的是协助个人、企业和机构来发现和使用可信赖软件)
提供了一份指引,《Defending_with_X-Frame-Options_Response_Headers》

X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在 frame
标签 或者 object
标签中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌到别人的网站中去,也从而避免了点击劫持
(clickjacking) 的攻击。DENY:表示该页面不允许在 frame
中展示,即便是在相同域名的页面中嵌套也不允许。SAMEORIGIN:表示该页面可以在相同域名页面的
frame 中展示。ALLOW-FROM uri:表示该页面可以在指定来源的 frame
中展示。配置如下:

//HAProxy
http-response set-header X-Frame-Options:DENY
//Nginx
add_header X-Frame-Options "DENY";
//Java
response.addHeader("x-frame-options","DENY");

跨站脚本 Cross-site scripting (XSS)

跨站脚本通常指的是通过利用开发时留下的漏洞,注入恶意指令代码(JavaScript/Java/VBScript/ActiveX/Flash/HTML等)到网页,使用户加载并执行攻击者恶意制造的程序。攻击者可能得到更高的权限、私密网页、会话和cookie等各种内容。目前有两种不同的
HTTP 响应头可以用来防止 XSS 攻击,它们是:

  • X-XSS-Protection
  • Content-Security-Policy

X-XSS-Protection

HTTP X-XSS-Protection 响应头是Internet
Explorer,Chrome和Safari的一个功能,当检测到跨站脚本攻击
(XSS)时,浏览器将停止加载页面。配置选项:0 禁止XSS过滤。1
启用XSS过滤(通常浏览器是默认的)。
如果检测到跨站脚本攻击,浏览器将清除页面(删除不安全的部分)。mode=block
启用XSS过滤,
如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载。report=reporting-URI
启用XSS过滤。 如果检测到跨站脚本攻击,浏览器将清除页面并使用 CSP
report-uri 指令的功能发送违规报告。参考文章《The misunderstood
X-XSS-Protection》
:

//HAProxy
http-response set-header X-XSS-Protection: 1;mode=block
//Nginx
add_header X-Xss-Protection "1; mode=block" always;;

浏览器支持情况:

Chrome Edge Firefox Internet Explorer Opera Safari
(Yes) (Yes) No 8.0 (Yes) (Yes)

Content-Security-Policy

内容安全性政策(Content Security
Policy,CSP)就是一种白名单制度,明确告诉客户端哪些外部资源(脚本/图片/音视频等)可以加载和执行。浏览器可以拒绝任何不来自预定义位置的任何内容,从而防止外部注入的脚本和其他此类恶意内容。设置
Content-Security-Policy Header:

//HAProxy:
http-response set-header Content-Security-Policy:script-src https://www.google-analytics.com;https://q.quora.com
//Nginx
add_header Content-Security-Policy-Report-Only "script-src https://www.google-analytics.com https://q.quora.com";

发表评论

电子邮件地址不会被公开。 必填项已用*标注