get 请求到的数据如何能不被别人扒下来

2016-10-18 23:45:29 +08:00
 Lpl

比如有个 GET 类型的 api :https://www.xxx.com/api/article/list

我们可以通过工具查看到 api 返回的值,那么等于说这个接口是暴露出来了(或者 app 中反编下源码也能找到对应的 api )。那么不就是可以通过程序调用 api 把这些数据拖出来了么?

现在很多 WEB 端网站用的都是 view 层模板的形式, GET 请求得到的直接是页面,这种自然不会把数据给暴露出来。 但是对于有很多 RESTful 接口的网站,数据都会被暴露出来,然后就能把暴露出来的数据扒下来。如果不想把这些数据扒下来的话要怎么办?

我想了两个办法:

  1. 类微信那种的,加 token ;
  2. 增加 IP 限制,无论是在代码或者 Nginx 做配置都行,限定特定 IP 访问。

不知道有没有其它解决办法? 还有第一个,如果用加 token 解决的话要怎么弄。。

5758 次点击
所在节点    程序员
31 条回复
ooTwToo
2016-10-18 23:55:07 +08:00
客户端:
- 往 header 里面增加一个 sign ,算法可以是: MD5(secretkey+ timestamp)。
- 往 header 里面增加一个 timestamp 。

服务端:

- 验证 timestamp 有效性(一般早于服务器时间 10 分钟左右)
- 验证 sign 有效性( MD5(secretkey+ timestamp))


以上,个人经验。
Lpl
2016-10-18 23:57:45 +08:00
@ooTwToo 这个不错哎,可以试试,感觉也很优雅
ooTwToo
2016-10-19 00:02:10 +08:00
@Lpl QAQ 优雅算不上,只是每个请求都要这样重复很蛋疼…
hshpy
2016-10-19 00:51:41 +08:00
只能增加爬虫获取数据的难度,具体看反爬虫,找一两种实现吧
msg7086
2016-10-19 01:00:10 +08:00
其实并没有办法。任何你程序能读到的信息,全世界人都能读到。

只是简单点还是难点的问题。
ibigbug
2016-10-19 01:07:33 +08:00
> GET 请求得到的直接是页面,这种自然不会把数据给暴露出来

一样是暴露的,可以通过解析页面数据获取想要的数据。
txlty
2016-10-19 01:12:00 +08:00
被人盯上,且对方肯花时间和经济成本。那就基本上不可防了。
txlty
2016-10-19 01:26:57 +08:00
其实可以耍点损招让对方难受一下。比如,识别出某个请求明显来自爬虫,然后可以在正常数据中,循环穿插大量重复数据、错误数据、随机数据、垃圾数据。
这是最好的方式。比直接封掉对方 IP 更有效。
bwangel
2016-10-19 08:13:43 +08:00
@ooTwToo ,请问一下客户端这个 `secretkey` 得要服务器事先发送过来吧?
mcfog
2016-10-19 08:21:07 +08:00
a.通过工具看请求或者拆你的客户端和你是 get 还是 post 无关,一样是都能拆出来
b.get 一个页面数据一样在页面里,一样暴露出来,不如说你要展示给用户当然就一定暴露出来
c.先把业务做好再来考虑防抓,内容真的好的话会有大学生兼职人工抄你的内容根本挡不住,靠防抓是做不成业务的
finian
2016-10-19 08:39:13 +08:00
防不了,最多也只能增加破解成本。像一楼的方案,拿到 `secretkey ` 就可以破解了。一般通过以下方案增加破解成本:
- 使用 HTTPS
- 使用 SSL Pinning
- 客户端数据加密方案(一定程度上保护 secretkey 等敏感数据)
- 客户端加固方案(加壳、插花、防内存 dump 、防篡改、防调试。。。)
annielong
2016-10-19 09:02:25 +08:00
手机淘宝天猫好像直接走 443 端口了,嗅探不到,微信一些第三方公众号有时候能嗅探到 api ,但是看不到网页的图片 j 、 js 、 css 资源
ooTwToo
2016-10-19 09:04:24 +08:00
@bwangel 是的,客户端和服务器约定好的。
qianddream
2016-10-19 09:25:05 +08:00
view 层模板和 RESTful 都会将数据公开在网上,是一样的。

想要防爬虫的话,只能从如何判别正常用户和爬虫入手,就算你判别出来了还有模拟浏览器的方法可以抓。

微信和淘宝都是可以抓取数据的,不过代价很高。

如果是敏感信息不显示只做验证用的话,建议 hash ,再加过期验证。
killerv
2016-10-19 09:52:18 +08:00
完全防御是不可能的,最多增加抓取成本。
misaka19000
2016-10-19 09:57:25 +08:00
楼主的思路应该转变一下,是这样:
不要想完全防御爬虫,只需要让爬虫的制作者进行爬取的成本高于他所获得的收益即可
alouha
2016-10-19 10:20:26 +08:00
@ooTwToo timestamp 这个是客户端本地时间还是从服务器取的呢,毕竟客户端本地时间可以修改
lgh06
2016-10-19 10:28:46 +08:00
@ooTwToo 我想到了 Google Authenticator ……将军令之类的也是一样…… 或者用用 json web token 之类的 接口做下验证。 http://jwt.io
ooTwToo
2016-10-19 10:30:34 +08:00
@alouha 对,客户端。 你可以再改变一下验证规则,增加一下破解难度。
比如: UA 、 Referer ;再将 sign 算法更改一下,我看乐视 API 的做法是:将 secretkey 之外的公共参数升序排序,然后再 MD5 ,这样增加了爬虫的成本。

接触这方面不久,经验不足,如有见解,欢迎言论。
BOYPT
2016-10-19 10:33:55 +08:00
(我看标题第一个想法是,返回图片呀

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/313716

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX