XSS
XSS攻擊:跨站腳本攻擊(Cross-Site Scripting)。基本原理是:將惡意代碼植入頁面。分為反射性和注入型兩類:前者主要通過Url參數攜帶信息;后者通過產生的內容存入數據庫中,多個用戶都會被危害到。
危害方面:
- 盜用cookie,獲取敏感信息。
- 利用植入Flash,通過crossdomain權限設置進一步獲取更高權限;或者利用Java等得到類似的操作。
- 利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻擊者)用戶的身份執行一些管理動作,或執行一些如:發微博、加好友、發私信等常規操作,前段時間新浪微博就遭遇過一次XSS。
- 利用可被攻擊的域受到其他域信任的特點,以受信任來源的身份請求一些平時不允許的操作,如進行不當的投票活動。
- 在訪問量極大的一些頁面上的XSS可以攻擊一些小型網站,實現DDoS攻擊的效果
預防方法:
過濾特殊字符:
'<':'<',
'>':'>',
'&':'&',
' ':' ',
'"':'"',
"'":''',
'\n':'<br/>',
'\r':''
CSRF
CSRF(Cross-site request forgery),中文名稱:跨站請求偽造,也被稱為:one click attack/session riding,縮寫為:CSRF/XSRF。
基本原理: 用戶在登錄A站的情況下,登錄了危險網站B站。 在A站沒有退出的情況,B站借用A站的信息進行了操作,如發送了A站的get請求等。
預防方法: 關鍵操作不用get請求、token隨機碼或者圖片驗證碼等
SQL注入
一個例子:
// 參數化
sql:="SELECT * FROM user WHERE username='"+username+"' AND password='"+password+"'"
// 用戶名:
myuser' or 'foo' = 'foo' --
// 查詢
SELECT * FROM user WHERE username='myuser' or 'foo'=='foo' --'' AND password='xxx'
在SQL里面 --
是注釋標記,所以查詢語句會在此中斷。這就讓攻擊者在不知道任何合法用戶名和密碼的情況下成功登錄了。
防御措施:
- 嚴格限制Web應用的數據庫的操作權限,給此用戶提供僅僅能夠滿足其工作的最低權限,從而最大限度的減少注入攻擊對數據庫的危害。
- 檢查輸入的數據是否具有所期望的數據格式,嚴格限制變量的類型,例如使用regexp包進行一些匹配處理,或者使用strconv包對字符串轉化成其他基本類型的數據進行判斷。
- 對進入數據庫的特殊字符('"\尖括號&*;等)進行轉義處理,或編碼轉換。Go 的text/template包里面的HTMLEscapeString函數可以對字符串進行轉義處理。
所有的查詢語句建議使用數據庫提供的參數化查詢接口,參數化的語句使用參數而不是將用戶輸入變量嵌入到SQL語句中,即不要直接拼接SQL語句。例如使用database/sql里面的查詢函數Prepare和Query,或者Exec(query string, args ...interface{})。 - 在應用發布之前建議使用專業的SQL注入檢測工具進行檢測,以及時修補被發現的SQL注入漏洞。網上有很多這方面的開源工具,例如sqlmap、SQLninja等。
- 避免網站打印出SQL錯誤信息,比如類型錯誤、字段不匹配等,把代碼里的SQL語句暴露出來,以防止攻擊者利用這些錯誤信息進行SQL注入。