當前位置:首頁 » 編程語言 » nodejs防止sql注入
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

nodejs防止sql注入

發布時間: 2023-05-12 19:17:20

前端面試2021(NodeJS篇)

-處理結果包裝成響應數據,返回給客戶端鋒梁
-客戶端瀏覽器解析響應數據亂賣,渲染展示對應的頁面

使用sql語句完成下面的業務操作
1,注冊用戶時,判斷賬號是否已經存在

2.會員zhangsan登錄時,同時允許使用嘩基逗賬號或者手機號和密碼登錄系統

3.lisi更新用戶資料時,更新自己新的昵稱 --莉絲

4.用戶zhangsan查看自己的資料綁定新的手機號碼13523452345

5.用戶lisi要銷毀自己的資料,如何注銷自己的用戶信息

② idea創建nodejs連接mysql

在 IDEA 中創建 Node.js 項目連接 MySQL 資料庫,可以按照以下步驟進行操作:

打開 IDEA,選擇「Create New Project」創建一個新的 Node.js 項目。

在新建項目的目錄下打開終端,使用 npm 命令安裝 mysql 模塊,命令如下:

css
Copy code
npm install mysql --save

在項目的根目錄下漏答茄創建一個名為 index.js 的文件,編寫以下代碼:
javascript
Copy code
const mysql = require('mysql');

// 創建連接對象
const connection = mysql.createConnection({
host: 'localhost', // 資料庫伺服器地址
user: 'root', // 資料庫用戶名
password: 'password', // 資料庫密碼
database: 'test', // 資料庫名稱舉搭
port: 3306 // 資料庫埠號,默認為 3306
});

// 連接資料庫
connection.connect();

// 執行 SQL 查詢語句
connection.query('SELECT * FROM user', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results);
});

// 關閉連接
connection.end();

其中,需要將 host、user、password、database 等參數設置為實際的資料庫連接信息。

在終端中運行 index.js 文件,命令如下:
Copy code
node index.js

這樣,就可以連接到 MySQL 資料庫,並返察查詢指定的表中的數據。

以上是使用 Node.js 連接 MySQL 資料庫的簡單示例,如果需要進行更復雜的操作,可以參考 mysql 模塊的文檔,了解更多的 API 和用法。

③ 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;');

  • 1.連接池的創建,使用createPool方法,options和createConntion一致;
    2.其它連接池配置選項

  • waitForConnections

  • 當連接池沒有連接或超出最大限制時,設置為true且會把連接放入隊列,設置為false會返回error

  • connectionLimit
    連接數限制,默認:10

  • queueLimit
    最大連接請求隊列限制,設置為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();

  • 首先關閉mysql服務,然後執行程序,會一直列印斷線重連,當再次開啟mysql服務後,列印連接成功。

④ nodejs安全嗎

安全是不容忽視的,每個開發者都知道它非常重要,真正嚴肅對待它的卻沒有幾人。我們 RisingStack 希望你能認真對待這一問題——這就是我們整理這份清單來幫助你的原因,你的應用在被成千上萬用戶使用前必須要做安全檢查。

這份清單大部分內容是通用的,不僅適用於Node.js,同樣適用於其他語言和框架,只是一些明確給出了在Node.js中使用的方法。同時推薦你去閱讀我們的引導文章 Node.js security,如果你剛開始使用Node.js,推薦你看這篇文章 first chapter of Node Hero。

配置管理

HTTP 安全頭部

有些關於安全的HTTP頭部是你的網站必須要有的:

Strict-Transport-Security 強制將HTTP請求替換為HTTPS請求

X-Frame-Options 防止點擊劫持

X-XSS-Protection 開啟跨站腳本攻擊(XSS)的過濾,大多數現代瀏覽器支持這個設置

X-Content-Type-Options 禁用瀏覽器對響應內容MIME類型的嗅探,嚴格使用響應的Content-Type的值

Content-Security-Policy 能有效防止多種攻擊,包括跨站腳本和跨站注入

Node.js開發者可以使用Helmet模塊置這些頭部,代碼如下:

var express = require('express');

var helmet = require('helmet');

var app = express();

app.use(helmet());

Koa和ThinkJS框架中可以使用koa-helmet來設置這些頭部,當然有關安全的頭部不止這些,更多請看Helmet和MDN HTTP Headers。

在大多數架構里這些頭部可以設置在web伺服器的配置中(Apache、Nginx),不需要對應用代碼進行改動。在Nginx中的配置:

# nginx.conf

add_header X-Frame-Options SAMEORIGIN;

add_header X-Content-Type-Options nosniff;

add_header X-XSS-Protection "1; mode=block";

add_header Content-Security-Policy "default-src 'self'";

有一個完整的Nginx配置文件,帥氣的傳送門在此。

如果你想快速檢查你的網站是否有了所有的必須頭部,請使用這個在線檢查器。

客戶端的敏感數據

當發布前端應用時,確保你的代碼里永遠不會包含API密碼和證書,因為它可以被任何人看到。

沒有自動化的方法去檢查你在代碼里寫了敏感數據,但是有兩個可以降低向客戶端暴露敏感數據風險的方法:

使用 pull requests 提交代碼

定期 code review

⑤ NodeJS(Express框架)實現 Token 驗證免密登錄 (一)

看文章之前,強烈建議先把項目拉取下來!案例來自小弟的開源項目 「項目Github」

文章內容只是個人學習的一些總結經驗,不具有權威性,這是 Node 服務端的實現,後面會寫前端的實現

常見的 Token 驗證方式種:

推薦閱讀:

JWT 超詳細分析

說一說幾種常用的登錄認證方式,你用的哪種

推薦閱讀:

JSON Web Token 入門教程

JSON Web Token - 在Web應用間安全地傳遞信息

首先我們先安裝 jsonwebtoken 和 express-jwt 這兩個中間件

jsonwebtoken : 用於生成 Token 。它也有解析 Token 的功能

express-jwt : 用於解析 Token(比 jsonwebtoken 解決方便) , 它把解析之後的數據,存放到 requset.user 中

如果你看了上面 JWT 介紹的文章,就知道 JWT 是由三部分組成的,分別是 載荷(Payload) 、 頭部(Header) 、 簽名(Signature) 。

jsonwebtoken 給我們提供了 sign(payload, secretOrPrivateKey, [options, callback]) 方法。sign 方法對應的其實就是 JWT 簽名(Signature) 的動作

payload:荷載 ,參數類型:對象secretOrPrivateKey:自定義的密鑰,密鑰屬於敏感信息。參數類型:字元串options:可以配置 header 、荷載、指定演算法類型。參數類型:對象callback:回調

眼尖的朋友應該發現, payload 和 options 兩個 參數 都可以配置荷,下面有例子。根據自己的習慣選擇就好

Payload 部分 JWT 規定了7個官方欄位,這些欄位都是可選欄位。可直接以對象的形式傳給 payload 參數。

options 中也可以接受以上七個欄位,不過欄位名稱有所區別。

除此之後 options 提供了 algorithm 和 header ,分別對應使用的加密演算法和 JWT 的 Header 部分,其實 algorithm 應該也是屬於 Header 部分的。

說了這么多,其實我們一般常用的只有 exp(expiresIn) 和 algorithm 這兩個欄位,

例子一:

token 的有效時間是配置在 option 里

例子二:

我們也可以在 payload 里配置有效時間

jsonwebtoken 除了生成 token 外,還提供了解析驗證 token 的方法, jwt.verify(token, secretOrPublicKey, [options, callback]) 。

這里就不演示了, 感興趣的朋友可以參考文檔: 「JsonWebToken」

express-jwt 是針對 express 框架開發的 JWT Token 驗證中間件。我先來簡單說以下它的用法。

主要有兩種方式,一種是哪些請求需要驗證就往哪裡加驗證;另外一種是先給全部請求加上驗證,再給不需要驗證的請求配置 白名單 。

方式一:

看完上面的例子,很顯然不符合我們的逾期,一個正常的項目有個幾十個 api 是分分鍾的事。我們不可能一個個給他加上檢驗

方式二:

這種方式是不是方便很多,而且更美觀,維護起來也更方便

Token 解析出來的用戶信息,默認存放在 req.user , 可以直接 req.user.userId 來使用生成 Token 時填進去的用戶id

你也通過 requestProperty 和 resultProperty 來設置用戶信息存放的對象。

這里就不展開,詳細文檔參考: express-jwt

可以使用 app.use() 來注冊處理驗證不通過的情況

到這里 Token 的生成、驗證、檢驗不通過錯誤處理就完成了。 Token 生成一般是在登錄之後生成,並返回給前端,前端拿到 Token ,並在每次請求 api 的時候攜帶上 Token , Token 就相當於這個用戶的身份,不要輕易泄露。

Token一旦簽發,不能主動讓它失效,只能等待它有效期過才能失效。也就是說就算你修改了密碼,之前的 Token 也還是有效的。你可以修改後端生成 Token 時使用的密鑰,不讓之前的 Token 檢驗通過,但是這就表示之前所有生成 Token 都失效了,做不到針對某個用戶進行注銷。這顯然也不合適的。 所以用戶修改密碼時,前端一般都要清除之前保存的 Token,再重獲取新的 Token

有朋友應該會想到在後端把 Token 儲存起來,每一個用戶對應一個 token。修改賬號時,再生成一個新的 Token 覆蓋之前的 Token,但這就違背了使用 Token 的目的,Token 的使用很大程度就為了減少伺服器的壓力。把盡可能多的信息存儲在客戶端而不是服務端。

使用 Token 可以防禦 CSRF 攻擊,之前寫過一篇關於網路安全的文章,感興趣的朋友可以看一下 「XSS 攻擊、CSRF 攻擊、SQL 注入、流量劫持(DNS 劫持、HTTP 劫持)—— 瀏覽器安全」

⑥ 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怎麼解決嵌套connection.query問題

Nodejs要連接MySQL,可以使用Nodejs的MysQL驅動來實現。比如,我們這里使用「node-mysql」連接資料庫。我們使用下面的方式來連接資料庫螞好粗:首先襪咐,我們需要使用nodejs的包管理工具(npm)安裝mysql的驅悶鎮動。命令行如下:[plain]viewplainnpminstallmusql現在,要在js文件中使用mysql,添加下面的代碼到你的文件中:[plain]viewplain

⑧ 【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。

不說廢話,直接貼碼

⑨ nodejs怎麼安全便捷的實現網站7天免登錄功能

用nodejs實現一個較完整配指的登錄注冊功能需要用到哪些模塊?包括用戶和口令的驗證(使用mongodb),郵箱驗證祥賣昌功能,忘記密碼功能,驗證碼功能,安全(防注入謹扒等

⑩ web前端開發面臨的挑戰主要是有哪些

平時工作,多數是開發Web項目,由於一般是開發內部使用的業務系統,所以對於安全性一般不是看的很重,基本上由於是內網系統,一般也很少會受到攻擊,但有時候一些系統平台,需要外網也要使用,這種情況下,各方面的安全性就要求比較高了。

1、測試的步驟及內容

這些安全性測試,據了解一般是先收集數據,然後進行相關的滲透測試工作,獲取到網站或者系統的一些敏感數據,從而可能達到控制或者破壞系統的目的。

2、SQL注入漏洞的出現和修復

SQL注入定義:

SQL注入攻擊是黑客對資料庫進行攻擊的常用手段之一。隨著B/S模式應用開發的發展,使用這種模式編寫應用程序的程序員也越來越多。但是由於程序員的水平及經驗也參差不齊,相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶可以提交一段資料庫查詢代碼,根據程序返回的結果,獲得某些他想得知的數據,這就是所謂的SQL Injection,即SQL注入。

SQL注入有時候,在地址參數輸入,或者控制項輸入都有可能進行。如在鏈接後加入』號,頁面報錯,並暴露出網站的物理路徑在很多時候,很常見,當然如果關閉了Web.Config的CustomErrors的時候,可能就不會看到。

3、跨站腳本攻擊漏洞出現和修復

跨站腳本攻擊,又稱XSS代碼攻擊,也是一種常見的腳本注入攻擊。例如在界面上,很多輸入框是可以隨意輸入內容的,特別是一些文本編輯框裡面,可以輸入例如這樣的內容,如果在一些首頁出現很多這樣內容,而又不經過處理,那麼頁面就不斷的彈框,更有甚者,在裡面執行一個無限循環的腳本函數,直到頁面耗盡資源為止,類似這樣的攻擊都是很常見的,所以我們如果是在外網或者很有危險的網路上發布程序,一般都需要對這些問題進行修復。