為什么用戶名不能特殊字符


為什么用戶名不能特殊字符
#

  1. 為了防止sql注入,比如,像='等等,這些都會干擾查詢甚至會報錯。
  2. 特殊字符可能不利於我們網站的展示,比如☆,可能其他用戶無法打出來,導致操作上的不便。
  3. 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注入攻擊預防

  1. 嚴格限制Web應用的數據庫的操作權限,給此用戶提供僅僅能夠滿足其工作的最低權限,從而最大限度的減少注入攻擊對數據庫的危害。
  2. 檢查輸入的數據是否具有所期望的數據格式,嚴格限制變量的類型,例如使用regexp(正則表達式)進行一些匹配處理
  3. 對進入數據庫的特殊字符('"\尖括號&*;等)進行轉義處理,或編碼轉換。
    比如:mysql的轉義都是通過\來進行的
    那么一些特殊輸入,可以使用轉義處理,比如
  • \'
    單引號
  • \n
    換行符
  • \r
    回車符
  • \\
    反斜線(\)字符。
  • \%
    %字符。
  • \_
    _字符。

4 .所有的查詢語句建議使用數據庫提供的參數化查詢接口,參數化的語句使用參數而不是將用戶輸入變量嵌入到SQL語句中,即不要直接拼接SQL語句。可以使用PreparedStatement對象。
5 .避免網站打印出SQL錯誤信息,比如類型錯誤、字段不匹配等,把代碼里的SQL語句暴露出來,以防止攻擊者利用這些錯誤信息進行SQL注入。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM