zoukankan      html  css  js  c++  java
  • 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 框架安全解决方案的时候,还要保存好安全检查日志,以便追溯分析。

    框架要与时俱进,及时修复自身或依赖项存在的漏洞或缺陷。

     

  • 相关阅读:
    安装pip-9.0.1-py2.py3-none-any.whl
    Flask-Moment本地化日期和时间
    在windows下使用VirtualEnv建立flask项目
    java web中Jdbc访问数据库步骤通俗解释(吃饭),与MVC的通俗解释(做饭)
    java web中cookie的永久创建与撤销
    myeclipse与数据库进行连接(无需写代码进行验证)
    求二维数组最大子数组和
    Java代码实现 增删查 + 分页——实习第四天
    JDBC 数据库连接操作——实习第三天
    Java基础语法实例(2)——实习第二天
  • 原文地址:https://www.cnblogs.com/shilxfly/p/6861481.html
Copyright © 2011-2022 走看看