源栈培训:ASP.NET MVC-5:注入和欺骗

更多
2019年08月04日 22点15分 作者:叶飞 修改

病从口入:小心用户输入


Script注入(XSS)

我有一个idea:在我发布的内容里面写上一段JavaScript代码……

演示:略

  • MVC:抛异常,需要[AllowHtml]和@Html.Raw()
  • RazorPage:已编码,需要@Html.Raw()

为什么需要@Html.Raw()?富文本编辑(如:ueditor)和CSS样式。

后台如何过滤?两种策略:

  • 白名单:只允许使用白名单中的标签,推荐!
  • 黑名单:禁止黑名单中出现的标签

工具:正则匹配

  • Regex.Replace
  • Regex.Match


CSRF


Cross-Site Request Forgery:跨站点请求伪造

防御的核心在于除了用户的验证cookie以外,还要生成一个token,以确保链接/表单确实为服务器端生成。

如何生成token?

  • 生成一个随机数
  • 从用户密码中生成
  • ……

实现:

  • 操作类尽量使用Post(仅查询类使用Get)
  • 前台,Layout中传入,使用JavaScript附加
  • 后台,使用Filter进行封装。

和钓鱼网站的区别

MVC内置反欺骗(仅用于form表单)

在form表单中添加:

    @Html.AntiForgeryToken()

生成一个hiden input,记录了一个token。

MVC同时会向前台发送一个cookie,记录

在Action上标注

[ValidateAntiForgeryToken]
就可以通过验证 hiden input 和 cookie是否匹配,检验form表单是否为MVC自己生成的。



作业

使用富文本编辑器发布文章,确保发布的文章能够显示:段落(<p>)、加粗(<strong>)、斜体(<i>)、链接(<a>)的效果

在后台进行过滤,保证无法利用上述发布文章的功能进行脚本注入

完成点赞和踩的功能:

  1. 文章显示赞/踩的总数

  2. 同一篇文章一个用户只能赞或踩一次
  3. 自己不能赞/踩自己的文章

注意防止恶意用户进行CSRF骗赞骗踩。

使用@Html.AntiForgeryToken()和[ValidateAntiForgeryToken]保护帮帮币交易不被CSRF欺骗


作业点评

  • 不应该根据title取文章,应该在SaveChange()后获得Id并使用
  • Controller里直接使用return Redirect(),不要去new RedirectResult()
  • 仔细考虑是否使用int? id
  • 最好还是主动释放DbContext(using(){})
  • 直接使用new SelectList()将IEnumerable转换成SelectList
  • Server.MapPath()???
  • FixTag之类使用复杂正则表达式的,一定要写单元测试
  • ValidationSummary()
  • @Html.AntiForgeryToken()
  • JavaScript句尾加分号分隔
  • @Html.ActionLink() vs @Html.Action()
  • web.config中的connectionStrings
  • 注意不要提交无关的内容到版本管理仓库

作业点评

  • 用作key值的字符串最好用const或者readonly static
  • 命名不要随意
  • 数据库连接字符串
  • 使用GLB项目生成MessageHtmlTemplate
  • /SuggestHTML/Suggest  => /Suggest(/List/Index/All)





源栈培训 ASP.NET 安全 注入
赞: 201 踩: 2

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
评论 / 0

ASP.NET


RazorPage

微软推荐的、最新的、基于Razor页面和.NET core的新一代Web项目开发技术,包括Razor Tag Helper、Model绑定和Validation、Session/Cookie、内置依赖注入等……

MVC

过去两年间最流行的、基于.NET Framework和MVC模式的ASP.NET MVC框架,主要用于讲解安全、性能、架构和各种实战功能演示……

其他Web项目

包括WebForm和WebApi

全部
关键字



帮助

反馈