2017-01-19 1 views
2

SQLインジェクションを防止してNode.JSでMS SQLサーバデータベースの行を選択するにはどうすればよいですか?私はエクスプレスフレームワークとパッケージmssqlを使用します。ここでNode.JSでSQLインジェクションを防止するにはどうすればよいですか?

は、私はES 6

const express = require('express'), 
     app = express(), 
     sql = require('mssql'), 
     config = require('./config'); 

let connect = (f, next) => { 
    sql.connect(config.database.connectionstring).then(f).catch((err) => { 
     next(err); 
    }); 
}; 

app.get('/locations/get/:id', (req, res, next) => { 
    let f =() => { 
     new sql.Request().query(`select * from mytable where id = ${req.params.id}`) 
         .then((recordset) => { 
      console.dir(recordset); 
     }).catch((err) => { 
      next(err); 
     }); 
    }; 

    connect(f, next); 
}); 

Cartoon about SQL injection

+1

むしろコードで 'SELECT'ステートメントを持つよりも、ストアドプロシージャを呼び出します。 –

+1

パラメータを使ってみましたか? https://www.npmjs.com/package/mssql –

+1

ストアドプロシージャを使用する必要はありません。 SQLインジェクションを阻止するのはsprocではなく、パラメータの使用です。 *文字列の書式設定や補間を使用してクエリを作成したり、パラメータ化されたクエリを使用したり、パラメータを個別に渡したりしないでください。つまり、mytableから 'select * from id = $ {req.params.id}'を選択することはできません。それは 'select * from mytable where id = @ id'で、パラメータとして' @ id'を渡すべきです。 –

答えて

3

PreparedStatementを使用して書かれたSQLインジェクションの可能性を今使用し、私のコードの一部です。ここでは、ドキュメントhttps://www.npmjs.com/package/mssql#prepared-statementからそれを行う方法です。

var ps = new sql.PreparedStatement(/* [connection] */); 
ps.input('id', sql.Int); 
ps.prepare('select * from mytable where id = @id', function(err) { 
    ps.execute({id: req.params.id}, function(err, recordset) { 
    ps.unprepare(function(err) { 
     // ... error checks 
    }); 

    // Handle the recordset 
    }); 
}); 

各プリペアドステートメントには1がプールから接続を予約し意味することを覚えておいてください。準備された声明を準備しないことを忘れないでください!

トランザクション内にプリペアドステートメントを作成することもできます(新しいsql.PreparedStatement(transaction))。ただし、準備ができていないときは、トランザクション内で他のリクエストを実行することはできません。

ドキュメントがES5で書かれたが、私は、あなたがそれをPromisifyことができることを確認している:)

+0

これについては準備ができていません。 SQLインジェクションは、パラメータの使用によって防止されます。 –

関連する問題