安全 如何实现 “限制网页只在特定 APP 中打开”?

flybee · 2018年08月21日 · 最后由 flybee 回复于 2018年12月04日 · 15160 次阅读

目标:实现也定的网页只能在自己开发的 APP 中打开,其他地方都不能打开该网页。 已知的方法有:

  1. 判断请求 body 中的 UA;
  2. 客户端重写 URL 请求 (例如:将 xxxx.com/a.html 的请求在客户端进行请求重定向至 xxx.com/b.html)
  3. 客户端通过与 web page 的 js 交互,加密了一些信息,这些信息里面包括用户认证信息、时间戳之类的,然后将加密后的信息当成请求参数附加到请求 URL 中,当用户访问该 URL 时,服务器进行合法性校验;

第一种方法:简单,但是最容易 workaround,直接改写 UA 就行了; 第二种方法:通过对客户端的请求抓包,一样可以很容易的破解; 第三种方法:破解难度大一些而已,但是也不是绝对地不可破解。就算有时间戳限制,但是在时间戳范围内,页面请求的 URL 还是可以通过抓包直接打开

请问大家有什么解决方案?像支付宝这种对安全性非常高的应用是采用的什么手段?

url 动态生成吗!

zouyu 回复

动态生成的 URL 被复制了 在其他浏览器还是能打开啊

可以做成类型微信网页授权的,微信是用 JS 在 APP 和网页之间通信的,这个库貌似可以 jockeyjs

w7938940 回复

上面说的第三种方法就是类似于你说的这种做法

@Rei @huacnlee 大师给答疑一下啊

理论上不存在 100% 不可破解的方法。但只要设计一个方法使其破解成本远远高于破解收益便可认为不会被破解。第三种方法就是正途,对请求数据进行签名,主要在加密方法和密钥上面下功夫增加破解难度。时间戳这个,叫重放攻击,减少时间间隔可以增加攻击难度,也可以使用序号防止重复请求。不过也不存在 100% 安全的情况。

感觉还有一种思路,就是把 html 压缩,不是有什么 gzip 之类的压缩么。如果你用普通浏览器无法读的算法来压缩。然后通过定制 webview 或者用 js 调用本地模块 来解压缩。。。。

DouO 回复

说的很有道理!查了很多资料,感觉一切的做法只是增加破解的难度。 感觉做这个东西首先要考虑的是“你想要保护的东西的价值是多大”,如果要保护的东西的价值不是很大,别人破解你的动力很小的话,没必要在防破解上整的很复杂。不过为了不断追求完美,还是应该学习一下这方面的知识。不断学习,防止被忽悠😂

hxgdzyuyi 回复

思路不错

一次性签名

yingce 回复

一次性签名一样不能防止盗链,同时,一次性签名还会带来不好的用户体验

flybee 回复

加校验机制 或者是一次性的

😀 要想高安全性,必然是影响用户体验,这是鱼和熊掌的关系。 如果只是防止浏览器访问你的网页 可以在你的 app 里面加特殊的请求头,一般的浏览器访问网页,请求头都是固定的 肯定不会发你 app 添加的请求头 用复制 url 的方法肯定搞不定 奇葩一点的话 可以修改 reponse-header 比如 什么 content-type 为 json 的 xml 啊,content-type 为 xml 的 html 啊 你自己的内置浏览器解析要搞好

常见的做法是在请求里面添加签名 保证请求是来自你的 app 因为你 app 不管怎么做 一般都不会防范使用 app 然后拿 app 的请求去抓包。

😂 我突然想到一种神经病的做法 就是所有请求的返回码都是 404 这样浏览器就会忽略你 response-body 但是你可以在你的 app 里面继续使用

这种做法跟识别特定的 UA 是一样的道理,只能做基本的防护,用任一款网络请求分析工具都能看到 APP 发出去的 HTTP 请求的详细信息。

“我突然想到一种神经病的做法 就是所有请求的返回码都是 404 这样浏览器就会忽略你 response-body 但是你可以在你的 app 里面继续使用”你说的这种方法其实有人在用,就是 HTTP 请求得到的是加密后的 HTML 文本,只有自己的 APP 内的改造过的浏览器才能渲染,这种方法的破解难度要大多了

请问有实现的了吗?我需要这个功能,调用的网页只允许在 app 内访问,如果复制链接到浏览器提示跳转 app,愿付费解决,联系 qq 九 3 六五 9

555868 回复

比较严格限制的需求下,可以着怎样做:APP 内发出的 HTTP 请求至服务器,服务器返回的是加密后的页面,客户端拿到加密后的页面后,解密,渲染。这个是目前很多 APP 采用的做法。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号