sql注入簡介
sql注入是比較常見的網路攻擊方式之一,它不是利用作業系統的bug來實現攻擊,而是針對程式設計師程式設計時的疏忽,通過sql語句,實現無帳號登入,甚至篡改資料庫。
node-mysql中防止sql注入
為了防止sql注入,可以將sql中傳入引數進行編碼,而不是直接進行字串拼接。在node-mysql中,防止sql注入的常用方法有以下四種:
方法一:使用escape()對傳入引數進行編碼:
引數編碼方法有如下三個:
mysql.escape(param)
connection.escape(param)
pool.escape(param)
例如:var userid = 1, name = 'test';
var query = connection.query('select * from user where id = ' + connection.escape(userid) + ', name = ' + connection.escape(name), function(err, results) );
console.log(query.sql); // select * from users where id = 1程式設計客棧, name = 'test'
escape()方法編碼規則如下:
numbers不進行轉換;
booleans轉換為true/false;
date物件轉換為'yyyy-mm-dd hh:ii:ss'字串;
buffers轉換為hex字串,如x'0fa5';
strings進行安全轉義;
arrays轉換為列表,如[『a', 『b']會轉換為'a', 『b';
多維陣列轉換為組列表,如[[『a', 『b'], [『c', 『d']]會轉換為'a', 『b'), (『c', 『d');
objects會轉換為key=value鍵值對的形式。巢狀的物件轉換為字串;
undefined/null會轉換為null;
mysql不支援nan/infinity,並且會觸發mysql錯誤。
方法二:使用connection.query()的查詢引數佔位符:
可使用 ? 做為查詢引數佔位符。在使用查詢引數佔位符時,在其內部自動呼叫connection.escape()方法對傳入引數進行編碼。
如: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 wh id = 1, name = 'test'
上面程式還可以改寫成如下:
var post = ;
var query = connection.query('select * from users where ?', post, function(err, results) );
console.log(query.sql); // selecwww.cppcns.comt * from users where id = 1, name = 'test'
方法三: 使用escapeid()編碼sql查詢識別符號:
如果你不信任使用者傳入的sql識別符號(資料庫、表、字元名),可以使用escapeid()方法進行編碼。最常用於排序等。
escapeid()有如下三個功能相似的方法:
mysql.escapeid(identifier)
connection.escapeid(identifier)
pool.escapeid(identifier)
例如:var sorter = 'date';
var sql = 'select * from posts order by ' + connection.escapeid(sorter);
connection.query(sql, function(err, results) );
方法四: 使用mysql.format()轉義引數:
準備查詢,該函式會選擇合適的轉義方法轉義引數mysql.format()用於準備查詢語句,該函式會自動的選擇合適的方法轉義引數。
例如:var userid = 1;
var sql = "select * from ?? where ?? = ?";
var inserts = ['users', 'id', userid];
sql = mysql.format(sql, inserts); // select * from users where id = 1
總結本文標題: node-mysql中防止sql注入的方法總結
本文位址:
Node Mysql 防止 sql 注入方法
引數編碼方法有如下三個 mysql.escape param connection.escape param pool.escape param 例如 var userid 1,name test var query connection.query select from users where ...
JAVA中防止SQL注入
如果使用者執行 select from product where id 5 這條語句。其中5是有使用者輸入的。sql注入的含義就是,一些搗蛋使用者輸入的不是5,而是5 delete from orders 那麼原來的sql語句將會變為,select from product where id 5 ...
Mybatis中防止Sql注入
sql注入是一種 注入技術,將惡意的sql插入到被執行的字段中,以不正當的手段多資料庫資訊進行操作。在jdbc中使用一般使用preparedstatement就是為了防止sql注入。比如 select from user where id id 正常執行不會出現問題,一旦被sql注入,比如將傳入引數...