Web 应用开发框架,统一设计,便于安全防控。
常用 Web 框架:MVC —— Model(数据处理)-View(与用户交互)-Controller(控制应用逻辑),例如 Spring
不同层级对应的 Web 安全
View 视图层:XSS
Controller 控制层:CSRF、访问控制、认证、URL 跳转
Model 模型层:SQL 注入
模板引擎与 XSS 防御
XSS 防御中,输出编码的控制体现在 “HTML 标签”、“HTML 属性”、“script 标签”、“事件”、“CSS”、“URL” 中输出变量。在不同的场景使用不同的编码方式是有效防御的重要原则。当前流行的 MVC 框架对这方面的支持比较薄弱。
Django 中使用 Django Templetes 作为模板引擎。引擎本身提供一些编码方法:filters 中的 escape 是 HtmlEncode 的方法,例如 <h1>Hello, {{ name|escape }}!</h1>。默认情况下 Django 开启了 auto-escape,即所有变量都会经过 HtmlEncode 后输出。其中编码了 5个字符(<→<,>→>,’→',”→",&→&)。关闭 auto-escape 的方法:{{ parameter|safe }},或 {% autoescape off %}Hello {{ name }}{% endautoescape %}。可以自定义 filter,完善编码功能。
Velocity 模板引擎,默认没有开启 HtmlEncode,需要通过 Event Handler 进行 Html 编码。“宏” 定义可以完善编码功能(XML 编码输出:#SXML($xml),JS 编码输出:#SJS($js))。
eventhandler.referenceinsertion.class = org.apache.velocty.app.event.implement.EscapeHtmlReference
eventhandler.escape.html.match = /msg.*/
———————————————— 例子 ————————————————————-
…
import org.apache.velocity.app.event.EventCartridge;
import org.apache.velocity.app.event.ReferenceInsertionEventHandler;
import org.apache.velocity.app.event.implement.EscapeHtmlReference;
import org.apache.velocity.app.event.implement.EscapeSqlReference;
…
public class test {
public void myTest() {
…
EvnetCartridge ec = new EventCartridge();
ec.addEventHandler(new EscapeHtmlReference());
ec.addEventHandler(new EscapeSqlReference());
ec.attachToContext( context );
…
—————————————————————————————————————-
Web 框架防御 CSRF
security token 是防御 CSRF 攻击的有效方法。对于 Web 框架,可以自动地在所有涉及 POST 的代码中添加 token(所有 form 表单、Ajax POST 请求等)。
(1)在 Session 中绑定 token。如果不能保存到服务器端的 Session 中,则保存到 Cookie 里。
(2)在 form 表单中自动填入 token 字段,例如 <input type=hidden name “anti_csrf_token” value=”$token”/>。
(3)在 Ajax 请求中自动添加 token。
(4)在服务器端对比 POST 提交参数的 token 与 Session 中绑定的 token 是否一致。
在 Rails 框架中实现该功能只需要在 Application Controller 中添加:
protect_from_forgery :secret => “12345678901234567890…”
它将根据 secret 和服务器端的随机因子自动生成 token,并自动添加到所有的 form 和由 Rails 生成的 Ajax 请求中。
在 Django 框架中,首先将 django.middleware.CsrfViewMiddleware 添加到 MIDDLEWARE_CLASSES 中。然后在 form 表单的模板中添加 token:
<form action=”.” method=”post”>{% csrf_token %}
最后在 View 层的函数中使用 django.core.context_processors.csrf
from django.core.context_processors import csrf
from django.shortcuts import render_to_response
def my_view(request):
c = {}
c.update(csrf(request))
…
return render_to_response(“a_template.html”, c)
在 Ajax 请求中,一般插入一个包含了 token 的 HTTP 头(防止 token 泄密)。
HTTP Headers 管理
Web 框架中可以对 HTTP 头进行全局化的处理,便于实施一些基于 HTTP 头的安全方案。
例如防御 CRLF 攻击,返回号为 30X 的页面跳转 Location 管理,X-Frame-Options 属性配置,Cookie 的 HttpOnly 标签设置等。
数据持久层与 SQL 注入
使用 ORM(Object/Relation Mapping)框架防御 SQL 注入。例如 ibatis,基于 sqlmap,将 SQL 语句结构化地写入 XML 文件。其中 #value# 为安全的静态变量,而 $value$ 为需要严格控制的动态变量。
在 Django 框架中,Database API 默认将所有输入进行了 SQL 转义。
框架设计的一些安全建议
凡是在 Web 框架中可能实现的安全方案,只要针对性能没有太大的损耗,都应该考虑实施。
在设计整体安全方案时,首先建立威胁模型,然后再判断哪些威胁可以在框架中得到解决。
在设计 Web 框架安全解决方案的时候,还要保存好安全检查日志,以便追溯分析。
框架要与时俱进,及时修复自身或依赖项存在的漏洞或缺陷。
原文链接:https://www.cnblogs.com/shilxfly/p/6861481.html
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/18629