要想人前显贵,您必定人后受罪。——《霸王别姬》
- 笔者个人理解:web框架是Web应用的内部框架
- web服务器>web中间件>web容器
- web应用运行在web容器上
- web框架就像web应用的一件衣服
MVC框架安全
- 一些主要的web安全威胁,例如XSS、CSRF、SQL注入、访问控制、认证、URL跳转等不涉及业务逻辑的安全问题,都可以集中放在MVC框架中解决
- 有些问题如果可以在框架中统一解决,会大大节约程序员的工作量
- 在每个业务中修补漏洞,补丁的标准难以统一,在框架中集中实施安全方案,可以让所有业务受益
何为MVC
- View:负责用户视图、页面展示等工作
- Controller:负责web应用的逻辑实现,接收View层传入的用户请求,并转发给对应的Model做处理
- Model:负责实现模型,完成数据处理
数据流入:View->Controller->Model
数据流出:Model->Controller->View
模版引擎和XSS防御
- XSS是发生在View层,对比“输入检查”和“输出编码”2种方法,输入检查是在controller层,输出编码是在view层,所以“输出编码”更加科学
- View通常用的技术是使用模版引擎,对页面进行渲染。例如:Django是用来Django Templates
- 我们需要做的是,根据变量插入的不同地点,采用不同的编码方式,并用web框架来实现这一过程
Web框架与CSRF防御
- web框架可以使用security token来解决CSRF攻击的问题
- 尽量使用POST请求来抵御CSRF的攻击,因为POST可以保护token
完整的CSRF防御方案
- 在Session中绑定token,如果不能保存在服务器端的session,就保存在cookie中
- 在form表单中自动填入token字段,比如
<input type=hidden name="anti_csrf_token" value="$token"/>
- 在Ajax请求中自动添加token,这需要已有的Ajax封装实现的支持
- 在服务器端对比POST提交参数的token与Session中绑定的token是否一致
HTTP Headers管理
- 针对CRLF注入攻击,可以把http头堪称许多key-value,然后在value中编码所有的\r\n即可,但key是绝对不能让用户控制的
- 可以在web框架中统一配置
X-Frame-Options:SAMEORIGIN
,用以对抗点击劫持 - 一般来说,框架会提供一个统一的设置cookie的函数,httponly的功能可以在此函数中实现,如果没有这样的函数,就要在HTTP返回头中配置实现
对于30X返回号的HTTP Response,浏览器会跳转到Location指定的URL,hacker往往借此实施钓鱼或诈骗,应对措施:
- 如果web框架中有统一的跳转函数,则可以在跳转函数内部实现一个白名单,指定跳转地址只能在白名单中
- 另一种解决方式,控制http的location字段,限制location的值只能是哪些地址,本质也是白名单
数据持久层与SQL注入
- 应对sql注入最有效的方法是“预编译绑定变量”,但实际情况中,代码数量很庞大,很难把所有可能发生sql注入的地方都找到,怎么办呢?
- 以ORM(Object/Relation Mapping)框架ibatis举例,它是基于sqlmap的,生成的sql结构化地写在XML文件中。ibatis支持动态sql,如果用户可以控制动态变量
$value$
,就有可能发生sql注入,但所有的静态变量#value#
都是没有威胁的。所以在使用ibatis、检查sql注入的时候,只需要检查所有的sqlmap文件是否包含动态变量即可。如果一定要用到动态变量,可以在上层代码中针对这一变量进行比较严格的控制,以保证不会发生注入问题
其他的防御措施
- web框架如果可以提供一个足够安全的存储空间,来存储上传的文件,就可以有效防御文件上传漏洞
- Sping Security为Sping MVC的用户提供了很多安全功能,比如基于URL的访问控制等
- 在设计整体安全方案时,比较科学的方法是,先建立威胁模型,然后在判断哪些威胁是可以在框架中解决的
- 在设计web框架安全解决方案时,还要保存好安全检查的日志,做很多分析都需要参考日志的记录(入侵者的IP、时间、UserAgent等),但开启日志势必会造成性能损失,要妥善使用
web框架自身安全
- web框架自身也会有漏洞,要及时更新
- Struts2、Spring MVC、Django都出现过命令执行漏洞
本文作者:
Bano
本文链接: https://bano247.com/2021/11/07/Web框架安全/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
本文链接: https://bano247.com/2021/11/07/Web框架安全/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!