我正在學習如何保護網站免受未經授權的訪問,並且我遇到了防僞。這是我的想法(和我的問題)。如果我錯了,請糾正我。防僞 - 更好地理解它的工作原理
通過在存在於網頁上的Form
中插入@Html.AntiForgeryToken()
,可以防止防僞在ASP.NET MVC應用程序中處理(可能有許多其他方式,但這種方式很常見)。
此令牌後使用一次的用戶嘗試將數據POST
到系統中,在那裏,如果我們裝點我們的IActionResult
或JsonResult
法[ValidateAntiForgeryToken]
屬性,它會檢查該密鑰是否期望的結果相匹配。下面是我通過裝修意味着一個例子:
[Route("")]
[HttpPost("")]
[ValidateAntiForgeryToken]
public JsonResult UpdateRecords([FromBody]CustomRequest request)
{
if (ModelState.IsValid)
{
//...do some logic here
}
}
爲什麼webistes使用防僞鍵,所以我們不希望讓儘可能數據庫對我們的業務未經授權的訪問對象,其原因。問題是,如果一個網站使用cookie認證,並將其存儲到本地緩存中,黑客可以輕鬆檢索到這個存儲的值,並在將數據發佈到我們的網站時使用它。因此,我們正在實施另一級別的保護,即通過在網頁上插入特殊(唯一)密鑰,在發佈數據時對其進行檢查。如果密鑰不匹配,則整個發佈過程失敗。
這是我不明白的東西。比方說,我們已經實現了我們的反僞造超級簡單的形式在我們的網頁上是這樣的:
<form method="post" ng-submit="addItem()" id="main-form">
@Html.AntiForgeryToken()
<input placeholder="Add New Item" ng-model="newItem" id="new-item" />
</form>
我知道它什麼都不做,但讓我們想象一下,通過點擊input
按鈕,用戶試圖將一些數據上傳到數據庫。如果我們考察的網頁,我們會突然看到,這是產生什麼樣的HTML代碼是這樣:
<form class="ng-pristine ng-valid" method="post" ng-submit="addItem()" id="main-form">
<input name="__RequestVerificationToken" value="CfDJ8Ig8dRjRrw9FjKYv6kYaxVu7APOddjpVxQ3ZxGaamjVzV03eQEG7tgRe5q2uXJkKkbUf4RqzRCtJ1DGMK5C-ymroTBe_J9XQ-...(more text here)" type="hidden">
<input class="ng-pristine ng-valid ng-touched" placeholder="Add New Item" ng-model="newItem" id="new-item">
</form>
現在在這裏,我(和潛在的黑客)可以看到,是特殊防僞關鍵我們剛剛討論過。爲什麼使用該網站的人可以看到這個密鑰?我的理解是,我們基本上是向黑客提供我們的代碼,他現在可以在發佈到數據庫時輕鬆使用它來驗證自己;或者我錯了?
我現在很困惑,因此任何關於此事的幫助/信息或建議都將不勝感激。
我建議你檢查'__RequestVerificationToken'的值,並將其與cookie進行比較。您應該多次發佈表單並驗證隱藏的輸入字段「__RequestVerificationToken」的值是** unique **。這意味着如果您通過HTTP發送數據並且有人看到了流量,那麼他仍然無法發佈他自己的請求,因爲AntiForgeryToken在這種情況下會失敗。例如,請參閱[這裏](http://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-csrf-attacks)。 – Oleg
'AntiForgeryToken()'與授權無關。它用於防止跨站請求僞造(CSRF)攻擊。請參閱[本文](http://www.devcurry.com/2013/01/what-is-antiforgerytoken-and-why-do-i.html)和[this one](http://stackoverflow.com/問題/ 38555299 /反僞造 - 更好理解 - 它是如何工作的)來理解它的用途 –