1. ホーム
  2. javascript

[解決済み] Node.jsのSQLインジェクション対策

2022-12-20 03:41:51

質問

Node.jsでSQLインジェクションを防ぐことは可能でしょうか(できればモジュールで)PHPがプリペアドステートメントで防いでいたのと同じように。

もし可能なら、どのように?もしそうでなければ はどのような例ですか? は、私が提供したコード(下記参照)を回避する可能性があります。


いくつかのコンテキスト。

私は、Node.js + MySqlで構成されるバックエンドスタックを持つWebアプリケーションを作っています。 node-mysql モジュールを使用しています。ユーザビリティの観点からは、このモジュールは素晴らしいのですが、PHPの 準備されたステートメント (にあることは承知していますが)。 トドメ ).

私の理解では、PHPのプリペアドステートメントの実装は、とりわけ が大いに役立ちました。 が SQL インジェクションの防止に大いに役立っています。しかし、私の node.js アプリが同様の攻撃を受ける可能性があることが心配です。 デフォルトで提供されている文字列エスケープを使用しても が提供する文字列エスケープを使用しても、同様の攻撃を受ける可能性があります (以下のコード スニペットのように)。

node-mysql は node.js 用の最も一般的な mysql コネクターのようなので、他の人がこの問題を考慮するために (何かあれば) 何をしているか、あるいはそもそも node.js の問題であるか (ユーザー/クライアント側の入力が関係するので、これがどうでないかはわからない) と思っていました。

に切り替えるべきでしょうか。 ノード・マイスクル・ネイティブ は準備されたステートメントを提供するので、当分の間、切り替えるべきでしょうか? node-mysqlほどアクティブではないようなので、躊躇しています(単に完成度が高いということかもしれませんが)。

ここにユーザー登録コードのスニペットがあり、これは サニタイザー モジュールと、node-mysql の prepared statement-like syntax (これは上で述べたように、文字エスケープを行います) を使って、クロスサイトスクリプティングと sql インジェクションをそれぞれ防いでいます。

// Prevent xss
var clean_user = sanitizer.sanitize(username);

// assume password is hashed already
var post = {Username: clean_user, Password: hash};

// This just uses connection.escape() underneath
var query = connection.query('INSERT INTO users SET ?', post,
   function(err, results)
   {
       // Can a Sql injection happen here?
   });

どのように解決するのですか?

この node-mysql ライブラリは、あなたが既に行なっているように使用すると、自動的にエスケープを行ないます。参照 https://github.com/felixge/node-mysql#escaping-query-values