缺少跨站请求伪造令牌验证¶
ID: cs/web/missing-token-validation
Kind: problem
Security severity: 8.8
Severity: error
Precision: high
Tags:
- security
- external/cwe/cwe-352
Query suites:
- csharp-code-scanning.qls
- csharp-security-extended.qls
- csharp-security-and-quality.qls
使用令牌来防止跨站请求伪造 (CSRF) 的 Web 应用程序应该对所有 Http POST 请求验证令牌。
尽管登录和身份验证方法不易受到传统的 CSRF 攻击,但它们仍然需要使用令牌或其他缓解措施进行保护。这是因为攻击者可以利用未受保护的登录页面,使用攻击者控制的帐户强制登录。然后使用此帐户向网站发出后续请求,而用户没有意识到这一点。这可能导致用户将私人信息与攻击者控制的帐户相关联。
建议¶
应该为此方法添加适当的属性,以确保在调用此操作方法时验证防伪令牌。如果使用 MVC 提供的防伪框架,则这将是 [ValidateAntiForgeryToken]
属性。
或者,您可以考虑包含一个全局过滤器,将令牌验证应用于所有 POST 请求。
示例¶
在以下示例中,ASP.NET MVC Controller
正在使用 [ValidateAntiForgeryToken]
属性来缓解 CSRF 攻击。它已正确应用于 UpdateDetails
方法。但是,此属性尚未应用于 Login
方法。应该通过添加此属性来修复此问题。
using System.Web.Mvc;
public class HomeController : Controller
{
// BAD: Anti forgery token has been forgotten
[HttpPost]
public ActionResult Login()
{
return View();
}
// GOOD: Anti forgery token is validated
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult UpdateDetails()
{
return View();
}
}
参考¶
维基百科:跨站请求伪造。
Microsoft 文档:ASP.NET MVC 和网页中的 XSRF/CSRF 防护。
常见弱点枚举:CWE-352。