Web 框架安全

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个字符(<→&lt,>→&gt,’→&#39,”→&quot,&→&amp)。关闭 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

(0)
上一篇 2023年9月16日 01:44
下一篇 2023年9月16日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

优速盾注册领取大礼包www.cdnb.net
/sitemap.xml