XSS
Cross-Site Scripting 跨站脚本攻击:攻击者将客户端脚本注入到其他用户查看的网页中。
不被信任的数据:
- HTML input
- HTTP Headers
- Query strings
-
防止 XSS
HTML Encoding:> 变成 > < 变成 <
- Razor 默认开启了 HTML Encoding,可以手动关闭
- 正则表达式
- 反 XSS 的第三方库
-
内置的编码器
HtmlEncoder
- JavaScriptEncoder
- UrlEncoder
通过 Html.Raw 输出的内容不会被 HTML-encoding:
<p class="card-text">
by @Html.Raw(Model.Artist) @@ @Model.ReleaseDate.ToString("yyyy-MM-dd")
</p>
CSRF
Cross-Site Reqest Forgery 跨站请求伪造
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
- 服务器发送随机字符串到客户端,客户端返回的请求和 Cookie 里面都要包含原封不动的字符串
[ValidateAntiForgeryToken]:对单个 Action 启用
- [AutoValidateAntiForgeryToken]:对所有 POST 启用
- [IgnoreAntiForgeryToken]:关闭单个 Action 的验证
启用后生成的 token:
在 Startup 里面配置 AntiForgeryToken:
services.AddAntiforgery(options =>
{
// Set Cookie properties using CookieBuilder properties†.
options.FormFieldName = "AntiforgeryFieldname";
options.HeaderName = "X-CSRF-TOKEN-HEADERNAME";
options.SuppressXFrameOptionsHeader = false;
});
services.AddMvc(options =>
{
options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
});