客户端的JavaScript代码replace

我现在正在学习一些新技术(比如node.js,socket.io,redis等),并且做一些简单的testing应用程序来看看它是如何工作的。

我的问题是关于客户端JavaScript代码的安全性:例如,我有一个聊天服务器上node.js + express,当用户连接到这个聊天,服务器应该分配他的注册用户名(通过老生常用php + mysql授权被使用)到他的sockets。 问题是,用户可以修改他的客户端脚本,并连接到不同的用户名下的聊天?

下面给出一些代码:

(分配用户名的服务器端部分,只是从客户端调用获取用户名)

// when the client emits 'adduser', this listens and executes socket.on('adduser', function(username){ // store the username in the socket session for this client socket.username = username; // store the room name in the socket session for this client socket.room = 'General'; // add the client's username to the global list usernames[username] = username; // send client to room 1 socket.join('General'); // echo to client they've connected socket.emit('updatechat', 'SERVER', 'you have connected to General'); // echo to room 1 that a person has connected to their room socket.broadcast.to('General').emit('updatechat', 'SERVER', username + ' has connected to this room'); socket.emit('updaterooms', rooms, 'General'); }); 

(将用户名发送到服务器的客户端部分,对于特定用户,它看起来像'var username =“User”;')

 Yii::$app->view->registerJs('var username = "'.$user->identity->username.'";', yii\web\View::POS_HEAD); 

(连接function)

 chat.on('connect', function(){ // call the server-side function 'adduser' and send one parameter (value of prompt) chat.emit('adduser', username); }); 

所以问题是:用户可以改变(例如,通过铬开发工具)他的用户名在行'var username …',并连接到不同的名字聊天?

PS这个特殊的情况只是一个例子,显然,聊天中改昵称不过是一个简单的笑话,但类似的情况可以出现在其他项目中…

假设你的variables在闭包中受到保护,并且通过在控制台中键入username='root'来改变它们并不是微不足道的,用户可以简单地replace整个代码。

客户端发生的一切都完全不受你的控制。

好消息是他们是不涉及重复authentication的解决scheme。 假设您已经在快速应用程序中对用户进行了身份validation,则可以从中获取会话和用户。

看我如何在我的聊天服务器中做到这一点:

 var sessionSockets = new SessionSockets(io, sessionStore, cookieParser); sessionSockets.on('connection', function (err, socket, session) { function die(err){ console.log('ERR', err); socket.emit('error', err.toString()); socket.disconnect(); } if (! (session && session.passport && session.passport.user && session.room)) return die ('invalid session'); var userId = session.passport.user; if (!userId) return die('no authenticated user in session'); ... handling socket for authenticated user }); 

基本上,它使用session.socket.io模块将会话从标准http请求(使用passport进行身份validation)传播到socket.io连接。 而且不应该由用户提供的所有内容都来自session / db / server。