Skip to content

Latest commit

 

History

History
167 lines (84 loc) · 7.13 KB

2017.md

File metadata and controls

167 lines (84 loc) · 7.13 KB

2017-12-29

元旦期间,相信大家都被微信小游戏刷屏了,各种玩法攻略铺天盖地。当得知这是用 JS 开发时,立马想把过去写的 JS 游戏都翻新一遍。于是打开小游戏的官网,查看开发文档。

然而遗憾的是,小游戏虽然是用 JS 写的,但它并非运行在浏览器环境里,因此和 HTML 并不兼容。此外,在官网文档上,还看见一条奇葩的规则:

2.与小程序一样,小游戏每次发布需要经过审核。我们在小程序和小游戏中都移除了动态执行代码的能力,包括以下调用方式:
(1)eval 函数
(2)setTimeout、setInterval 函数第一个参数传入代码字符串执行
(3)使用 Function 传入字符串构造函数
(4)使用 GeneratorFunction 传入字符串构造生成器函数

咋一看貌似有些道理,要是开放 eval 的话,代码可以从网络上更新,就能绕过官方审核了。

但是,开发者若真想动态执行,那根本就是拦不住的 —— 在代码里藏一个虚拟机不就可以了吗。之前我们探讨《使用虚拟机混淆 JavaScript 代码》时,就讲解了 JS 虚拟机的概念,让程序根据不同的数据,执行不同的操作。虽然性能不高,但用于简单临时的场合,还是没问题的。

这时冒出个想法:要是能把性能优化得足够好的话,是不是可以让整个小游戏都由虚拟指令实现,这样程序只需发布一次就再也不用审核了呢?

于是开始探索,一个不用 eval、而是由 JS 自我驱动的图灵机,性能最高能达到多少。

某些简单的场合性能可达 100%!细节分享: #3

2017-3-13

周末研究 WebGL2 时写了个 SHA256 PoW 的挖矿原型~

image

Demo: https://www.etherdream.com/FunnyScript/glminer/glminer.html

用笔记本自带的核显每秒可以 3000 万次左右的 SHA256 计算(2013 款 MBP)。如果有独显就更快了,试了下 Titan X 能跑出每秒 4.6 亿 hash/s

当然,即便能 100% 利用 GPU 也远没法和矿机比,更何况 WebGL 只有 50% 左右的效率。不过用于 XSS 分布式密码破解倒是不错,改天写一个破解 WPA2 的算法~

2017-3-8

WebGL 2.0 API Quick Reference Guide

image

https://www.khronos.org/files/webgl20-reference-guide.pdf

WebGL2 终于支持整数和位运算了!

曾有人试图用 WebGL1 挖矿,由于不支持整数和位运算,只能靠浮点计算模拟,效率大大的低~

2017-3-6

5.4M 的 JS 文件。。。打开控制台就卡了十几秒,点 format 卡了半分钟~ 不过运行倒是很流畅

image

image

期待 WebAssembly 快点普及吧~

2017-3-5

写了个「阻止 XSS 自动发表留言」的案例,可以减缓蠕虫传播。试试你能不能绕过它~

Demo: https://www.etherdream.com/FunnyScript/anti-xssworm/

原理很简单,用一个「跨源」的 iframe 充当按钮,起到 JS 隔离效果。另外,数据也通过 iframe 提交,后端通过 referer 即可判断是不是 iframe 提交的。

当然,这个方案阻止不了 clickjacking。

详解:https://www.cnblogs.com/index-html/p/anti_xss_worm.html

2017-3-2

经常看到有人讨论如果不能用 HTTPS 只能用 HTTP 页面,该如何对抗中间人劫持的问题。

其实可以用个黑科技缓解:浏览器强缓存。比如用 HTML5 AppCache、max-age 等将页面强缓存,子资源则通过 JS 加密传输。

这样可把风险降到首次访问上,以后就算遇到不安全的网络,访问入口页面仍是缓存里的内容(除非第一次访问时就被劫持,否则仍是之前遗留的安全内容)。

这种方案类似 TOFU(Trust on First Use,信任首次使用)的思想。

2017-3-1

都忘了 <fieldset> 标签还有个 disabled 属性,设置了可以把里面的表单控件都禁用。。。

image

Demo: https://jsfiddle.net/c4r9956m/

SHOW ME THE CODE
<fieldset disabled>
  <legend>title</legend>
  <input type="text" value="user">
  <input type="radio" name="chk">A
  <input type="radio" name="chk">B
  <select>
    <option>1</option>
    <option>2</option>
  </select>
  <button>submit</button>
</fieldset>

2017-2-28

在想 ServiceWorker 能不能和 WebRTC 配合使用,让静态资源都用 P2P 传输,节省服务器流量。。。

已有人尝试过了,项目叫 PeerCDN,效果貌似并不好。

2017-2-12

做了个保护网站弱口令的原型

Demo: https://www.etherdream.com/webscrypt/example/login/

大家可以尝试破解看。密码很短,并且是纯数字,破解成功会显示红包~

算法和数据库都是公开的:https://github.com/EtherDream/WebScrypt/tree/master/example/login

6 位数口令的还没有人破解,不过红包已经过期了。。。

2017-2-11

周末更新了浏览器版的 scrypt 算法:https://github.com/EtherDream/WebScrypt

image

本来打算叫 scrypt.js 的,不过想了下也不全是 js 实现的,比如老版本浏览器用的就是 Flash,以后还会用到 WebAssembly。于是就叫 WebScrypt 了~

现阶段主要亮点就是 asm.js 实现,并且在 C 代码上做了些修改,比如把 blockmix、salsa20 这些高频率执行的代码全部展开,放在同个栈上,这样就能避免大量的 TypedArray 访问。Chrome 下可提升 1 倍以上的性能,有兴趣的可参考此处

另一个亮点是写了个小工具把 emscripten 生成的代码大幅精简,只保留基本的 asm.js 逻辑代码。原本生成的 js 有上万行,但大部分功能都用不到。当然这个小工具可能不是很通用,需要根据自己的需要改造。

还有就是通过 Flash 兼顾老版本浏览器的性能,所以从就算是 IE6 算力也不会太低(能有 asm.js 的一半左右),比自身的 JS 引擎快多了。

最后,关于这个项目的初衷,就是想在不增加后端硬件投入的前提下,通过纯前端实现,来增强网站的安全性,大幅降低暴力破解口令的难度(几千到几百万倍),这里有个简单的演示,就算是弱口令也很难破解。

(更多细节原理之后再讲解)

这个项目很久没更新,有些地方需要大改动了~

2016

2016.md