(快速参考)

安全

4.0.2

安全

365bet地区或多或少不比Java Servlet安全,但是由于Java虚拟机支持代码的本质,因此Java Servlet及其因此365bet地区极为安全,并且不受常见缓冲区溢出和URL格式错误的影响。

Web安全性问题通常是由于开发人员的幼稚或错误而发生的,365bet地区可以采取一些措施来避免常见错误并使编写安全的应用程序更容易编写

365bet地区自动执行的操作

默认情况下,365bet地区具有一些内置的安全机制

  • 通过所有标准数据库访问域对象会自动转义SQL,以防止SQL注入攻击

  • 默认值脚手架模板HTML显示时会转义所有数据字段

  • 365bet地区链接创建标签链接, 形成, createLink, createLinkTo其他都使用适当的转义机制来防止代码注入

  • 365bet地区提供编解码器当您呈现为HTML JavaScript和URL时,可以让您轻松地转义数据,以防止注入攻击

防范攻击

Hibernate是GORM域类的基础技术,提交到数据库时会自动转义数据,因此这不是问题。但是仍然有可能编写使用未经检查的请求参数的动态HQL代码,例如,执行以下操作容易受到HQL注入攻击

定义 脆弱的() {
    定义图书"从Book as b那里b标题"参数标题"'")
}

或使用GString的类似调用

定义 脆弱的() {
    定义图书"从Book as b那里b标题${参数标题}'")
}

定义 安全() {
    定义图书""参数标题

要么

定义 安全() {
    定义图书"",
                          [标题参数标题

网络钓鱼

在避免劫持您的品牌和与客户的已声明的交流政策方面,这确实是一个公共关系问题。客户需要知道如何识别有效的电子邮件

XSS跨站点脚本注入

重要的是,您的应用程序应尽可能多地验证传入的请求是从您的应用程序而不是从另一个站点发出的确保人们不能恶意将JavaScript或其他HTML注入他人查看的数据或标签中

365bet地区及更高版本特别支持对放置在GSP页面中的自动编码数据的支持,请参阅以下文档:跨站点脚本XSS防护了解更多信息

您还必须避免使用请求参数或数据字段来确定将用户重定向到的下一个URL。successURL参数,例如,确定成功登录后将用户重定向到的位置,攻击者可以使用您自己的站点来模仿您的登录过程,然后在登录后将用户重定向回自己的站点,从而可能允许JavaScript代码然后利用网站

跨站请求伪造

CSRF涉及从某个网站信任的用户那里发送未经授权的命令。一个典型的例子是另一个网站,如果该用户仍通过身份验证,则该网站会嵌入链接以对您的网站执行操作

降低针对此类攻击的风险的最佳方法是使用失落的县表单上的属性请参阅处理重复的表格提交有关如何使用它的更多信息另一个措施是不使用记住我的cookie

HTML URL注入

这是提供错误数据的地方,以便以后将其用于在页面中创建链接时,单击它不会导致预期的行为,并且可能重定向到另一个站点或更改请求参数

HTML URL注入可以通过编解码器365bet地区提供的标签库和365bet地区提供的标签库全部使用encodeAsURL如果需要,如果您创建自己的生成URL的标记,则也需要注意这一点

拒绝服务

负载平衡器和其他设备在这里可能更有用,但是还有一些与过多查询有关的问题,例如,攻击者创建了一个链接来设置结果集的最大值,从而使查询可能超出以下限制:服务器或降低系统速度此处的解决方案是始终清除请求参数,然后再将其传递给动态查找器或其他GORM查询方法

整型限制100
定义safeMax数学最小参数最大值到整数限制结果的局限性
返回 清单最大值safeMax

可猜测的ID

许多应用程序使用URL的最后部分作为某些对象的ID,以便从GORM或其他地方检索。特别是在GORM的情况下,由于它们通常是顺序整数,因此很容易猜到

因此,您必须断言在将响应返回给用户之前,允许请求用户查看具有请求ID的对象。

不这样做是由于模糊性导致的安全性,就像拥有默认密码letmein一样,不可避免地会破坏安全性

您必须假设每个不受保护的URL都可以通过一种或另一种方式公开访问

跨站点脚本XSS预防

跨站点脚本XSS攻击是Web应用程序的常见攻击媒介,它们通常涉及以某种形式提交HTML或Javascript代码,这样,当显示该代码时,浏览器就会变得有些讨厌,就像弹出一个警告框一样简单,或者更糟糕的是,例如可以访问其他用户的会话cookie

解决方案是在页面中显示所有不受信任的用户输入时将其转义。例如

'

标签的强制编码

如果标签指定的默认编码与您的要求不同,则可以通过传递可选的encodeAs属性来强制对任何标签进行编码

<G讯息码"富吧"encodeAs"的JavaScript" />

所有输出的默认编码

新应用程序的默认配置适用于大多数情况,并且可以与现有插件和标记库向后兼容。但是,您还可以通过配置365bet地区在响应结束时始终对所有输出进行编码来使您的应用程序更加安全。filterCodecForContentType在配置应用程序:

grails视图gspfilteringCodecForContentType'文字HTML' = 'html'

请注意,如果激活静态零件编解码器通常需要设置为生的这样就不会对静态标记进行编码

编解码器表达'html' 转义里面的值脚本'html' 转义GSP中scriptlet的输出标签库'没有' 转义taglibs的输出静态零件'生的' 转义静态模板零件的输出
    }

编码和解码对象

365bet地区支持动态编码解码方法的概念365bet地区捆绑了一组标准编解码器365bet地区还支持一种简单的机制,供开发人员贡献自己的编解码器,这些编解码器将在运行时识别

编解码器类

365bet地区编解码器类可以包含一个编码闭包和/或一个解码闭包,当365bet地区应用程序启动时,365bet地区框架会从其中动态加载编解码器。365bet地区应用程序实用程序目录

框架看起来像365bet地区应用程序实用程序用于以约定结尾的类名HTMLCodec.

如果编解码器包含编码关闭365bet地区将创建动态编码方法并将该方法添加到宾语类,其名称代表定义了编码闭包的编解码器,例如HTMLCodec类定义一个编码关闭,因此365bet地区将其附加名称encodeAsHTML.

HTMLCodecURLCodec关闭,因此365bet地区会将名称附加解码HTML解码网址动态编解码器方法可以分别从365bet地区应用程序中的任何地方调用。例如,考虑一种情况,即报表包含一个名为description的属性,该属性可能包含必须转义才能在HTML文档中显示的特殊字符。 GSP将使用动态编码方法对description属性进行编码,如下所示

$报告描述encodeAsHTML

解码使用值解码HTML句法

静态编译代码的编码器和解码器接口

使用编解码器的首选方法是使用codecLookup bean来获取编码器解码器实例

组织grails编码器上市 接口编解码器查找上市 编码器上市解码器查找编解码器名称

使用示例编码器接口

 

 编解码器编解码器定义myTag地图attrs主体输出编解码器Lookup lookupEncoder'的HTML'编码属性

HTMLCodec

此编解码器执行HTML转义和转义,以便可以在HTML页面中安全地呈现值,而无需创建任何HTML标签或损坏页面布局。例如,给定一个值,您不知道您将无法在HTML中安全地显示此值。页面,因为它将看起来像它关闭了一个标签,如果您在诸如输入字段的value属性之类的属性中呈现此数据,则这特别糟糕

使用例

"""${评论消息encodeAsHTML}"/>
请注意,HTML编码不会重新编码单引号,因此您必须在属性值上使用双引号,以避免带有撇号的文本影响您的页面

HTMLCodec默认为在365bet地区版本中转义传统HTMLCodec实现的HTML样式,在此之前转义非ascii字符

您可以通过在以下位置设置此配置属性来使用纯XML转义而不是HTML转义应用程序:

格里尔的观点疾驰鹰派''

XML编解码器

此编解码器执行XML转义和反转义。它转义不间断空格u行分隔符u和段落分隔符u

HTMLJSCodec

此编解码器执行HTML和JS编码,用于防止某些DOM XSS漏洞,请参阅基于OWASP DOM的XSS预防备忘单有关防止基于DOM的XSS攻击的指南

URLCodec

在链接或表单操作中创建URL或使用数据创建URL的任何时间都需要URL编码。它可以防止非法字符进入URL并更改其含义,例如Apple Blackberry不能作为URL中的参数正常工作GET请求作为“&”号将破坏参数解析

使用例

"mycontroller查找searchKey${lastSearch encodeAsURL}"重复上一次搜索/一种

基本编解码器

执行基本编码解码功能用法示例

您的注册码: $用户注册代码encodeAsBase

JavaScript编解码器

转义字符串,以便将它们用作有效的JavaScript字符串,例如

元件更新'elementId',
    '呈现模板通用消息encodeAsJavaScript')

十六进制编解码器

将字节数组或整数列表编码为小写的十六进制字符串,并且可以将十六进制字符串解码为字节数组

已选颜色: #${[255,127,255encodeAsHex

MD编解码器

使用MD算法在默认系统编码中以小写十六进制字符串的形式提取字节数组或整数列表或字符串的字节。

您的API: $用户uniqueID encodeAsMD

MD字节编解码器

使用MD算法以默认系统编码形式将字节数组或整数列表或字符串的字节作为字节数组进行摘要

字节[]password哈希参数password encodeAsMD字节

SHA编解码器

使用SHA算法在默认系统编码中以小写十六进制字符串的形式提取字节数组或整数列表或字符串的字节。

您的API: $用户uniqueID encodeAsSHA

SHA字节编解码器

使用SHA算法以默认的系统编码形式将字节数组或整数列表或字符串的字节摘要提取为字节数组

字节[]password哈希参数password encodeAsSHA字节

SHA编解码器

使用SHA算法以默认系统编码的形式将字节数组,整数列表或字符串的字节作为小写的十六进制字符串进行摘要

您的API: $用户uniqueID encodeAsSHA

SHA字节编解码器

使用SHA算法以默认系统编码形式将字节数组或整数列表或字符串的字节作为字节数组进行摘要

字节[]password哈希参数password encodeAsSHA字节

自定义编解码器

应用程序可以定义自己的编解码器,365bet地区会将它们与标准编解码器一起加载。必须在自定义编解码器类中定义365bet地区应用程序实用程序目录和类名必须以结尾编解码器可能包含静态的 编码关闭静态的 闭包或两者都闭包必须接受一个参数,该参数将是在例如上调用动态方法的对象

 猪拉丁编解码器 {
  静态的编码str将字符串转换为猪拉丁语并返回结果
  }
}

使用上述编解码器后,应用程序可以执行以下操作

姓氏编码Rs PigLatin

认证方式

365bet地区365bet地区没有默认的身份验证机制,因为可以通过许多不同的方式实现身份验证。但是,使用以下方法实现简单的身份验证机制很容易拦截器这对于简单的用例就足够了,但是最好使用已建立的安全框架,例如通过使用春季安全或者插入

拦截器使您可以在所有控制器或URI空间上应用身份验证。例如,您可以在名为的类中创建一组新的过滤器grails应用程序控制器SecurityInterceptor groovy通过运行

grails创建拦截器安全性

并在那里实施拦截逻辑

 安全拦截器安全拦截器匹配控制者:'', 行动:'登录')
    }

    布尔值之前如果会话用户actionName"登录"重新导向控制者: "", 行动: "登录")
            返回 
        }
        返回 
    }

}

拦截器在这里拦截执行之前除了所有动作登录被执行,如果会话中没有用户,则重定向到登录行动

登录动作本身也很简单

定义 登录() {
    如果请求得到返回 呈现登录视图
    }

    定义u用户findByLogin参数登录如果如果u密码参数密码会话用户u重定向行动: "")
        }
        其他渲染视图: "登录", 模型: [信息: "密码错误"])
        }
    }
    其他渲染视图: "登录", 模型: [信息: "找不到使用者"])
    }
}

安全插件

如果您需要除简单身份验证之外的其他高级功能(例如授权角色等),则应考虑使用spring安全核心插件

春季安全

Spring Security插件基于春季安全365bet地区该项目提供了一个灵活的可扩展框架,用于构建各种身份验证和授权方案。这些插件是模块化的,因此您可以仅安装应用程序所需的功能。Spring Security插件是365bet地区的官方安全插件,并得到积极维护和支持

有一个核心插件它支持基于表单的身份验证,加密的加盐密码,HTTP基本身份验证等,并且依赖于次级的插件提供了替代功能,例如ACL支持, Jasig CAS单一登录, LDAP验证, Kerberos身份验证和一个插件提供用户界面扩展和安全工作流程

看到核心插件页面有关基本信息和用户指南有关详细信息