天天看點

nodejs mysql sql注入_Node.js 項目中解決 SQL 注入和 XSS 攻擊

1.SQL 注入

SQL 注入,一般是通過把 SQL 指令插入到 Web 表單送出或輸入域名或頁面請求的查詢字元串,最終達到欺騙伺服器執行惡意的 SQL 指令。

SQL 注入示例

在登入界面,後端會根據使用者輸入的使用者(username)和密碼(password),到 MySQL 資料庫中去驗證使用者的身份。

使用者輸入使用者名【cedric】 , 密碼【123456】,在後端處理時,會進行如下 sql 語句拼接,當驗證使用者名和密碼成功後,即成功登入。

// 使用者名為 cedric , 密碼為 123456

select username from users where username='cedric' and password='123456';

但是,如果使用者在輸入框惡意輸入使用者名【cedric' -- 】(注意最後面有個空格)和随意一個錯誤的密碼【111】,在後端處理時,會進行如下 sql 語句拼接,也會成功登入。

// 符号 ‘--’ 後面的語句相當于被注釋了

select username from users where username='cedric -- ' and password='111';

或者,如果使用者在輸入框惡意輸入使用者名【cedric';delete from users; -- 】和随意一個錯誤的密碼【111】,在後端處理時,會進行如下 sql 語句拼接,則結果會導緻資料庫中所有使用者被删除。

// 符号 ‘--’ 後面的語句相當于被注釋了

select username from users where username='cedric';delete from users; -- ' and password='111';

SQL 注入預防

Node 環境下,使用 mysql 的 escape 函數處理輸入内容,就能将參數中的特殊字元進行轉義。

在所有輸入 sql 語句的地方,用 escape 函數處理一下即可, 例如:

const login = (username, password) => {

// 預防 sql 注入

username = escape(username)

password = escape(password)

const sql = `

select username from users where username=${username} and password=${password};

`

// 然後按上面語句執行 sql 查詢

···

}

2. XSS 攻擊

XSS 是一種在web應用中的計算機安全漏洞,它允許惡意web使用者将代碼(代碼包括HTML代碼和用戶端腳本)植入到提供給其它使用者使用的頁面中。

XSS 攻擊示例

xss攻擊主要是針對表單的 input/textarea 文本框發起的,比如在文本框中輸入:

如果前端不進行過濾直接送出到後端(比如Node ),而服務端也沒有進行過濾直接寫入資料庫庫,那麼在下一次(或其他使用者)進入頁面時,就會執行alert(1), 頁面彈出 1 。

竊取網頁中的cookie值

或者,文本框中惡意輸入:

就可以擷取使用者 cookie 了。

劫持流量實作惡意跳轉

文本框中惡意輸入:

導緻,所通路的網站就會自動跳轉到 www.abc.com 了。

XSS 攻擊預防

對使用者輸入的資料進行HTML Entity編碼, 也就是對

Node環境下,安裝:

$ npm install xss

然後修改:

const xss = require('xss')

const inputValue = content // 未進行 xss 防禦

const inputValue = xss(content) // 已進行 xss 防禦

然後如果在 input 輸入框 惡意輸入 , 就會被轉換為下面的語句并存入資料庫:

<script> alert(1) </script>,已達到無法執行