Nodejs中纯粹用JSON进行前后端交互的模式,如何防止被抓取数据,盗用API?

Nodejs中纯粹用JSON进行前后端交互的模式,如何防止被抓取数据,盗用API?

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

21 回复

在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则适用于需要更高级别的安全性和权限管理的应用。


通过 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中可以采取以下几种方法:

  1. 使用API密钥:为每个客户端分配唯一的API密钥,并在每次请求时验证该密钥。这可以通过中间件实现。

  2. IP限制:限制特定IP地址对API的访问。

  3. 速率限制:限制客户端每秒或每天可以调用API的次数。

  4. OAuth认证:使用OAuth协议进行更安全的身份验证和授权。

  5. HTTPS:确保所有的通信都通过HTTPS加密,以防止数据在传输过程中被截获。

示例代码

使用API密钥验证

首先,安装expressbody-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不受未授权访问的影响。

回到顶部