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

  • [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. });