Javascript 如何防止恶意使用套接字?
我正在制作一个基于玩家的网页,玩家可以邀请其他玩家参加聚会,以及其他一些事情 我有你的基本发送/接收/更新的聊天室/用户在你的党。唯一的问题是,什么能阻止某人坐在那里打开开发人员控制台并继续Javascript 如何防止恶意使用套接字?,javascript,node.js,websocket,socket.io,Javascript,Node.js,Websocket,Socket.io,我正在制作一个基于玩家的网页,玩家可以邀请其他玩家参加聚会,以及其他一些事情 我有你的基本发送/接收/更新的聊天室/用户在你的党。唯一的问题是,什么能阻止某人坐在那里打开开发人员控制台并继续 socket.emit('updateUsers', 'Weiner'); socket.emit('updateUsers', 'Idiot'); socket.emit('updateUsers', 'Bad word'); socket.emit('updateUsers', 'Other stupi
socket.emit('updateUsers', 'Weiner');
socket.emit('updateUsers', 'Idiot');
socket.emit('updateUsers', 'Bad word');
socket.emit('updateUsers', 'Other stupid malicious really long spam the chat name');
我如何防止他们这样做呢
(完整的JS堆栈,Node.JS)
谢谢 使用行为类似于cookie的md5/sha密钥 为特定用户生成密钥并将其发送到客户端,并始终检查传入的请求是否具有相同的密钥
它不会是完全安全的,因为黑客总是可以在源代码或本地存储中找到您的密钥,但试图通过混淆您的代码来隐藏它我也遇到了这个问题,这是我的解决方案,因为垃圾邮件(恶意套接字使用) 基本上绑定到所有emit,并检查emit名称是否包含在
spamCheckFunctions
中,如果是,则会添加一个垃圾邮件点,如果用户超过垃圾邮件分数金额(maxparm
);他将被断开连接。在antiSpam
中定义的每一毫秒将减去在antiSpamRemove
我肯定有更干净的解决方案,但这一个对我来说非常好:)
只需确保验证/验证用户即可
这就是我对它们进行身份验证的方式(不是将nodejs用作web服务器,而是使用django):
现在您可以访问socket.handshake.cookie['sessionid']
(在我的例子中,这与django一起工作)
然后将
socket.handshake.cookie['sessionid']
与会话存储在Web服务器上的条目相匹配,这通常是一个难题。你可以做两件事:
1) 在客户端使用自调用函数,即
(function(w) {
// define your sockets here
var socket = ...;
})(window);
显然,它是在客户端,所以这不是真正安全的。但有这样的墙也不错
2) 在服务器端,跟踪发布的频率。例如,如果某人在一秒钟内发布了5次帖子,那么您可以假设这是一个垃圾邮件,您可以阻止该套接字。如果与身份验证和复杂的注册相结合,它尤其有效(因此人们在创建新帐户时会遇到问题)。防止垃圾邮件的一种方法是实施用户身份验证和/或数据包速率限制器。添加一个中间件函数,跟踪socketId和通过该套接字发送的数据包数量。当超过限制时,断开插座 您甚至可以添加一个额外的功能来跟踪该套接字的IP地址,如果某个IP地址由于垃圾邮件而经常断开连接,您可以禁止该IP。添加对允许的IP地址的连接事件的检查。使用包限制每秒的事件数。通过IP进行限制是最简单的,但如果可能,最好通过用户ID进行限制
const app = require('http').createServer();
const io = require('socket.io')(app);
const { RateLimiterMemory } = require('rate-limiter-flexible');
app.listen(3000);
const rateLimiter = new RateLimiterMemory(
{
points: 5, // 5 points
duration: 1, // per second
});
io.on('connection', (socket) => {
socket.on('bcast', async (data) => {
try {
await rateLimiter.consume(socket.handshake.address); // consume 1 point per event from IP
socket.emit('news', { 'data': data });
socket.broadcast.emit('news', { 'data': data });
} catch(rejRes) {
// no available points to consume
// emit error or warning message
socket.emit('blocked', { 'retry-ms': rejRes.msBeforeNext });
}
});
});
阅读中的更多信息,您需要注册和验证用户。它不需要是fort knox,只要一个通过点击协议屏幕的cookie或ip就足够了。@dandavis哦,我不知道cookies通过了套接字,但是,如果他们登录并且cookie存在,他们仍然能够通过套接字发送垃圾邮件。不?cookies不在套接字中,但是,假设有人首先访问您的http页面,您可以通过连接升级或通过更高级别的分组(如socket.io的内置集合)来跟踪它们。我也面临着这个问题。。。感觉无助…如果人们想查看,我用这段代码制作了一个NPM包:
(function(w) {
// define your sockets here
var socket = ...;
})(window);
const app = require('http').createServer();
const io = require('socket.io')(app);
const { RateLimiterMemory } = require('rate-limiter-flexible');
app.listen(3000);
const rateLimiter = new RateLimiterMemory(
{
points: 5, // 5 points
duration: 1, // per second
});
io.on('connection', (socket) => {
socket.on('bcast', async (data) => {
try {
await rateLimiter.consume(socket.handshake.address); // consume 1 point per event from IP
socket.emit('news', { 'data': data });
socket.broadcast.emit('news', { 'data': data });
} catch(rejRes) {
// no available points to consume
// emit error or warning message
socket.emit('blocked', { 'retry-ms': rejRes.msBeforeNext });
}
});
});