跨站請求偽造,也被稱為 one-click attack
或者 session riding
,通常縮寫為 CSRF
或者 XSRF
, 是一種挾制使用者在當前已登入的Web應用程式上執行非本意的操作的攻擊方法。跟跨網站指令碼(XSS)相比,XSS 利用的是使用者對指定網站的信任,CSRF 利用的是網站對使用者網頁瀏覽器的信任。
CSRF 攻擊的範例:
假如一家銀行用以執行轉帳操作的URL位址如下: https://good-banking-site.com/account?account=AccoutName&amount=1000&for=PayeeName
那麼,一個惡意攻擊者可以在另一個網站上放置如下代碼:
如果有帳戶名為Olivia的使用者存取了惡意站點,而她之前剛存取過銀行不久,登錄資訊尚未過期,那麼她就會損失1000資金。
除了使用者選取 Submit 按鈕的案例之外,惡意網站可能:
這種惡意的網址可以有很多種形式,藏身於網頁中的許多地方。此外,攻擊者也不需要控制放置惡意網址的網站。例如他可以將這種位址藏在論壇,部落格等任何使用者生成內容的網站中。這意味著如果伺服器端沒有合適的防禦措施的話,使用者即使存取熟悉的可信網站也有受攻擊的危險。
攻擊者並不能通過CSRF攻擊來直接獲取使用者的帳戶控制權,也不能直接竊取使用者的任何資訊。他們能做到的,是欺騙使用者的瀏覽器,讓其以使用者的名義執行操作。
注意
ASP.NET Core 使用 ASP.NET Core Data Protection 來實行 antiforgery。 資料保護堆疊必須設定為可在伺服器陣列中運作。
在呼叫下列其中一個 API 時,Antiforgery Middleware 會新增至DI Container 中:
FormTagHelper
會將 Antiforgery Token 插入 HTML 表單元素中。 檔案中的 Razor 下列標記會自動產生Antiforgery Token
<form method="post">
</form>
如果表單的方法不是 GET
, IHtmlHelper.BeginForm
則預設會產生 Antiforgery Token。
當標籤包含 method="post" 屬性且下列任一項成立時 就會自動產生 HTML 表單專案的 Antiforgery 標記
1.動作屬性是空的 (action="") 。
2.動作屬性未提供 () 。
Razor 頁面會自動受到 XSRF/CSRF 的保護
<form asp-action="Index" asp-controller="Home" method="post">
@Html.AntiForgeryToken()
<!-- ... -->
</form>
@using (Html.BeginForm("Index", "Home"))
{
<!-- ... -->
}
在上述兩個案例中,ASP.NET Core新增類似下列範例的隱藏表單欄位:
<input name="__RequestVerificationToken" type="hidden" value="CfDJ8NrAkS ... s2-m9Yw">
ASP.NET Core包含三個篩選準則,可用於 Antiforgery Token:
以上三個篩選準則明天再寫囉~
跨站請求偽造
Prevent Cross-Site Request Forgery (XSRF/CSRF) attacks in ASP.NET Core