HTML5安全風險詳析之三:WebSQL攻擊
一、WebSQL安全風險簡介
數據庫安全一直是后端人員廣泛關注和需要預防的問題。但是自從HTML5引入本地數據庫和WebSQL之后,前端開發對于數據庫的安全也必須要有所了解和警惕。WebSQL的安全問題通常表現為兩個部分:
第一種是SQL注入:和本地數據庫一樣,攻擊者可以通過SQL注入點來進行數據庫攻擊。
另外一方面,如果Web App有XSS漏洞,那么本地數據很容易泄漏,可以想想本地數據庫里存儲了用戶最近交易記錄或者私信的情況。
二、WebSQL安全風險詳析
1、SQL注入
例如我們有一個URL為http:/blog.csdn.net/hfahe?id=1,它接收了一個id參數來進行本地數據庫查詢并輸出,對應的SQL語句為“select name from user where id = 1”。
但是針對這個簡單的SQL查詢,攻擊者可以構造一個虛假的輸入數據“1 or 1 = 1”,那么我們的SQL語句將變為“select name from user where id = 1 or 1 = 1”。這就相當糟糕了,因為1=1這個條件總是成立的,那么這條語句將遍歷數據庫user表里的所有記錄并進行輸出。
利用這種方式,攻擊者可以構造多種攻擊的SQL語句,來操縱用戶的本地數據庫記錄。
2、XSS與數據庫操縱
在有XSS漏洞的情況下,攻擊者獲取本地數據需要如下幾個步驟:
1)獲取JavaScript數據庫對象
2)獲取SQLite上的表結構
3)獲取數據表名
4)操作數據
例如如下腳本完整的實現了上面的步驟,我在Chrome控制臺里運行即可得到用戶本地數據庫的表名,利用這個表名攻擊者可以用任何SQL語句來完成攻擊。
- 01.var dbo;
- 02.var table;
- 03.var usertable;
- 04.for(i in window) {
- 05. obj = window[i];
- 06. try {
- 07. if(obj.constructor.name=="Database"){
- 08. dbo = obj;
- 09. obj.transaction(function(tx){
- 10. tx.executeSql('SELECT name FROM sqlite_master WHERE type=\'table\'', [], function(tx,results) {
- 11. table = results;
- 12. },null);
- 13. });
- 14. }
- 15. } catch(ex) {}
- 16.}
- 17.if(table.rows.length > 1)
- 18. usertable = table.rows.item(1).name;
三、防御之道
針對WebSQL攻擊,我們有如下方法預防:
1) 檢查輸入類型,過濾危險字符
我們需要保證輸入類型符合預期,例如上面的id參數一定是數字類型;同時過濾掉危險的關鍵字和符號,像PHP里addslashes這個函數的作用一樣。
2) 在SQL語句中使用參數形式
SQL語句是可以用參數形式的,例如
- 01.executeSql("SELECTname FROM stud WHERE id=" + input_id)
這種字符串拼接的形式并不安全,可以換為
- executeSql("SELECTname FROM stud WHERE id=?“, [input_id]);)
這樣能保證參數的輸入符合設定的類型。
3)謹慎對待每一次SQL操作
無論是select、modify、update或者delete,你編寫的任何一條SQL語句操作都有可能成為攻擊者的攻擊對象,造成重大損失,所以都必須要謹慎對待。
4)不要存儲重要數據
本地數據庫永遠透明而不安全,重要的數據必須要存儲在服務器上,本地數據庫里沒有重要數據就不會對用戶造成重大損失。
5)杜絕XSS漏洞
XSS攻擊的防御將會在專門章節闡述,本文不展開詳析。
相關文章: