Chrome 禁止从页面打开 Data URI 网址了
现如今,网民的网络账户被盗,很有可能是被“钓鱼”了。去年的一份安全报告中指出:“近85%的资金损失是通过钓鱼网址泄露支付信息造成的”。
传统的钓鱼网站通常是申请一个和被冒充网站相似的域名,比如 taobao000.com ,或者直接利用三四级域名来冒充,比如 taobao.com.evil.com。
钓鱼网址一般是通过邮件、短信、聊天工具等传输系统发送给目标群体的,于是这些传输系统的运营商会责无旁贷的采取措施,来尽可能的检测并屏蔽那些钓鱼网址,而且即便它们不做,现代的浏览器也都会做这件事。最常见的钓鱼网址检测技术就是维护一个钓鱼网站域名的黑名单,或者使用别的组织共享出来的黑名单(比如谷歌的 Safe Browsing)。一旦某个钓鱼网站被添加进了这个黑名单,那么它的主人钓鱼成功的概率就会大幅降低。
如何跳过这些检测?如何不使用常规的网址来存放网页?于是有人想到了利用 Data URI。仅仅在 2017 年,我就看到已经有两家网络安全公司发文,分别讲了两个利用 Data URI 来钓鱼的真实案例,一个是针对 Gmail,一个是针对 Yahoo Mail。我这里做了一个仿冒淘宝登录页的钓鱼页面 的demo,你可以体验一下。
利用 Data URI,可以把整个网页的内容都放到这个 URL 里。由于 Data URI 完全没有域名的概念,所以黑名单屏蔽技术对他无效。而且除此之外,还有一个 bonus,那就是你可以在一个 Data URI 的头部放置任意你想冒充的网站的网址,像这样:

在这个真实的 Gmail 登录网址的后面是一连串的、比被钓鱼者的屏幕还要宽的空格,隐藏在这些空格后面的,才是真正的网页源码:

普通网民很容易忽略 “data:text/html,” 这几个多出来的字符。有了这个 bonus,钓鱼者的钓鱼成功率更高了,而且不用总花钱去换域名了。
为此,Chrome 从 56 开始,在地址栏左侧把 Data URI 标记成了“不安全”网址:

这可能会减少一些钓鱼事件的发生,但考虑到一些网民完全没有看地址栏的习惯(尤其是现在有一些浏览器故意弱化地址栏)、以及在移动端 WebView 打开网页完全没有地址栏,于是 Chrome 从 60 开始,采取了一种更彻底的方式:屏蔽从页面打开的 Data URI 网址(相对应的行为是在地址栏回车打开 Data URI 网址)。
比如下面这个 <a> 链接:
<a href="data:text/html,foo">
如果你单击这个链接的话,会直接报错,Not allowed to navigate top frame to data URL:

但在右键菜单中点击 “在新标签中打开链接”、“在新窗口中打开链接” 不受影响。此外,这次还会屏蔽下面这些跳转方式(30x 跳转若干年前就已经屏蔽了):
1. html 里添加 <meta http-equiv="refresh" content="0;url=data:text/html,foo" />
2. 响应头里添加 refresh: 0;url=data:text/html,foo
3. JS 里执行 window.open("data:text/html,foo")
4. JS 里执行 location.href = "data:text/html,foo"
等一切能让页面跳转到 Data URI 的方式都会被屏蔽,其中 open() 方法打开的新标签页面会被强制替换成 about:blank。其实 Chrome 的这些屏蔽措施之前就已经应用到了 file: 和 chrome: 等协议上了。
例外情况除了上面说的右键菜单中的各种操作,还有:
1. <a download>
2. 当指定的 MIME 触发了浏览器下载逻辑的情况,比如 open("data:application/zip,foo")
3. 直接在地址栏上输入 Data URI 并回车
当然还有我们常用的,Data URI 没有用在顶层页面网址的情况,比如作为 <img> 的 src 属性,<iframe> 的 src 属性,CSS 里的 url() 的参数等,都不受影响。
在 Chrome 60 之前的三个版本 Chrome 57、58、59 中,当你打开一个 Data URI 页面,会有一句警告信息,提醒开发者提前做迁移:

Chrome 的人做了统计,说从非 Data URI 页面跳到 Data URI 页面的情况只有不到万分之五的概率,如果你的网站恰巧用到了这种在前端生成页面的方式,可以尝试迁移到后端来生成。
Chrome 禁止从页面打开 Data URI 网址了的更多相关文章
- Data URI 应用场景小结
Data URI scheme 在前端开发中是个常用的技术,通常会在 CSS 设置背景图中用到.比如在 Google 的首页就有用到: Data URI scheme 简称 Data URI,经常会被 ...
- 细说 Data URI
Data URL 早在 1995 年就被提出,那个时候有很多个版本的 Data URL Schema 定义陆续出现在 VRML 之中,随后不久,其中的一个版本被提上了议案——将它做个一个嵌入式的资源放 ...
- Data URI(转)
Data URL 早在 1995 年就被提出,那个时候有很多个版本的 Data URL Schema 定义陆续出现在 VRML 之中,随后不久,其中的一个版本被提上了议案——将它做个一个嵌入式的资源放 ...
- 关于Data URI
[新增]:http://www.webhek.com/post/data-url.html 引子:在研究FileReader时,有个方法readAsDataURL;然后看到打印出来的东西类似于如下:[ ...
- 什么是URI、URL、URN、URC和Data URI?
前言 不知道大家有没有电话拨号通过'猫'上网的经历,那时测试网络是否连接,最好的方式就是打开浏览器输入: www.baidu.com 那会管这一连串字母叫' 网址 '.之后上大学(计算机专业),知道了 ...
- Chrome调试手机页面
新开发的网页需要在手机或是模拟机上运行测试,如果手头事件比加紧,那么可以借助 Chrome提供的手机网页预览程序进行简单调试.查看 制作的网页是否能够适合各种手机型号使用. 下面所以下如何使用Chro ...
- JS魔法堂:Data URI Scheme介绍
一.前言 上周五公司内部的Any Topic Conf.上我和同事们分享了这个主题,有同事说这个有用,有同事说这个没啥用,后来还延伸到网站性能的话题上,大家讨论的激烈程度让我觉得这次选题还不错.本篇先 ...
- android studio使用CMake和NDK,实现应用自身被卸载时打开某一网址
实现应用自身被卸载时打开某一网址的c代码 MyActivity: public class MyActivity extends Activity { /** * Called when the ac ...
- 通过html页面打开Android本地的app
http://www.cnblogs.com/yejiurui/p/3413796.html 一.通过html页面打开Android本地的app 1.首先在编写一个简单的html页面 <html ...
随机推荐
- C#默认参数原理探究
起因 写这一篇的起因是想要通过新增默认参数来代替以前的方法,结果发现尽管在调用时写起来一样,实际上也没有被当做同样的方法,两个方法大致如下: // 先前的方法-删除 private static st ...
- 【Python 11】汇率兑换4.0(函数)
1.案例描述 设计一个汇率换算程序,其功能是将美元换算成人民币,或者相反. 2.0增加功能:根据输入判断是人民币还是美元,进行相应的转换计算 3.0增加功能:程序可以一直运行,知道用户选择退出 4.0 ...
- 微信小程序设置域名、不校验域名
设置--项目设置 将不校验域名勾上就可以了,不再校验域名了通过 url: 'https://localhost:8443/spring4/user/list.do',就可以访问后台了. 若要配置域名则 ...
- 深入剖析Redis系列:Redis数据结构与全局命令概述
前言 Redis 提供了 5 种数据结构.理解每种数据结构的特点,对于 Redis 的 开发运维 非常重要,同时掌握 Redis 的 单线程命令处理 机制,会使 数据结构 和 命令 的选择事半功倍. ...
- C语言之四舍五入
在C语言中,如果进行强制类型转换,它会将所需要取的位数直接提取出来,而其他位数的数字会被直接删除,不会对提取出来的位数有任何影响 所以如果我们需要提高精度,对所取的数进行四舍五入,需要给所需去的数的最 ...
- SQL拼接字符串时单引号转义问题 单引号转义字符
要拼接一个单引号到已有字符串前后, 开始以为(错误)可以用 \ 转义,如下: '\''+ str+'\'' 看颜色就知道是不行的. 正确方法是两个单引号就转义为单引号,如下: ''''+str+'' ...
- Spring-framework
1.spring注解驱动开发 官方文档 @Configuration 告诉spring这是一个配置类,配置类=配置文件 @Bean 给容器中注入一个bean,类型为返回值类型,id默认用方法名作为id ...
- c指针作业(第一次)
1. 数据类型的本质是什么? (从编译器的角度考虑) 数据类型可理解为创建变量的模具:是固定内存大小的别名 数据类型的作用:编译器预算对象(变量)分配的内存空间大小 注意:数据类型只是模具,编译器并没 ...
- 利用JDBC工具类 模拟用户登录!
一.建库 设置 id为主键并自增! 二.定义登录接口 package com.aaa.dao; public interface IDengDao { /* 1.定义一个登陆的接口,参数是name 和 ...
- python之常用模块一(time、random、os、sys)
摘要:时间模块time .随机模块random .os模块.sys模块 一.时间模块 三种格式 时间戳时间:浮点数 单位为秒 时间戳起始时间: 1970.1.1 0:0:0 英国伦敦时间 1970.1 ...