為什么用戶名不能特殊字符
#
- 為了防止sql注入,比如,像
=
,'
等等,這些都會干擾查詢甚至會報錯。 - 特殊字符可能不利於我們網站的展示,比如☆,可能其他用戶無法打出來,導致操作上的不便。
- HTML的標簽,因為所有的用戶名在網頁上都是會顯示的,比如起個名字叫xiaoming,這就不平等,你的用戶名會顯示為紅色。
SQL注入攻擊(SQL Injection)##
SQL注入:指的是在請求參數中插入一些SQL語句,程序在接收后錯誤的將攻擊者的輸入作為查詢語句的一部分執行,從而欺騙服務器,執行惡意SQL命令。
簡稱注入攻擊,是Web開發中最常見的一種安全漏洞。可以用它來從數據庫獲取敏感信息,或者利用數據庫的特性執行添加用戶,導出文件等一系列惡意操作,甚至有可能獲取數據庫乃至系統用戶最高權限。
而造成SQL注入的原因是因為程序沒有有效過濾用戶的輸入,使攻擊者成功的向服務器提交惡意的SQL查詢代碼,程序在接收后錯誤的將攻擊者的輸入作為查詢語句的一部分執行,導致原始的查詢邏輯被改變,額外的執行了攻擊者精心構造的惡意代碼。
比如查詢:
strSQL = "SELECT * FROM users WHERE name = '" + userName + "' and pw = '"+ passWord +"';"
如果用戶的輸入如下:
userName = "1' OR '1'='1";
passWord = "1' OR '1'='1";
那么我們的SQL變成了如下所示:
strSQL = "SELECT * FROM users WHERE name = '1' OR '1'='1' and pw = '1' OR '1'='1';"
因為WHERE條件恆為真,這就相當於執行:
strSQL = "SELECT * FROM users;"
因此可以達到無賬號密碼亦可登錄網站。如果惡意用戶要是更壞一點,用戶填入:
userName = "1";
passWord = " '; DROP TABLE users;";
SQL語句變成了:
strSQL = "SELECT * FROM users WHERE name = '1' and pw = ' '; DROP TABLE users;"
這樣一來,雖然沒有登錄,但是數據表都被刪除了。
但是密碼可以使用特殊字符,因為密碼一般使用加密的方式(通常是md5之類的摘要算法),絕對不應該使用明文方式保存。不但能夠提高安全性,而且並不需要限制特殊字符。
SQL注入攻擊預防
- 嚴格限制Web應用的數據庫的操作權限,給此用戶提供僅僅能夠滿足其工作的最低權限,從而最大限度的減少注入攻擊對數據庫的危害。
- 檢查輸入的數據是否具有所期望的數據格式,嚴格限制變量的類型,例如使用regexp(正則表達式)進行一些匹配處理
- 對進入數據庫的特殊字符('"\尖括號&*;等)進行轉義處理,或編碼轉換。
比如:mysql的轉義都是通過\來進行的
那么一些特殊輸入,可以使用轉義處理,比如
\'
單引號\n
換行符\r
回車符\\
反斜線(\
)字符。\%
%
字符。\_
_
字符。
4 .所有的查詢語句建議使用數據庫提供的參數化查詢接口,參數化的語句使用參數而不是將用戶輸入變量嵌入到SQL語句中,即不要直接拼接SQL語句。可以使用PreparedStatement對象。
5 .避免網站打印出SQL錯誤信息,比如類型錯誤、字段不匹配等,把代碼里的SQL語句暴露出來,以防止攻擊者利用這些錯誤信息進行SQL注入。