1. 程式人生 > >7.網絡安全

7.網絡安全

ram one httpget 跨站請求偽造 結構 ima 運行 net --

1) 什麽是網絡安全

作為程序員,主要是面向產品的安全的問題。比如sql註入,xsscsrfcookie竊取等等,都值得我們去思考。保證網站運行正常,客戶數據安全。

2) sql註入

簡單的說,就是利用表單提交數據和URL傳參,來控制數據庫,進行一些非法操作,比如,查詢到不該知道的數據,破壞數據庫的結構等等。如果網站存在SQL註入的漏洞,那麽一定是可以用表單和URL參數,構造非法的SQL命令,從而操作數據庫。

新建項目,新建SqlSecurityController控制器,新建兩個index action一個用於httpget,一個用於httppost,在action頭部使用特性。

技術分享

這裏使用了ado.net的方式查詢數據庫,namepassword參數把頁面提交的用戶名和密碼組成一條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文檔的過程中,出現了不被預期的腳本指令並執行時,

XSS就發生了。

新建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攻擊

CSRFCross-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頁面。id31的數據被修改了。產生嚴重的後果。

技術分享

CSRF防禦

新建提交方式為getEdit ation,view頁面的form提交標簽內輸入@Html.AntiForgeryToken()。

技術分享

同時在提交到的Post Edit action添加特性[ValidateAntiForgeryToken]

技術分享

修改id31的數據為正常數據,運行程序,地址欄輸入/XssAttack/Index

技術分享

當用戶無意點擊攻擊鏈接時。便會報錯。導致攻擊失敗。

技術分享

而用/XssAttack/Edit正常修改,則成功。

技術分享

技術分享

防禦攻擊的原理和驗證碼類似,也可用驗證碼方式做到。

技術分享

還有一種辦法就是獲取上一個頁面,比如是從那一個頁面跳轉過來的,如果Request.UrlReferrernull或者不是本站點下的網站,則可判斷為CSRF攻擊。

被攻擊時為null

技術分享

正常提交數據時,可判斷是否為本域名提交。

技術分享

7.網絡安全