① nodejs 怎麼防止mysql注入
使用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'
使用connection.query()的查詢參數佔位符
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'
使用escapeId()編碼祥慧SQL查詢標識櫻數符
var sorter = 'date';
var sql = 'SELECT * FROM posts ORDER BY ' + connection.escapeId(sorter);
connection.query(sql, function(err, results) {
// ...
});
使用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
② nodejs用mysql連接資料庫怎麼連接多個數據表
Nodejs要連接MySQL,可以使用Nodejs的MysQL驅動來實現。比如,我們這里使用「node-mysql」連接資料庫。我們使用下面的方式來連接資料庫:
首先,我們需要使用nodejs的包管理工具(npm)安裝mysql的驅動。命令行如下:
[plain] view plain
npm install musql
現在,要在js文件中使用mysql,添加下面的代碼到你的文件中:
[plain] view plain
③ nodejs如何復制mysql資料庫
NodeJS對mysql資料庫的簡單操作
1.
打開軟體新建一個空的文察仿件夾
2.
然後引入mysql依賴 npm install mysql 1 完陸殲成後對應文件夾下會生成一個node_moles的文件夾,我早沒沖們不需要去管它
3.
編寫mysql.js文件 // 導入mysql依賴constmysql=require("mysql")// 獲取
④ nodejs mysql 怎麼執行sql文件
r conn = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database:'nodejs',
port: 3306
});
conn.connect();
//查詢
// conn.query('SELECT * from user where name="wangwei"', function(err, result) {
// if (err) throw err;
// console.log(result);
// })
//新增
// conn.query('insert into user (username,password) values("huxiaona","123456")', function(err, result) {
// if (err) throw err;
// console.log(result);
// })
⑤ nodejs怎麼後台操作mysql
連接流程代碼如下:
var mysql = require('mysql'); //調用MySQL模塊//創建一個connectionvar connection = mysql.createConnection({
host : '127.0.0.1', //主機
user : 'root', //MySQL認證用戶名
password:'12345',
port: '3306',
database: 'node'});//創建一個connectionconnection.connect(function(err){
if(err){
console.log('[query] - :'+err); return;
}
console.log('[connection connect] succeed!');
});
//執行SQL語句connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
if (err) {
console.log('[query] - :'+err); return;
}
console.log('The solution is: ', rows[0].solution);
});
//關閉connectionconnection.end(function(err){
if(err){
return;
}
console.log('[connection end] succeed!');
});
關於Connection Optionos
要想創建一個資料庫連接,先就要認識清楚Options
host:主機地址 (默認:localhost)
user:用戶名
password:密碼
port:埠號 (默認:3306)
database:資料庫名
charset:連接字元集(默認:』UTF8_GENERAL_CI』,注意字元集的字母都要大寫)
localAddress:此IP用於TCP連接(可選)
socketPath:連接到unix域路徑,當使用 host 和 port 時會被忽略
timezone:時區(默認:』local』)
connectTimeout:連接超時(默認:不限制;單位:毫秒)
stringifyObjects:是否序列化對象(默認:』false』 ;與安全相關https://github.com/felixge/node-mysql/issues/501)
typeCast:是否將列值轉化為本地JavaScript類型值 (默認:true)
queryFormat:自定義query語句格式化方法https://github.com/felixge/node-mysql#custom-format
supportBigNumbers:資料庫支持bigint或decimal類型列時,需要設此option為true (默認:false)
bigNumberStrings:supportBigNumbers和bigNumberStrings啟用 強制bigint或decimal列以JavaScript字元串類型返回(默認:false)
dateStrings:強制timestamp,datetime,data類型以字元串類型返回,而不是JavaScript Date類型(默認:false)
debug:開啟調試(默認:false)
multipleStatements:是否許一個query中有多個MySQL語句 (默認:false)
flags:用於修改連接標志,更多詳情:https://github.com/felixge/node-mysql#connection-flags
ssl:使用ssl參數(與crypto.createCredenitals參數格式一至)或一個包含ssl配置文件名稱的字元串,目前只捆綁Amazon RDS的配置文件
其它:
可以使用URL形式的加接字元串,不多介紹了,不太喜歡那種格式,覺得可讀性差,也易出錯,想了解的可以去主頁上看。
MYSQL CURD操作
增加
var mysql = require('mysql');var DATABASE = "seckill";var TABLE="seckill"var connection = mysql.createConnection({
host:'127.0.0.1',
user:'root',
password:'12345',
port:'3306',
database: DATABASE
});
connection.connect();var addVip = 'insert into seckill(name,number) values(?,?)';var param = ['100元秒殺家教機',100];
connection.query(addVip, param, function(error, result){
if(error)
{
console.log(error.message);
}else{
console.log('insert id: '+result.insertId);
}
});
connection.end();
刪除
var mysql = require('mysql');var DATABASE = "node";var TABLE="seckill"var connection = mysql.createConnection({
host:'127.0.0.1',
user:'root',
password:'12345',
port:'3306',
database: DATABASE
});
connection.connect();var addVip = 'delete from seckill where seckill_id = 1005';
connection.query(addVip, function(error, result){
if(error)
{
console.log(error.message);
}else{
console.log('affectedRows: '+result.affectedRows);
}
});
connection.end();
查找
var mysql = require("mysql");var DATABASE = "node";var TABLE="seckill"var connection = mysql.createConnection({
host:'127.0.0.1',
user:'root',
password:'12345',
port:'3306',
});
connection.connect();
connection.query('use '+DATABASE);
connection.query('select * from '+TABLE, function(error, results, fields){
if (error) { throw error;
} if (results) { for(var i = 0; i < results.length; i++)
{
console.log('%s %s',results[i].name,results[i].end_time);
}
}
});
connection.end();
修改
var mysql = require('mysql');var DATABASE = "seckill";var connection = mysql.createConnection({
host:'127.0.0.1',
user:'root',
password:'12345',
port:'3306',
database: DATABASE
});
connection.connect();var userSql = "update seckill set number = number-1 where seckill_id = ?";var param = [1000, 2];
connection.query(userSql, param, function (error, result) {
if(error)
{
console.log(error.message);
}else{
console.log('affectedRows: '+result.affectedRows);
}
});
connection.end();
結束連接其實有兩種方法end(),destory();
end()
end()方法在queries都結束後執行,end()方法接收一個回調函數,queries執行出錯,仍然後結束連接,錯誤會返回給回調函數err參數,可以在回調函數中處理!destory()
比較暴力,沒有回調函數,即刻執行,不管queries是否完成!- DROP PROCEDURE IF EXISTS `P_SeckillInfo`;DELIMITER ;;CREATE DEFINER=`root`@`localhost` PROCEDURE `P_SeckillInfo`(IN ExtName VARCHAR(120),IN ExtNumber INT(11),OUT ExtReturnVal INT)
- TOP: BEGIN
- DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN
- ROLLBACK;
- SET ExtReturnVal = 0; -- Failed
- END;
- START TRANSACTION;
- INSERT INTO seckill(name, number) VALUES(ExtName,ExtNumber);
- SET ExtReturnVal = 1;
- SELECT ExtReturnVal;
- COMMIT;END;;
- DELIMITER ;262728293031323334
- var mysql = require("mysql");var pool = mysql.createPool({
- host: '127.0.0.1',
- user: 'root',
- password:'12345',
- port:'3306',
- database:'node'});//監聽connection事件pool.on('connection', function(connection) {
- connection.query('select * from seckill', function(error, results, fields){
- if (error) { throw error;
- } if (results) { for(var i = 0; i < results.length; i++)
- {
- console.log('%s %s',results[i].name,results[i].end_time);
- }
- }
- });
- });//連接池可以直接使用,也可以共享一個連接或管理多個連接(引用官方示例)//直接使用pool.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
- if (err) throw err;
- console.log('The solution is: ', rows[0].solution);
- });//共享連接function myQuery(sql){
- pool.getConnection(function(err, connection) {
- connection.query(sql, function(err, result) {
- console.log(result); //釋放連接
- connection.release();
- }); //Error: Connection already released,應該每次到連接池中再次獲取
- // connection.query( 'SELECT * FROM seckill;', function(err, result) {
- // console.log(result);
- // connection.release();
- // });
- });
- }
- myQuery('SELECT * FROM seckill;');
- myQuery('SELECT * FROM seckill;');
waitForConnections
connectionLimit
連接數限制,默認:10queueLimit
最大連接請求隊列限制,設置為0表示不限制,默認:0- var mysql = require('mysql');var db_config = {
- host: '127.0.0.1',
- user: 'root',
- password:'12345',
- port:'3306',
- database:'node'};var connection;function handleDisconnect() {
- connection = mysql.createConnection(db_config);
- connection.connect(function(err) {
- if(err) {
- console.log('進行斷線重連:' + new Date());
- setTimeout(handleDisconnect, 2000); //2秒重連一次
- return;
- }
- console.log('連接成功');
- });
- connection.on('error', function(err) {
- console.log('db error', err); if(err.code === 'PROTOCOL_CONNECTION_LOST') {
- handleDisconnect();
- } else {
- throw err;
- }
- });
- }
- handleDisconnect();
使用連接池
在資料庫中執行如下代碼創建一個存儲過程
調用示例:
1.連接池的創建,使用createPool方法,options和createConntion一致;
2.其它連接池配置選項
當連接池沒有連接或超出最大限制時,設置為true且會把連接放入隊列,設置為false會返回error
斷開重連
示例代碼:
首先關閉mysql服務,然後執行程序,會一直列印斷線重連,當再次開啟mysql服務後,列印連接成功。
⑥ 菜鳥教程中的nodejs連接mysql資料庫教程存在sql注入問題嗎
是否有漏洞與代碼有關,與此無關
其中主流的連接MySQL的方式是用mysql或者mysql2包,它們只是提供了調用驅動的api。很多框架中包括egg,nest都是基於此封裝的。
但這不是SQL注入的關鍵,它只是一種連接方式。它只管連接,不管其他的,存不存在SQL注入完全靠寫代碼的人本身啊。
一句腳本本沒有問題(知道不讓直接放sql的,也是放注入),但是你如果讓SQL變成由用戶輸入拼接而成,那就存在SQL注入的風險。
你應該去了解SQL注入的原理,然後進行防患,網路就能找到,然後可以用ORM,一般都對輸入做了處理,還能避免直接寫SQL(但其實難的地方還得自己寫)。
有不理解可以追問。
⑦ pg資料庫like防止sql注入
使用nodejs實現。不使用字元串拼接sql,直接編寫位置的sql帶參數語句,例如:select,gid,as,objectid,name,height,houseid,ST,AsGeoJson(geom),as,geome,含有like的語句,用其他關鍵字星號代替,還有其他的關鍵字,執行sql語句時,參數的值,即value採用數組的方式,批量賦值,執行的過程中,如果出現參數數量不匹配,請檢查sql裡面的變數。採用以上方式,在nodejs裡面,在字元串變數中,加入oranddrop等sql關鍵字,均作為變數賦值,而不是和整個sql。
⑧ nodejs簡單訪問及操作mysql資料庫的方法示例
本文實例講述了nodejs簡單訪問及操作mysql資料庫的方法。分享給大家供大家參考,具體如下:
var
mysql
=
require('mysql');
//調用MySQL模塊
mysql模塊要安裝
$
npm
install
mysql
//創建一個connection
var
connection
=
mysql.createConnection({
host
:
'127.0.0.1',
//主機
user
:
'root',
//MySQL認證用戶名
password
:
'',
//MySQL認證用戶密碼
port:
'3306',
//埠號
database:''
//資料庫名
});
//創建一個connection
connection.connect(function(err){
if(err){
console.log('[query]
-
:'+err);
return;
}
console.log('[connection
connect]
succeed!');
});
//執行SQL語句
connection.query('SELECT
1
+
1
AS
solution',
function(err,
rows,
fields)
{
if
(err)
{
console.log('[query]
-
:'+err);
return;
}
console.log('The
solution
is:
',
rows[0].solution);
});
//關閉connection
connection.end(function(err){
if(err){
return;
}
console.log('[connection
end]
succeed!');
});
註:nodejs在操作資料庫的時候不用設置資料庫的編碼格式
set
names
utf8
希望本文所述對大家nodejs程序設計有所幫助。
您可能感興趣的文章:nodejs連接mysql資料庫簡單封裝示例-mysql模塊nodejs進階(6)—連接MySQL資料庫示例nodejs實現的連接MySQL資料庫功能示例Nodejs連接mysql並實現增、刪、改、查操作的方法詳解nodeJs實現基於連接池連接mysql的方法示例nodejs中操作mysql資料庫示例NodeJS鏈接MySql資料庫的操作方法Nodejs使用mysql模塊之獲得更新和刪除影響的行數的方法NodeJs使用Mysql模塊實現事務處理實例nodejs連接mysql資料庫及基本知識點詳解
⑨ 【node】nodejs promise-mysql 處理事務
項目用到了node來做後台服務端,自然避免不了要用redis、sql等等。在mysql中挑了promise-mysql來做,其中的pool連接池用著挺方便的。
但最近的業務需要用上事務,官方文檔貌似沒有特別的說明。
源碼的pool有個getConnection的方法,同時return new PoolConnection
再看看這個PoolConnection,調用了Connection.call(this, null, _connection),說明具有connection的所有功能
便可追進Connection裡面看,有beginTransaction,query,commit,rollback,足夠我們使用,另外PoolConnection裡面還有release方法,保證了pool連接池的不用destroy掉這個connection。
不說廢話,直接貼碼