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

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

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 までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!