Socket.io - 防止服务器在发出错误数据时崩溃"client"



目前我正在使用node.js和 socket.io 处理一个项目。

如果想知道是否有任何方法可以自动验证客户端发送到服务器的数据。我不想通过对要在正在进行的函数中使用的每个变量使用 if (!...) return; 来验证数据。

例如,我在服务器上有以下代码.js

socket.on('haveData', function(data) {
    db.query('SELECT * FROM user WHERE userid = ? LIMIT 1', [data.userid], function(errData, results, fields) {
        if (!errData && results.length) {
            ...
        }
    });
});

但是现在,如果我在浏览器的控制台中键入socket.emit('haveData');,socket.io 服务器就会崩溃 - 当然,没有发出任何数据

TypeError: Cannot read property 'userid' of undefined
您可以使用

Joi https://github.com/hapijs/joi。

Joi 允许您定义输入数据的模式并使用 Joi.validate 方法对其进行验证(示例:https://github.com/hapijs/joi#example(。

Socket.on('event',function(data,callback({}( 接受回调函数,它可以用来将错误消息传递回客户端。

示例代码:

const Joi = require('joi');
socket.on('data',function(data,callback){
    const schema = Joi.object().keys({
        userid : Joi.string().trim().required()
    })
    Joi.validate(data, schema, function (err, value) {
        if(err){
            //Error will be sent back to the client who emitted the event
            callback(err)
        }else{
            //Do  your stuff 
        }
    })
})

服务器端代码必须验证从客户端发送的所有数据。 您根本无法完全信任客户端,因为客户端可能会被修改/黑客入侵,甚至流氓客户端也可以连接到您的服务器。

在这种特殊情况下,解决该特定问题所需要做的就是if (data && data.userid)检查您发送的内容:

socket.on('haveData', function(data) {
    if (data && data.userid) {
        db.query('SELECT * FROM user WHERE userid = ? LIMIT 1', [data.userid], function(errData, results, fields) {
            if (!errData && results.length) {
                ...
            }
        });
     } else {
         // send some error back or just ignore the faulty request
     }
});

如果你真的想谨慎,你甚至可以使用:

if (data && data.userid && typeof data.userid === "string")

这可确保data存在,data.userid存在并且不是空字符串,并且data.userid是字符串。

最新更新