Nodejs网站上关键数据如何防止被采集?

Nodejs网站上关键数据如何防止被采集?

假设我的网站上有用户的电话号码或者私人相册地址 如何防止这些数据被采集?

目前我能想到的是: 通过ajax请求这些数据而不是放在html内容里面. 但是这样做有个问题就是通信时数据是明文的, 如何加密这些数据呢?

或者有其他的办法防止扫描? 请有经验的人教教

17 回复

在Node.js网站中,防止关键数据(如用户电话号码或私人相册地址)被采集是一个重要的安全措施。以下是一些有效的方法来实现这一点:

1. 使用HTTPS加密通信

首先,确保所有通信都通过HTTPS进行,以保护数据在传输过程中的安全。这可以通过使用SSL/TLS证书来实现。

示例代码:

const https = require('https');
const fs = require('fs');

const options = {
  key: fs.readFileSync('/path/to/server.key'),
  cert: fs.readFileSync('/path/to/server.crt')
};

https.createServer(options, (req, res) => {
  // 处理请求逻辑
}).listen(443);

2. 服务器端渲染与客户端请求分离

不要直接将敏感数据嵌入到HTML页面中,而是通过AJAX请求从服务器获取这些数据。服务器端处理这些请求,并根据用户身份验证结果决定是否返回敏感数据。

示例代码:

const express = require('express');
const app = express();
const jwt = require('jsonwebtoken');

app.use(express.json());

// 检查JWT令牌
function authenticateToken(req, res, next) {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1];
  if (token == null) return res.sendStatus(401);

  jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, (err, user) => {
    if (err) return res.sendStatus(403);
    req.user = user;
    next();
  });
}

app.get('/api/data', authenticateToken, (req, res) => {
  // 假设我们有一个用户模型
  const userId = req.user.id;
  // 查询数据库获取数据
  const data = getUserData(userId);
  res.json(data);
});

app.listen(3000);

3. 数据脱敏和访问控制

对敏感数据进行脱敏处理,例如只显示部分电话号码。同时,使用严格的访问控制策略来限制哪些用户可以访问特定数据。

示例代码:

function getUserData(userId) {
  // 查询数据库
  const userData = getUserFromDatabase(userId);
  
  // 脱敏处理
  const maskedPhoneNumber = maskPhoneNumber(userData.phone);
  
  return {
    ...userData,
    phone: maskedPhoneNumber
  };
}

function maskPhoneNumber(phone) {
  return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
}

总结

通过上述方法,您可以有效地防止关键数据被采集。HTTPS加密通信确保了数据的安全传输;服务器端渲染与客户端请求分离避免了敏感数据暴露在客户端;数据脱敏和访问控制进一步增强了安全性。


关键就是权限分配问题,如果对方无论是匿名或者登录后均无法访问到网站用户的电话号码或者私人相册地址,那么它就无法采集到这些数据。 如果对方能通过浏览器访问到这些数据,那么他就可以通过程序采集到这些数据。

说个简单的例子,如果某人拥有你家的所有钥匙,那么无论你家安了多少把锁,人家也照样能能出入自如。

如果是百姓网那种谁都能看的页面呢

58是把电话号码做成图片的,增长别人的采集难度,不过还是可以处理。

如果是点击之后有功能的链接呢? 比如邮箱地址, 或者下载链接

刚发现一个网站用这种方法来增加采集难度:把网页中显示的字符串数据,ASCII字符部分全部替换成图片(通过CSS来显示背景图片,都是一张图片,不同的字符背景偏移量不一样,而且这个图片也是随机的),这样即使采集过来了,某部分数据也是不完整的,大大增加采集难度。

参考:http://www.bankrate.com.cn/creditcard/1310

这个很有意思, 谢谢

ajax通讯加密, 大家有办法吗?

防采集一直都是很让人蛋疼的问题。各种办法基本上都是防君子不防小人的。

我见过一个网站,很极端的防别人采集他的页面。

就是把页面HTML代码全部URLEncode加码。

然后再在前段用js的decode解码。

做一个例子

比如页面HTML代码是 <html><body>…呵呵呵…</body></html> 先在后台进行URLEncode成为一个字符串

String enHTML = “%20%sdf%s12%12…%asdf%qwe”

然后输出在模板上

document.write(decodeURI("${enHTML}"));

(ps : 我用的是JAVA的模板写法,{enHTML}就是再模板中调用 enHTML字符串)

这样在页面源代码中看到的就是

%20%sdf%s12%12…%asdf%qwe

因为用了js的decodeURI解码,所以页面显示确实正常的。。

这种方式极不利于SEO。。

不过防采集确实效果不错。

粗糙的伪代码,只表达一下思路。。。

希望你能理解我的意思 : )

其实这个思路我想过, 但是还是有办法采集的, 采集器用同样的方法解密一遍就好了, 破解难度不是很大

谁都能看的页面,那就是谁都能解密的页面。

用人机识别:你要看一个人的资料,先输一遍验证码。

只能增加成本,提高url规则的难度

这个影响用户体验, 而且现在验证码都已经不太好用了

具体如何做呢

url 地址随机 别搞那种 有规律的 如 uid=1。。。。。uid=100 再有最好别出现列表页面

为了防止关键数据(如用户电话号码或私人相册地址)在Node.js网站上被采集,可以采取以下几种方法:

  1. 使用HTTPS: 确保所有通信都通过HTTPS进行,这样可以保证数据在传输过程中的加密。你可以使用免费的Let’s Encrypt证书来配置HTTPS。

  2. API认证和授权: 使用API密钥、JWT(JSON Web Tokens)或其他认证机制来保护你的API接口。这可以确保只有经过身份验证的用户才能访问敏感数据。

  3. 限制API请求频率: 设置限流规则,防止恶意用户通过频繁请求获取大量数据。

  4. 后端处理逻辑: 不要在前端直接暴露敏感数据。通过后端处理并按需返回部分数据,例如仅返回摘要信息。

  5. IP黑名单和白名单: 维护一个IP黑名单来阻止已知的恶意IP,同时也可以维护一个白名单只允许特定IP访问。

  6. CAPTCHA验证: 在某些高风险操作前添加验证码,以防止自动化脚本的攻击。

示例代码

API认证(使用JWT)

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();

// 密钥,必须保密
const secretKey = 'your_secret_key';

app.use(express.json());

// 模拟数据库存储用户信息
const users = {
    user1: { username: 'user1', password: 'password1' }
};

// 登录路由,返回JWT
app.post('/login', (req, res) => {
    const { username, password } = req.body;
    if (users[username] && users[username].password === password) {
        const token = jwt.sign({ username }, secretKey);
        return res.json({ token });
    } else {
        res.status(401).json({ message: 'Invalid credentials' });
    }
});

// 保护的路由,需要认证
app.get('/protected-data', authenticateToken, (req, res) => {
    // 返回受保护的数据
    res.json({ data: 'This is protected data' });
});

function authenticateToken(req, res, next) {
    const authHeader = req.headers['authorization'];
    const token = authHeader && authHeader.split(' ')[1];
    if (!token) return res.sendStatus(401);

    jwt.verify(token, secretKey, (err, user) => {
        if (err) return res.sendStatus(403);
        req.user = user;
        next();
    });
}

app.listen(3000, () => console.log('Server running on port 3000'));

这段代码展示了如何使用JWT进行API认证,并确保只有认证过的用户才能访问受保护的数据。

回到顶部