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 エラーが発生します。
クエリ パラメーター プレースホルダーとして ? を使用できます。クエリ パラメーター プレースホルダーを使用する場合、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()
escapeId()
には、同様の機能を持つ次の 3 つのメソッドがあります:
rrreee
例:方法 4: mysql.format() を使用して、エスケープパラメータ:
クエリを準備します。この関数は、適切なエスケープメソッドを選択します。エスケープパラメータmysql.format()
は、クエリステートメントを準備するために使用されます。エスケープメソッドのパラメータ。例:
rrreee
上記がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。
関連する推奨事項: node.js の fs.stat と fs.fstat の違いについてNodeJs フォームデータ形式でファイルを転送する方法Nodejs サーバー側の文字エンコーディングとデコード・文字化け処理中以上がnode-mysql で SQL インジェクションを防ぐ方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。