[笔记]《白帽子讲Web安全》- Web框架安全

一、MVC框架安全

        从数据的流入来看,用户提交的数据先后流经了View层、Controller、Model层,数据流出则反过来。在设计安全方案时,要牢牢把握住数据这个关键因素。

        比如在Spring Security中,通过URL pattern实现的访问控制,需要由框架来处理所有用户请求,在Spring Security获取了URL handler基础上,才有可能将后去的安全检查落实。在Spring Security的配置中,第一步就是在web.xml文件中增加一个filter,接管用户数据。

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

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

二、模板引擎与XSS防御

        在View层,可以解决XSS问题。XSS攻击是在用户的浏览器上执行的,其形成过程则是在服务器端页面渲染时,注入了恶意的HTML代码导致的。从MVC架构来说,是发生在View层,因此使用“输出编码”的防御方法更加合理,这意味着需要针对不同上下文的XSS攻击场景,使用不同的编码方式。

三、Web框架与CSRF防御

        在Web框架中可以使用security token解决CSRF攻击的问题。

        CSRF攻击的目标,一般都会产生“写数据”操作的URL,因为在CSRF的攻击过程中攻击者无法获取到服务器端返回的数据,攻击者只是借用户之手触发服务器的动作,所以读数据对于CSRF来说无直接的意义(但是如果同时存在XSS漏洞或者其他的跨域漏洞,则可能会引起别的问题,在这里,仅仅就CSRF对抗本身进行讨论)。

        在Web应用开发中,有必要对“读操作”和“写操作”予以区分,比如要求所有的“写操作”都使用HTTP POST。

        实际上POST本身并不足以对抗CSRF,因为POST也是可以自动提交的。但是POST的使用,对于保护token有着积极的意义,二security token的私密性(不可预测性原则),是防御CSRF攻击的基础。

        对于Web框架来说,可以自动地在所有涉及POST的代码中添加token,这些地方包括所有的form表单、所有的Ajax POST请求等。

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

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

四、HTTP Headers管理

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

        比如针对HTTP返回头的CRLF注入。

        类似的,针对30X返回好的HTTP Response,浏览器将会跳转到Location指定的URL,攻击者往往利用此类功能实施钓鱼或诈骗。

HTTP/1.1 302 Moved Temporarily
(...)
Location: http://www.phishing.tld

        对于框架来说,管理好跳转地址是很有必要的。一般来说,可以在两个地方这件事情:

  • 如果Web框架中提供统一的跳转函数,则可以在跳转函数内部实现一个白名单,指定跳转地址只能在白名单中;
  • 另一种解决方式是控制HTTP的Location字段,限制Location的值只能是哪些地址,也能起到同样的效果。

五、数据持久层与SQL注入

        使用ORM(Object/Relation Mapping)框架对SQL注入是有积极意义的。对抗SQL注入的最佳方式就是使用“预编译绑定变量”。

六、还能想到什么

        凡是在 Web 框架中可能实现的安全方案,只要对性能没有太大的损耗,都应该考虑实施。

        Spring Security 为 Spring MVC 的用户提供了许多安全功能,比如基于 URL 的访问控制、加密方法、证书支持、OpenID 支持等。

原文地址:https://www.cnblogs.com/SyMind/p/8376881.html