纯粹用JSON进行前后端交互的模式,如何防止被抓取数据,盗用API?
发布于 8个月前 作者 think2011 1692 次浏览

例如现在用angularjs开发的web app,后端几乎只输出JSON数据,前端通过angularjs来显示和做交互。 那问题来了。 既然后端输出的都是JSON,那如何防止第三方抓取数据?

22 回复

通过 oauth 方式,增加权限控制

跟https没关系。 如果是封闭系统,可以限制带身份信息(登录后)才可获取数据; 如果不希望有此限制,可以在访问页面时种cookie,由js计算cookie的特征值作为参数带上发给接口,后台比对cookie与特征值参数是否符合即可

cookie在客户端不是能够被伪造和破解吗?

有什么用? 注册-登录-看到cookie-带cookie扒数据

用oauth也没用吧,只要网页能取到token,那不还是用程序就能带进去的事情

这也是我一直想问的问题,关注

我想到的只有增加抓取难度的方法,而不知道有没有什么治本的方法,restful的网站太好爬了

这个和用不用JSON的关系不大吧

要想防止爬数据,很难滴!!!除非: 1、使用硬件令牌(比如银行的USB盾); 2、数据加密传输(AMF3)和显示使用Flash,并且对Flash代码进行混淆、加密、加外壳; 3、API被连续请求一定次数后,要求输入验证码(各种变态点的验证码);

就算是以上几点你都做到,俺还是能抓取你的数据滴,只是难度高一点,效率低一点而已…… 兄弟,别想了,这个很难得……

https://github.com/514366607/encrypt 加个密,但是前端JS这块好像没什么好办法 。。

set-cookie:…;httponly 自己查看一下文档。对新浏览器都可以有效防止js抓取cookie;对老浏览器没有好办法。

@xlaok 计算特征值的算法是你自己决定的,虽然说可以通过看js代码了解计算算法,但是如果对js代码做了混淆,并刻意制造复杂逻辑,抓取者要搞清楚并模拟出这个过程代价是很大的。这种情况只能利用这种信息不对称实现防抓取,既然是希望资源可以被公开(不经身份认证)访问的话。

不懂angularjs, express+swig+jquery的话,我用csrf中间件,客户端数据请求都用post 服务器端

var csrf = require('csurf');
app.use(function (req, res) {
    res.locals._csrf = req.csrfToken();
    req.next();
});

模板

<script>
    var csrf = {{ _csrf|json|safe }};
</script>

客户端

$(function() {
    $.ajaxSetup({
        headers: {
            'X-CSRF-Token': csrf
        }
    });
    $.post(url, data, function(returnedData) {
        console.log(returnedData);
    });
});

另外,因为现代浏览器都不支持JS跨域数据,不必过分担心这个问题。 对于利用服务器抓取数据,在服务器端做一个判断,不过只是防君子不防小人

    app.all('/api/*', function(req, res, next){
          var origin = req.get('origin');
        if(origin){
            var returnURL = url.parse(origin);
            if(returnURL.hostname != conf.domain ){
                return res.send(500);
            }
            next();
    });

我想需要花时间研究一下,主要想解决的就是服务器抓取的方式。

最后一段不是很明白

 if(returnURL.hostname != conf.domain ){
                return res.send(500);
            }

还有 conf.domain 是怎么来的?

这个完全防不胜防,唯一的办法就是进行用户数据获取行为分析,找出可疑IP或用户进行智能封禁,但是吧,你的规则被知道后也就是增加难度而已,就跟微博永远都能有人刷广告评论一样,无论他的广告规则有多牛,增加的只是难度。

作为一个crawler,表示想要爬你,肯定有方法。 一般防一下跨域爬数据就好,另外一些用户id,或者文章id不要连续,设置一下回环的链接。

首先你要明白,你不可能杜绝抓取,只能不断增加抓取成本,启用更复杂的令牌和令牌获取方式,使用HTTPS. 但是像你自己说的一样 无论你令牌获取的方式有多复杂 ,无论你是用cookie 或者websql存储 你总有一个固定的模式,只要别人知道你的模式 依然是不能杜绝,但可以增加他抓取的难度. 或者你换个思路 使用 websocket 或者 webrtc的 datachannel来传数据,这种方式相对HTTP 要安全一些 但也仅是增加抓取成本

@think2011 conf.domain是你自己的域名 比如 "example.com",这里只不过是一个配置变量

@think2011 如果发现是服务器大量抓取数据就封IP

浏览器+按键精灵,所有的方案都是渣渣。。。。唯一的方案就是监控访问频率,只不过也一样可以绕过

回到顶部