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

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

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

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

<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を使って簡単にチャットを作る方法で作ったサンプルをgithubから持ってきます。

$ git clone https://github.com/cotapon/chat-socket_io-sample
$ cd chat-socket_io-sample
$ npm install validator
npm WARN package.json application-name@0.0.1 No README.md file found!
npm http GET https://registry.npmjs.org/validator
npm http 304 https://registry.npmjs.org/validator
validator@0.4.11 node_modules/validator

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

app.jsを編集する。


/**
 * 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でサニタイズをする方法ということで紹介させて頂きました。予めご了承下さい。

【Node.js】バリデートとサニタイズを実行できる node-validator
Pocket

Tagged on:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です