7.網絡安全
1) 什麽是網絡安全
作為程序員,主要是面向產品的安全的問題。比如sql註入,xss,csrf,cookie竊取等等,都值得我們去思考。保證網站運行正常,客戶數據安全。
2) sql註入
簡單的說,就是利用表單提交數據和URL傳參,來控制數據庫,進行一些非法操作,比如,查詢到不該知道的數據,破壞數據庫的結構等等。如果網站存在SQL註入的漏洞,那麽一定是可以用表單和URL參數,構造非法的SQL命令,從而操作數據庫。
新建項目,新建SqlSecurityController控制器,新建兩個index action一個用於httpget,一個用於httppost,在action頭部使用特性。
這裏使用了ado.net的方式查詢數據庫,name和password參數把頁面提交的用戶名和密碼組成一條sql語句,查詢完後把DataSet數據傳到View。
View頁面,當(ViewBag.data).Tables[0].Rows.Count有數據時,顯示登陸成功。下面是提交form表單,用於提交用戶名和密碼登陸。
運行程序,地址欄輸入/SqlSecurity/Index。輸入正確的用戶名和密碼,登陸。
登陸成功。
再次打開/SqlSecurity/Index頁面,用戶名輸入‘or 1 = 1--,密碼不填,登陸。
此時數據庫執行的sql指令變成了
select * from usertable where name = ‘‘or 1 = 1--‘ and password = ‘‘
--在sql語句中是註釋的意思。成功執行了語句,返回了usertable 表中的數據。
這就是sql註入,此隱患可讓不法者查詢到不該看的數據,刪除數據,操作數據庫。
解決方法也是有很多,這裏使用sql參數化的方法,修改代碼為兩個字符串占位,後面通過new SqlParameter()為兩個參數賦指。
運行程序,地址欄輸入/SqlSecurity/Index。在用戶名處輸入‘or 1 = 1--,登陸。提示失敗。
用正確的用戶名和密碼登陸,登陸成功。
3) XSS攻擊
XSS全稱是Cross Site Scripting即跨站腳本,當目標網站目標用戶瀏覽器渲染HTML文檔的過程中,出現了不被預期的腳本指令並執行時,
新建SqlSecurityController控制器,新建兩個index action一個用於httpget,一個用於httppost,在action頭部使用特性。這裏也用道了ado.net的方式來對數據庫進行操作。
httpget特性的index action把查詢出來的數據顯示在view界面。
httpost特性的index action把輸入的數據添加到數據庫,然後跳轉到index action查詢數據。
新建Index view,用於展示和輸入數據,@Html.Raw()返回的是沒有編碼的 HTML 標記。
運行程序,地址欄輸入/XssAttack/Index。看到了兩條數據和兩個輸入框。
在用戶名處輸入<a herf=‘www.baidu.com‘>aaaa</a>,密碼輸入555。登陸。
保存到數據庫後再次進入頁面時,查詢出3條數據。
提交用戶名的時候是一個a標簽鏈接,現在完全顯示出來了。
又比如輸入<script src="/Scripts/JavaScript.js"></script>加載非法腳本提交,當用戶打開頁面時就會執行腳本。
非法提交的跨站腳本信息顯然是不被允許的。不過Razor語法幫我們做了很多。在index view視圖中去掉@Html.Raw(),再次打開/XssAttack/Index。輸入的標簽被編碼了。
或者用
@Html.AttributeEncode() @Html.Encode()來執行編碼。最好還是在提交輸入框內容時驗證一下,當出現非法字符串時,出現提亂碼。
4)CSRF攻擊
CSRF(Cross-site request forgery)跨站請求偽造,也被稱為“One Click Attack”或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。盡管聽起來像跨站腳本(XSS),但它與XSS非常不同,XSS利用站點內的信任用戶,而CSRF則通過偽裝來自受信任用戶的請求來利用受信任的網站。
攻擊通過在授權用戶訪問的頁面中包含鏈接或者腳本的方式工作。例如:一個網站用戶Bob可能正在瀏覽聊天論壇,而同時另一個用戶Alice也在此論壇中,並且後者剛剛發布了一個具有Bob銀行鏈接的圖片消息。設想一下,Alice編寫了一個在Bob的銀行站點上進行取款的form提交的鏈接,並將此鏈接作為圖片src。如果Bob的銀行在cookie中保存他的授權信息,並且此cookie沒有過期,那麽當Bob的瀏覽器嘗試裝載圖片時將提交這個取款form和他的cookie,這樣在沒經Bob同意的情況下便授權了這次事務。
新建提交方式為POST Edit Action,負責修改用戶信息。
這裏我們只會讓有權限的角色執行這個action,但當有權限的角色登陸後cookie信息存在,攻擊者就可以騙取用戶點擊某個鏈接或者圖片,該網站或圖片轉到Edit Action,修改了不該修改的數據等。
被騙取到的攻擊網頁。打開便會向服務器Edit Action提交修改信息。
運行程序,地址欄輸入/XssAttack/Index。假如此處以被XSS攻擊,註入了“致富發財的方法”這個鏈接,用戶點擊進去,就執行了攻擊者的攻擊頁面。
執行一閃而過,回到index頁面。id為31的數據被修改了。產生嚴重的後果。
CSRF防禦
新建提交方式為get的Edit ation,在view頁面的form提交標簽內輸入@Html.AntiForgeryToken()。
同時在提交到的Post Edit action添加特性[ValidateAntiForgeryToken]
修改id為31的數據為正常數據,運行程序,地址欄輸入/XssAttack/Index。
當用戶無意點擊攻擊鏈接時。便會報錯。導致攻擊失敗。
而用/XssAttack/Edit正常修改,則成功。
防禦攻擊的原理和驗證碼類似,也可用驗證碼方式做到。
還有一種辦法就是獲取上一個頁面,比如是從那一個頁面跳轉過來的,如果Request.UrlReferrer為null或者不是本站點下的網站,則可判斷為CSRF攻擊。
被攻擊時為null。
正常提交數據時,可判斷是否為本域名提交。
7.網絡安全