MVC框架安全

MVC是Model-View-Controller的缩写,它将Web应用分成三层,View层负责用户视图、页面展示等工作;Controller层负责应用的逻辑实现,接收View层传入的用户请求,并转发给对应的Model做处理;Model层则负责实现模型,完成数据的处理。

一些主要的Web安全威胁,如XSS、CSRF、SQL注入、访问控制、认证、URL跳转等不涉及业务逻辑的安全问题,都可以集中放在MVC框架中解决。

模板引擎与XSS防御

在View层,可以解决XSS问题。

在当前流行的MVC框架中,View层最常用的技术是使用模板引擎对页面进行渲染,模板引擎本身可能会提供一些编码方法。

Web框架与CSRF防御

完整的CSRF防御方案,对于Web框架来说有以下几处地方需要改动:

  1. 在Session中绑定token。如果不能保存到服务器端Session中,则可以替换为保存到Cookie里。
  2. 在form表单中自动填入token字段,比如<input type=hidden name="anti_csrf_token" value="$token" />
  3. 在Ajax请求中自动添加token,这可能需要已有的Ajax封装实现的支持。
  4. 在服务器端对比POST提交参数的token与Session中绑定的token是否一致,以验证CSRF攻击。

在Spring MVC以及一些其他的流行Web框架中,并没有直接提供针对CSRF的保护,因此这些功能需要自己实现。

HTTP Header管理

在Web框架中,可以对HTTP头进行全局化的处理,因此一些基于HTTP头的安全方案可以很好地实施。

在框架中实现安全方案的好处就是不用担心会有遗漏。

数据持久层与SQL注入

使用ORM( Object/ Relation Mapping) 框架对SQL注入是有积极意义的。

比如,使用ibatis时只需要搜索所有的sqlmap文件中是否包含动态变量,把他们替换成静态变量即可。

在Django中,Django提供的Database API默认已经给将所有输入进行了SQL转义。

此外,使用Web框架提供的功能,在代码风格上更加统一,也更利于代码审计。

设计Web框架安全的注意事项

  1. 先建立威胁模型,然后再判断哪些威胁是可以在框架中得到解决的。
  2. 保存好安全检查的日志。比如发生XSS攻击时,可以记录下攻击者的IP、时间、UserAgent、目标URL、用户名等信息。这些日志,对于后期建立攻击事件分析、入侵分析都是有积极意义的。
  3. 与时俱进。当新的威胁出现时,应当及时完成对应的防御方案。而一些0day漏洞,也有可能通过“虚拟补丁”的方式在框架层面解决。

Web框架自身安全

开发框架由于其本身的特殊性,一般网站出于稳定的考虑不会对这个基础设施频繁升级,因此开发框架的漏洞可能不会得到及时的修补,但由此引发的后果却会很严重。