node-mysql で SQL インジェクションを防ぐ方法

不言
リリース: 2018-06-30 11:38:54
オリジナル
2960 人が閲覧しました

SQL インジェクションは Web サイトやサーバーにとって非常に危険な問題であることは誰もが知っていますが、この側面が適切に処理されないと、いつでも Web サイトにインジェクションが行われる可能性があります。そのため、この記事では、困っている友人ができるよう、node-mysql で SQL を防ぐ方法をまとめます。いくつかの一般的な注入方法を参照してください。 SQL インジェクションとはSQL ステートメントを使用して、アカウントでログインしたり、データベースを改ざんしたりすることもできます。

node-mysql で SQL インジェクションを防ぐ

SQL インジェクションを防ぐために、文字列を直接連結する代わりに、SQL で渡されるパラメーターをエンコードできます。 node-mysql では、SQL インジェクションを防ぐための一般的な方法が 4 つあります:

方法 1:scape() を使用して受信パラメータをエンコードする:

パラメータのエンコード方法は 3 つあります:

mysql.escape(param)
connection.escape(param)
pool.escape(param)
ログイン後にコピー

例:

escape() メソッドのエンコーディング規則は次のとおりです:

数値は変換されません;

日付オブジェクトの変換'YYYY-mm-dd HH:ii:ss' 文字列

バッファは X'0fa5' などの 16 進文字列に変換されます

文字列は次のようなリストに変換されます['a', 'b'] は 'a', 'b' に変換されます

多次元配列は [['a', 'b'], ['c' などのグループ リストに変換されます, 'd' ]] は 'a', 'b'), ('c', 'd');

オブジェクトは key=value ペアに変換されます。ネストされたオブジェクトは文字列に変換されます。

未定義/null は NULL に変換されます。

MySQL は NaN/Infinity をサポートしていないため、MySQL エラーが発生します。


方法 2: connection.query() のクエリ パラメーター プレースホルダーを使用します。


クエリ パラメーター プレースホルダーとして ? を使用できます。クエリ パラメーター プレースホルダーを使用する場合、 connection.escape() メソッドが内部で自動的に呼び出され、受信パラメーターをエンコードします。

例:


var userId = 1, name = 'test';
var query = connection.query('SELECT * FROM users WHERE id = ' + connection.escape(userId) + ', name = ' + connection.escape(name), function(err, results) {
  // ...
});
console.log(query.sql); // SELECT * FROM users WHERE id = 1, name = 'test'
ログイン後にコピー


上記のプログラムは、次のように書き直すこともできます:


var userId = 1, name = 'test';
var query = connection.query('SELECT * FROM users WHERE id = ?, name = ?', [userId, name], function(err, results) {
  // ...
});
console.log(query.sql); // SELECT * FROM users WHERE id = 1, name = 'test'
ログイン後にコピー

方法 3:scapeId() を使用して SQL クエリ識別子をエンコードします:

connection.escape() 方法对传入参数进行编码。

如:

var post = {userId: 1, name: 'test'};
var query = connection.query('SELECT * FROM users WHERE ?', post, function(err, results) {
  // ...
});
console.log(query.sql); // SELECT * FROM users WHERE id = 1, name = 'test'
ログイン後にコピー

上面程序还可以改写成如下:

mysql.escapeId(identifier)
connection.escapeId(identifier)
pool.escapeId(identifier)
ログイン後にコピー

方法三: 使用escapeId()编码SQL查询标识符:

如果你不信任用户传入的SQL标识符(数据库、表、字符名),可以使用escapeId()方法进行编码。最常用于排序等。

escapeId()有如下三个功能相似的方法:

var sorter = 'date';
var sql  = 'SELECT * FROM posts ORDER BY ' + connection.escapeId(sorter);
connection.query(sql, function(err, results) {
 // ...
});
ログイン後にコピー

例如:

var userId = 1;
var sql = "SELECT * FROM ?? WHERE ?? = ?";
var inserts = ['users', 'id', userId];
sql = mysql.format(sql, inserts); // SELECT * FROM users WHERE id = 1
ログイン後にコピー

方法四: 使用mysql.format()转义参数:

准备查询,该函数会选择合适的转义方法转义参数    mysql.format()

もしユーザーを信頼していません。 受信 SQL 識別子 (データベース、テーブル、文字名) は、escapeId() メソッドを使用してエンコードできます。仕分けなどによく使われます。

escapeId() には、同様の機能を持つ次の 3 つのメソッドがあります:

rrreee

例:

rrreee

方法 4: mysql.format() を使用して、エスケープパラメータ:

クエリを準備します。この関数は、適切なエスケープメソッドを選択します。エスケープパラメータ mysql.format() は、クエリステートメントを準備するために使用されます。エスケープメソッドのパラメータ。 例:

rrreee

上記がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。

関連する推奨事項: 🎜🎜🎜node.js の fs.stat と fs.fstat の違いについて🎜🎜🎜🎜NodeJs フォームデータ形式でファイルを転送する方法🎜🎜🎜🎜🎜Nodejs サーバー側の文字エンコーディングとデコード・文字化け処理中🎜🎜🎜🎜🎜🎜🎜🎜🎜

以上がnode-mysql で SQL インジェクションを防ぐ方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート