Nodejs中纯粹用JSON进行前后端交互的模式,如何防止被抓取数据,盗用API?
Nodejs中纯粹用JSON进行前后端交互的模式,如何防止被抓取数据,盗用API?
例如现在用angularjs开发的web app,后端几乎只输出JSON数据,前端通过angularjs来显示和做交互。 那问题来了。 既然后端输出的都是JSON,那如何防止第三方抓取数据?
在Node.js应用中,如果你使用纯JSON进行前后端交互,并且希望防止数据被第三方抓取或API被滥用,可以采用以下几种方法:
1. 使用API密钥认证
原理:每个合法的客户端(如前端应用)都有一个唯一的API密钥。每次请求API时,都需要提供这个密钥。服务器端会验证密钥的有效性。
示例代码:
const express = require('express');
const app = express();
// 假设这是你的API密钥存储
const API_KEYS = {
'my-app': 'abc123',
};
app.use(express.json());
app.get('/data', (req, res) => {
const apiKey = req.headers['x-api-key'];
if (!apiKey || API_KEYS[apiKey] !== 'abc123') {
return res.status(403).json({ error: 'Unauthorized' });
}
// 返回数据
res.json({
message: "Hello World",
data: [/* 你的数据 */]
});
});
app.listen(3000, () => console.log('Server running on port 3000'));
在这个例子中,客户端需要在请求头中包含x-api-key
字段,其值为有效的API密钥。服务器会检查该密钥是否有效,如果无效,则返回403错误。
2. 使用OAuth 2.0认证
原理:OAuth 2.0是一种更为复杂的认证机制,通常用于更严格的场景。它允许用户授权第三方应用访问他们的资源,而无需共享密码。
示例代码:
由于OAuth 2.0实现较为复杂,通常会使用现成的服务如Auth0、Firebase Auth等。但如果你想要自定义实现,可以考虑使用Passport.js库,它支持多种认证策略。
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy(
function(username, password, done) {
// 这里应该有你的用户验证逻辑
if (username === 'user' && password === 'password') {
return done(null, { id: 1, username: 'user' });
}
return done(null, false);
}
));
app.post('/login',
passport.authenticate('local', { session: false }),
(req, res) => {
res.json({ token: 'your-token-here' });
}
);
app.get('/data', passport.authenticate('bearer', { session: false }), (req, res) => {
res.json({ message: 'Hello World' });
});
这里使用了LocalStrategy
作为示例,实际应用中应根据具体需求选择合适的策略。
结论
以上两种方法都可以有效地防止数据被抓取或API被滥用。API密钥适合简单的场景,而OAuth 2.0则适用于需要更高级别的安全性和权限管理的应用。
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;对老浏览器没有好办法。
不懂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 要安全一些 但也仅是增加抓取成本
浏览器+按键精灵,所有的方案都是渣渣。。。。唯一的方案就是监控访问频率,只不过也一样可以绕过
为了防止第三方抓取数据和盗用API,在Node.js中可以采取以下几种方法:
-
使用API密钥:为每个客户端分配唯一的API密钥,并在每次请求时验证该密钥。这可以通过中间件实现。
-
IP限制:限制特定IP地址对API的访问。
-
速率限制:限制客户端每秒或每天可以调用API的次数。
-
OAuth认证:使用OAuth协议进行更安全的身份验证和授权。
-
HTTPS:确保所有的通信都通过HTTPS加密,以防止数据在传输过程中被截获。
示例代码
使用API密钥验证
首先,安装express
和body-parser
库:
npm install express body-parser
创建一个简单的Node.js服务器,并添加API密钥验证中间件:
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
// 假设我们有一个有效的API密钥列表
const validKeys = ['key1', 'key2'];
// 中间件验证API密钥
function checkApiKey(req, res, next) {
const apiKey = req.headers['x-api-key'];
if (validKeys.includes(apiKey)) {
next(); // 继续处理请求
} else {
res.status(401).json({ message: 'Invalid API key' });
}
}
// 示例路由
app.get('/data', checkApiKey, (req, res) => {
res.json({ message: '这是你的数据', data: [1, 2, 3] });
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
在这个例子中,我们定义了一个中间件checkApiKey
来检查请求头中的x-api-key
字段是否有效。如果无效,则返回401状态码并附带错误信息。
其他建议
- 使用环境变量存储敏感信息(如API密钥)。
- 定期轮换API密钥。
- 对API请求日志进行监控,以便检测异常行为。
这些措施可以帮助保护你的API不受未授权访问的影响。