今天我們來討論一下ajax請求的安全性,我相信各位在系統開發過程中肯定會絞盡腦汁的想怎樣可以盡量少的防止偽造ajax請求進行攻擊,尤其是開發跟用戶交互比較多的互聯網系統。那么就請大家來分享討論一下你在開發過程中怎樣考慮ajax安全及防止ajax請求攻擊的問題。我也是一個新手,就先拋磚引玉了,寫的不對的地方歡迎批評指正。
我先上兩段網摘:
Ajax安全防范的方法:
- 判斷request的來源地址。這樣的方式不推薦,因為黑客可以更改http包頭,從而繞過檢測。
- 采用驗證碼。也不推薦,請各位大大想一下用戶的感受,剛輸入用戶名就讓我輸入注冊碼?這樣Ajax意義何在?
- 給一個IP在一個小時內,分配一些份額,比如500個(考慮到網吧等等多台機器一個IP,使用NAT的地方)。
Ajax 安全性經驗法則:
- 如果你使用身份驗證, 確定你在請求頁上檢查!
- 為 SQL 注入檢查。
- 為 JavaScript 注入檢查。
- 保留商務邏輯在服務器上!
- 不要假設每個請求是真正的!
- 確認檢查數據!
- 審查請求的數據而且確定它是正確的。
目前為止我做的最多的防止ajax請求攻擊的就是添加驗證碼、添加隨機Token,限制同一請求在規定時間內的最大請求數量、服務器端校驗數據正確性、盡量使用POST方法。
下面我寫一個在ajax請求的http頭中添加一個隨機Token來增加ajax請求的安全性。
1、使用 $.ajaxSetup和setRequestHeader方法為所有的ajax請求的Http頭添加一個隨機Token值
$.ajaxSetup({ beforeSend: function (xhr) { xhr.setRequestHeader("token", "token隨機值"); } });
這段js代碼可以放在母板頁中,token值隨着頁面的加載生成並放在session中,這樣頁面中的其他ajax進行請求時就會在Http頭中添加token:XXXXXXX的鍵值對。我們就可以在后台獲取該token值並與session中的值對比,相等則為合法的請求。
2、Token生成。
string Token = new Random().NextDouble().ToString(); Session["token"] = Token; System.Web.UI.HtmlControls.HtmlGenericControl script = new System.Web.UI.HtmlControls.HtmlGenericControl("script"); script.Attributes.Add("type", "text/javascript"); script.InnerHtml = @" $.ajaxSetup({ beforeSend: function (xhr) { xhr.setRequestHeader(""token"", """ + Token + @"""); } }); "; Page.Header.Controls.Add(script);
3、新建DataService.ashx
public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; string Token = context.Request.Headers["token"]; if (string.IsNullOrWhiteSpace(Token) || context.Session["token"] == null) { context.Response.Write("請求不合法"); } else if (Token != context.Session["token"].ToString()) { context.Response.Write("請求不合法"); } else { context.Response.Write("請求合法§"); } }
4、測試Ajax請求
$.post("DataService.ashx", function (json) { alert(json); });
打開FireBug查看請求,發現多了一個token的值
如果你有什么好的能保證ajax請求安全的方法,歡迎評論。
即使沒有讀者,也要寫博客。