2016年9月6日 星期二

Prevent Cross-Site Request Forgery (CSRF) using ASP.NET MVC’s AntiForgeryToken()

什麼是 Cross-Site Request Forgery (CSRF)

簡單來說,CSRF 就是使用者在不知情的情況,讓瀏覽器送出請求給目標網站以達攻擊目的。

使用者進行網路驗證後,瀏覽器會將驗證資訊存在 Cookie , 若使用者未登出,此 Cookie 仍視為有效, 而使用者瀏覽其他網站時,會將此驗證資訊回傳 server 以便進行操作, 此時使用者在不自覺的情況下,瀏覽含有攻擊程式碼的網頁, 駭客可使用相同一份驗證資訊(使用者身份)進行攻擊。

如何預防 CSRF

在 View 上 加入 @Html.AntiForgeryToken()
<!-- Contained in xxxxx.cshtml -->
@model MileageStats.ServicesModel.User
@Html.AntiForgeryToken()

在 client 端,即可檢視會產出 hidden input html
<!-- Rendered HTML in the client browser -->
<input name="__RequestVerificationToken" 
  type="hidden" 
  value="H4zpQFvPdmEdGCLsFgeByj0xg+BODBjIMvtSl5anoNaOfX4V69Pt1OvnjIbZuYrpgzWxWHIjbn
  zFOLxP5SzVR4cM9XZeV78IPi8K4ewkM3k2oFkplrXL4uoAqy+aoSOg8s1m1qxrE7oeBBtvezEHCAs6nKE
  h2jAwn3w0MwmhkcDQiJfJK7hGvN0jXA4d7S8x7rbLxp4Y8IJZS9wka2eOLg==" />

在 controller action 加上 ValidateAntiForgeryTokenAttribute
// Contained in xxxxController.cs
[HttpPost]
[ValidateInput(false)]
[ValidateAntiForgeryToken]
public ActionResult Edit(....)

透過 AntiForgeryToken 來檢查連線是否是正常的,
簡單的兩個步驟就完成囉!

參考:https://msdn.microsoft.com/en-us/library/hh404095.aspx

沒有留言:

張貼留言