Visual

19 XSS & CSRF.mp4 (69.47MB)

XSS

Cross-Site Scripting 跨站脚本攻击:攻击者将客户端脚本注入到其他用户查看的网页中。

不被信任的数据:

  • HTML input
  • HTTP Headers
  • Query strings
  • Attributes,EXIF 信息

防止 XSS

  • HTML Encoding:> 变成 > < 变成 <
    • Razor 默认开启了 HTML Encoding,可以手动关闭
  • 正则表达式
  • 反 XSS 的第三方库
  • 对请求进行验证

内置的编码器

  • HtmlEncoder
  • JavaScriptEncoder
  • UrlEncoder

通过 Html.Raw 输出的内容不会被 HTML-encoding:

  1. <p class="card-text">
  2. by @Html.Raw(Model.Artist) @@ @Model.ReleaseDate.ToString("yyyy-MM-dd")
  3. </p>

CSRF

Cross-Site Reqest Forgery 跨站请求伪造

image.png

OWASP 的 CSRF 防范方案

  • Header 验证
  • Synchronizer Token Pattern
    • 服务器发送随机字符串到客户端,客户端下次请求时需要把字符串原封不动返回去
  • Double Submit Cookie
    • 服务器发送随机字符串到客户端,客户端返回的请求和 Cookie 里面都要包含原封不动的字符串

ASP.NET Core:Synchronizer Token Pattern

Docs:Prevent Cross-Site Request Forgery (XSRF/CSRF) attacks in ASP.NET Core

  • [ValidateAntiForgeryToken]:对单个 Action 启用
  • [AutoValidateAntiForgeryToken]:对所有 POST 启用
  • [IgnoreAntiForgeryToken]:关闭单个 Action 的验证

启用后生成的 token:
image.png
在 Startup 里面配置 AntiForgeryToken:(全局配置)

  1. services.AddAntiforgery(options =>
  2. {
  3. // Set Cookie properties using CookieBuilder properties†.
  4. options.FormFieldName = "AntiforgeryFieldname";
  5. options.HeaderName = "X-CSRF-TOKEN-HEADERNAME";
  6. options.SuppressXFrameOptionsHeader = false;
  7. });
  8. services.AddMvc(options =>
  9. {
  10. options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
  11. });