博客脱更好久了,最近比较忙,上班忙工作,下班忙生活,典型的被绑架的人生!好在项目收尾了,年底获取能轻松点。
最近也没怎么学习,只凑空看了点视频。随便记录一点吧:
1、跨站脚本攻击(XSS),是目前最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。
页面中的输入框,请求头,Query strings等信息是不被信任的数据,.net core中默认开启html encoding,来预防xss,但是我们也可以关闭它。我们可以通过正则表达式/反 XSS 的第三方库/对请求进行验证等手段来预防xss。.net core 内置的编码器可以对这些不被信任的信息进行编码,常用的是HtmlEncoder/JavaScriptEncoder/UrlEncoder,好像是可以直接注入使用,框架默认已经注册。
2、跨站请求伪造(CSRF),是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨站脚本攻击(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
OWASP 的 CSRF 防范方案:
- Header 验证
- Synchronizer Token Pattern:服务器发送随机字符串到客户端,客户端下次请求时需要把字符串原封不动返回去
- Double Submit Cookie:服务器发送随机字符串到客户端,客户端返回的请求和 Cookie 里面都要包含原封不动的字符串
ASP.NET Core:Synchronizer Token Pattern
- [ValidateAntiForgeryToken]:对单个 Action 启用
- [AutoValidateAntiForgeryToken]:对所有 POST 启用(需要在startup中配置)
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()); });
- [IgnoreAntiForgeryToken]:关闭单个 Action 的验证
3、模型绑定(Model Binding)
action的参数的来源一般从路由/请求体/请求头/Query strings等地方来,框架按照一定的顺序,一次查找,我们可以通过一些提醒标签来指定从哪里来找(
- FromBody:Request Bodys
- FromQuery:QueryStrings
- FromHeader:Request Headers(可以指定哪一个请求头的值)
- FromRoute
- FromForm
也可以指定某些属性不进行绑定或者必须进行绑定
- Bind:有选择的绑定属性
- BindNever:指定属性不需要绑定(作用于model上的属性)
- BindRequired:指定属性必须绑定
4、自定义模型验证
我们可以自定义模型验证,其实就是写一个特性标签,我们首先需要继承Attribute类,然后再实现IModelValidator接口
public class ValidUrlAttribute : Attribute, IModelValidator
{
public string ErrorMessage { get; set; }
public IEnumerable<ModelValidationResult> Validate(
ModelValidationContext context)
{
var url = context.Model as string;
if (url != null && Uri.IsWellFormedUriString(url, UriKind.Absolute))
{
return Enumerable.Empty<ModelValidationResult>();
}
return new List<ModelValidationResult>
{
new ModelValidationResult(string.Empty, ErrorMessage)
};
}
}
然后标注到model的属性上,可以传入ErrorMessage 属性的值,用于验证时候不通过如:[ValidUrl(ErrorMessage = "我错了") ]
5、远程调用验证
允许我们调用一个action来验证是否合法,这个调用是自动的,在前台输入完后后自动触发验证,并返回结果
[AcceptVerbs("Get", "Post")]
public async Task<IActionResult> CheckRoleExist([Bind("RoleName")]string roleName)
{
var role = await _roleManager.FindByNameAsync(roleName);
if (role != null) return Json("角色已经存在了");
return Json(true);
}
[AcceptVerbs("Get", "Post")]这个特性很厉害,标注action既能响应get请求也能响应post请求。
以上是一个用于远程验证的action,在model的某一个属性上我们写上下面的特性标签即可
[Remote("CheckRoleExist", "ControllerName", ErrorMessage = "角色已存在")]