node.jsで使える便利なモジュールはたくさんあります。node-validatorもその1つで、入力した値の検証(バリデート)と、無害化(サニタイズ)してくれるモジュールです。前回と前々回でチャットに関しての記事を書きましたので、今回は簡単にnode-validatorの紹介と、チャットのサンプルにnode-validatorを適応させたいと思います。

https://github.com/chriso/node-validator

チャットでサニタイズしなかったらどうなるか。

前回と前々回の記事では、サニタイズをしていないので、例えばタグを入力してボタンを押して見ると、

html
1
2
3
<h1>こんにちは!</h1>
<img src="http://0.gravatar.com/avatar/50dcad2670fb76d401e699e09101d87e?s=500" width="150">
<script>alert('ぼえー')</script>

このようにタグがそのまま出たり、悪意あるJavaScriptを実行してしまって、cookieを書き換えられたり、同じページを開いている人にも悪い影響が出てしまう可能性があるので良くないです。これを防ぐ為に、サニタイズをします。

node-validatorのインストール方法

毎度おなじみnpmを使います。

$ npm install validator

チャットにサニタイズを適応させる。

Mongooseを使わないバージョンで試してみたいと思います。前々回の【node.js】socket.ioを使って簡単にチャットを作る方法から持ってきます。

$ git clone https://github.com/cotapon/chat-socket_io-sample
$ cd chat-socket_io-sample 
$ npm install validator 

node_modulesの中にvalidatorが入っているのを確認して、app.jsを編集します。

app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/**
 * Module dependencies.
 */
 
var express = require('express')
  , routes = require('./routes')
  //↓validatorのサニタイズをrequireします。
  , sanitize = require('validator').sanitize;
 
var app = module.exports = express.createServer();
 
// Configuration
 
app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});
 
app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
 
app.configure('production', function(){
  app.use(express.errorHandler());
});
 
// Routes
 
app.get('/', routes.index);
 
app.listen(3000, function(){
  console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);
});
 
 
//socket
 
var io = require('socket.io').listen(app);
io.sockets.on('connection', function (socket) {
  socket.on('msg send', function (msg) {
    //entityEncode関数でサニタイズします。
    msg = sanitize(msg).entityEncode();
    socket.emit('msg push', msg);
    socket.broadcast.emit('msg push', msg);
  });
  socket.on('disconnect', function() {
    console.log('disconnected');
  });
});

書き足したのはこの2行だけです、さてどうなってるでしょうか。

ただの文字列になりました。

まとめ

この方法では完全にセキュリティーが万全とは言えないので、node.jsを使ってサービスを公開する際には専門の方に相談しましょう。今回はあくまでnode.jsでサニタイズをする方法ということで紹介させて頂きました。予めご了承下さい。