例如现在用angularjs开发的web app,后端几乎只输出JSON数据,前端通过angularjs来显示和做交互。 那问题来了。 既然后端输出的都是JSON,那如何防止第三方抓取数据?
https
通过 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 是怎么来的?
conf.domain
这个完全防不胜防,唯一的办法就是进行用户数据获取行为分析,找出可疑IP或用户进行智能封禁,但是吧,你的规则被知道后也就是增加难度而已,就跟微博永远都能有人刷广告评论一样,无论他的广告规则有多牛,增加的只是难度。
作为一个crawler,表示想要爬你,肯定有方法。 一般防一下跨域爬数据就好,另外一些用户id,或者文章id不要连续,设置一下回环的链接。
首先你要明白,你不可能杜绝抓取,只能不断增加抓取成本,启用更复杂的令牌和令牌获取方式,使用HTTPS. 但是像你自己说的一样 无论你令牌获取的方式有多复杂 ,无论你是用cookie 或者websql存储 你总有一个固定的模式,只要别人知道你的模式 依然是不能杜绝,但可以增加他抓取的难度. 或者你换个思路 使用 websocket 或者 webrtc的 datachannel来传数据,这种方式相对HTTP 要安全一些 但也仅是增加抓取成本
@think2011 conf.domain是你自己的域名 比如 “example.com”,这里只不过是一个配置变量
@think2011 如果发现是服务器大量抓取数据就封IP
浏览器+按键精灵,所有的方案都是渣渣。。。。唯一的方案就是监控访问频率,只不过也一样可以绕过
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
https
通过 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 服务器端
模板
客户端
另外,因为现代浏览器都不支持JS跨域数据,不必过分担心这个问题。 对于利用服务器抓取数据,在服务器端做一个判断,不过只是防君子不防小人
我想需要花时间研究一下,主要想解决的就是服务器抓取的方式。
最后一段不是很明白
还有
conf.domain是怎么来的?这个完全防不胜防,唯一的办法就是进行用户数据获取行为分析,找出可疑IP或用户进行智能封禁,但是吧,你的规则被知道后也就是增加难度而已,就跟微博永远都能有人刷广告评论一样,无论他的广告规则有多牛,增加的只是难度。
作为一个crawler,表示想要爬你,肯定有方法。 一般防一下跨域爬数据就好,另外一些用户id,或者文章id不要连续,设置一下回环的链接。
首先你要明白,你不可能杜绝抓取,只能不断增加抓取成本,启用更复杂的令牌和令牌获取方式,使用HTTPS. 但是像你自己说的一样 无论你令牌获取的方式有多复杂 ,无论你是用cookie 或者websql存储 你总有一个固定的模式,只要别人知道你的模式 依然是不能杜绝,但可以增加他抓取的难度. 或者你换个思路 使用 websocket 或者 webrtc的 datachannel来传数据,这种方式相对HTTP 要安全一些 但也仅是增加抓取成本
@think2011 conf.domain是你自己的域名 比如 “example.com”,这里只不过是一个配置变量
@think2011 如果发现是服务器大量抓取数据就封IP
浏览器+按键精灵,所有的方案都是渣渣。。。。唯一的方案就是监控访问频率,只不过也一样可以绕过