3

Orientjs ライブラリを使用して Orient Database で操作を実行しています。次のようなパラメータースタイルのクエリを使用できることをドキュメントで読みました。

db.query(
   'SELECT name, ba FROM Player '
   + 'WHERE ba >= :ba AND team = ":team"',
   {params: {
      ba: targetBA,
      team: targetTeam }
   }, limit: 20
).then(function(hitters){
   console.log(hitters)
});

私の質問は、SQL インジェクションを防ぐのに十分ですか? NodeJS API でそれに関する情報が見つからなかったからです。Java の場合、「Prepared Query」という概念がありますが、それらが同じものを参照しているかどうかはわかりません。

4

1 に答える 1

5

安全なようです、私はこのコードで試しています(wikiから取得したものは少しバグがあります):

var name='admin';

db.open().then(function() {
    return db.query(
        "SELECT * FROM OUser "
        + "WHERE name = :name",
        {params:{
            name: name
            }
        });
}).then(function(res){
    console.log(res);
    db.close().then(function(){
        console.log('closed');
    });
});

まず、クエリは次のように解析されますSELECT * FROM OUser WHERE name = "admin"(Studio Query Profiler で観察)。

予想どおり、管理者ユーザー レコードを取得します。

パラメータは文字列として直接評価されるため、引用符で囲む必要はありません (例: :namenot ':name')。したがって、次のようなものを注入する方法はありませ' OR '1'='1; drop something;


ここに私が行ったいくつかのテストがあります:

  • var name='; create class p;';

    レコードを返しません。

    orient によって次のように評価されます。SELECT * FROM OUser WHERE name = "; create class p;"

  • var name="' OR '1'='1";

    レコードを返しません。

    次のように評価されます。SELECT * FROM OUser WHERE name = "' OR '1'='1"

  • var name='" OR "1"="1';

    レコードを返しません。

    次のように評価されます。SELECT * FROM OUser WHERE name = "\" OR \"1\"=\"1"

  • クエリでパラメーター名を引用します。"WHERE name = ':name'"

    次のように評価されます。SELECT * FROM OUser WHERE name = ':name'


より多くの組み合わせを自由に試してみてください。私の意見では、非常に安全だと思われます.

于 2016-10-06T11:03:42.147 に答える