- 浏览: 5166610 次
- 性别:
- 来自: 天津
博客专栏
-
实战 Groovy
浏览量:29350
文章分类
- 全部博客 (639)
- 代码之谜 (6)
- JavaScript quirks (5)
- 程序员 (92)
- Java (93)
- BT编程 (7)
- html/css (64)
- Groovy&Grails (42)
- Android (20)
- C/C++ (5)
- PHP/Perl/Python (46)
- 经典文章 (51)
- CodeIgniter (14)
- JQuery (10)
- 笑话 (4)
- 其他 (32)
- javascript (69)
- 云计算 (0)
- html5 (7)
- 面试 (8)
- google (3)
- nosql (2)
- nodejs (11)
- go (5)
- erlang (1)
- 小常识 (3)
- 冷知识 (5)
- database (4)
- web (12)
- 架构 (12)
- Exception (0)
最新评论
-
jqw1992:
https://www.chromefor.com/libra ...
[福利] 开发者必备的 Chrome 插件——ChromeSnifferPlus -
litjerk:
初步算了一下,目前最最精简的Win98版是5M,他5个小时多敲 ...
让人目瞪口呆的三位世界级电脑大师 -
379855529:
。。似乎重点没说NIO啊,前面基础只是铺垫的很好的,可是我要的 ...
Java NIO与IO的详细区别(通俗篇) -
springmvc_springjpa:
spring mvc demo教程源代码下载,地址:http: ...
一步步开发 Spring MVC 应用 -
匡建武:
Good
四个程序员的一天
安全性
Grails差不多和Java Servlets一样可靠。然而由于JVM运行代码的特性,Java servlets对一般的缓冲区溢出和恶意URL使用是极为安全和免疫的。
Web安全问题通常由于开发人员的无知过错造成的,Grails提供了一些帮助,可以避免常出现的错误,使安全应用更加容易编写。
Grails可以自动做什么
Grails拥有一些默认的内置安全机制
- 所有通过GORM域对象访问标准数据库可以自动避免SQL语句以防止SQL注入攻击。
- 默认scaffolding模板HTML文件当打开时所有数据域不显示。
- 所有Grails的链接创建标签(link, form, createLink, createLinkTo 等)都使用适当的转义机制以防止代码注入。
- Grails提供codecs,运行你在显示HTML,JavaScript和URLs时,转义数据以避免在数据里注入攻击。
11.1 防止攻击
SQL注入
Hibernate是实现GORM域类的基础技术,当提交数据库时会自动转义数据,所以这个没什么问题。然而编写使用未检查的请求参数的脏动态HQL代码,仍然会有问题可能存在。比如如下的这种做法就很容易受HQL注入攻击:
def vulnerable = { def books = Book.find("from Book as b where b.title ='" + params.title + "'") }
千万别这样做。假如你想传递参数,用命名参数和定位参数代替:
def safe = {
def books = Book.find("from Book as b where b.title =?", [params.title])
}
钓鱼式攻击
这是一个公关关系问题,涉及到避免你的品牌化过程和与顾客设定的沟通手段遭到黑客攻击。顾客需要知道怎么确认收到的emails是真的。
XSS-跨站脚本攻击
你的应用要尽可能多得检验进来的请求是从你的应用里发出的,而不是其它网站。标签和页面流系统能做到这点,Grails对Spring Web Flow的支持也默认包含了这个安全特性。
确保所有呈现到视图的数据值都被转义过也是非常重要的。例如当呈现HTML文件或XHTML文件时,你必须对每个对象调用encodeAsHTML,以便保证用户不会向其他人读取的数据和标签恶意注入JavaScript代码或其他HTML代码。Grails为此目的提供了若干个动态编码方法,因此假如你的输出转义格式没有现成的,你可以很容易得编写自己的编码器。
你也必须避免使用请求参数和数据域来决定用户转向的下一个链接。假如你使用一个successURL参数,在你成功登入之后,用来指示用户的转向;这时攻击者可以通过你的网站模拟登入程序,然后一旦登入就把用户转向到他们的网站,这样就潜在允许JS代码使用该网站的登入帐号。
HTML/URL注入
HTML和URL注入提供有害的数据,之后被用来在页面生成一个链接,点击它不会产生期望的行为,可能会转向另外一个网站或更改请求参数。
Grails提供的codecs可以很容易得处理HTML/URL注入,Grails提供的标签库在适用的地方全都使用encodeAsURL。如果你自己创建能生成链接的标签,你在做的时候要小心。
拒绝服务DoS
负载均衡器和其他应用在这里可能会起到用处,但是还存在其他问题,比如过度查询,攻击者创建一个链接设置结果集的最大值,导致一个查询超过服务器的最大内存限制或拖慢系统运行。解决办法是在请求参数传进动态遍历器或其他GORM查询方法之前,给这些请求参数“消毒”:
def safeMax = Math.max(params.max?.toInteger(), 100) // never let more than 100 results be returned return Book.list(max:safeMax)
可推测ID号
许多应用把URL的最后一部分当作从GORM或者其他地方获取的某个对象的id。特别是当发生在GORM中时,这些id号是很容易猜测的,因为这些id号通常是一串数字。
因此你必须假定请求用户在请求返回时用请求id号可以看见相对应的对象。
不这样做是隐藏式安全,这样做毫无疑问是非法的,像有letmein的默认密码等等这些情况。
你必须假设每个未受保护URL都可以公共访问。
11.2 编码和解码对象
Grails支持动态编码/解码方法概念。Grails捆绑了一些标准的编解码器,Grails也为开发人员提供了一个贡献自己编解码器的简单机制,这些编解码器在运行时可以被识别。
编解码器类
一个Grails编解码器是个包含一个编码闭包,一个解码闭包或两者皆有。当一个Grails应用启用了,Grails框架会动态从grails-app/utils/目录加载
编解码器。
Grails框架将在
grails-app/utils/目录下查找以Codec结尾命名的类名。例如Grails捆绑的其中一个标准编解码器就是HTMLCodec。
假如一个编解码器包含一个encode属性,该属性被赋予一个代码块,Grails会创建一个动态的encode方法,并把该方法添加到Object类,方法名表示了定义
encode闭包的编解码器。
例如,HTMLCodec类定义了一个编码器代码块,因此Grails会把该闭包与名为encodeAsHTML的Object类相关联。
HTMLCodec类和URLCodec类也定义了解码块,所以Grails会把这些闭包与decodeHTML和decodeURL相关联的。动态编解码器能在Grails应用的任何一个地方执行。例如,考虑一下这种情况,一个报告文件含有一个叫description的属性,
该属性包含了需要被转义显示在HTML文档的特殊字符。GSP文档里,一种处理方法就是用如下的动态编码器编码description属性:
${report.description.encodeAsHTML()}
执行解码使用value.decodeHTML()语句。
标准的编解码器
HTMLCodec
该编解码器执行HTML转义过程和反转义过程,
所以你提供的数值在没有创建任何HTML标签或破坏页面布局下可以被安全得显示出来。例如,给个"Don't
you know that 2 >
1?"字符串,你就不能在HTML页面中安全得显示出来,因为大于符号>看起来像要关闭一个标签,特别是你在某个属性内显示这个字符串,情况会更糟糕,像输入框的value属性。
使用例子如下:
<input name="comment.message" value="${comment.message.encodeAsHTML()}"/>
注意HTML编码不会重新编码单引号或双引号,你必须对属性值只用两个重复引号避免含有引号的正文毁坏你的页面。
URLCodec
当在生成跳转链接,形体处理(form actions)链接,或者任何时候需要数据生成链接时,URL编码是必需的。URL编码可以阻止非法字符串进入链接改变它跳转的目的地,例如"Apple & Blackberry"不能作为get请求中的一个参数,因为&符号为破坏参数解析过程。
使用例子如下:
<a href="/mycontroller/find?searchKey=${lastSearch.encodeAsURL()}">Repeat last search</a>
Base64Codec
执行Base64编码/解码函数,使用例子如下:
Your registration code is: ${user.registrationCode.encodeAsBase64()}
JavaScriptCodec
JavaScriptCodec会转义字符串成为合法的JavaScript字符串,使用例子如下:
Element.update('${elementId}', '${render(template: "/common/message").encodeAsJavaScript()}')
HexCodec
HexCodec会把字节数组或数字数列编码为小写十六进制字符串,可以把十六进制字符串编码为字节数组,使用例子如下:
Selected colour: #${[255,127,255].encodeAsHex()}
MD5Codec
MD5Codec使用MD5算法摘要字节数组,数字数列或默认系统编码的字符串字节数组,得到一格小写十六进制字符串,使用例子如下:
Your API Key: ${user.uniqueID.encodeAsMD5()}
MD5BytesCodec
MD5BytesCodec使用MD5算法摘要字节数组,数字数列或默认系统编码的字符串字节数组,得到一个字节数组,使用例子如下:
byte[] passwordHash = params.password.encodeAsMD5Bytes()
SHA1Codec
SHA1Codec使用SHA1算法摘要字节数组,数字数列或默认系统编码的字符串字节数组,得到一格小写十六进制字符串,使用例子如下:
Your API Key: ${user.uniqueID.encodeAsSHA1()}
SHA1BytesCodec
SHA1BytesCodec使用SHA1算法摘要字节数组,数字数列或默认系统编码的字符串字节数组,得到一个字节数组,使用例子如下:
byte[] passwordHash = params.password.encodeAsSHA1Bytes()
SHA256Codec
SHA256Codec使用SHA256算法摘要字节数组,数字数列或默认系统编码的字符串字节数组,得到一格小写十六进制字符串,使用例子如下:
Your API Key: ${user.uniqueID.encodeAsSHA256()}
SHA256BytesCodec
SHA256BytesCodec使用SHA1算法摘要字节数组,数字数列或默认系统编码的字符串字节数组,得到一个字节数组,使用例子如下:
byte[] passwordHash = params.password.encodeAsSHA256Bytes()
定制编解码器Custom Codecs
许多应用可能定制属于自己的编解码器,Grails在装载标准编解码器时把它们一起装载。定制编解码器类必须在grails-app/utils/目录下定义,而且类名必须以Codec结尾。定制编解码器可能含有一个静态encode块,一个静态decode块或两者皆有。这些编解码代码块需要一个单一参数,当作动态方法操作对象,如下:
class PigLatinCodec { static encode = { str -> // convert the string to piglatin and return the result } }
在适当的地方,一个应用可以使用上方定义的编解码器做如下的工作:
${lastName.encodeAsPigLatin()}
11.3 认证
尽管现在认证没有默认机制,实际上有上千种方法可以执行认证。然而,用 interceptors 或 filters 实施一个简单的认证机制是没意义的。
过滤器运行你对所有的控制器或URI空间应用认证。比如你可以在grails-app/conf/SecurityFilters.groovy类中创建一组新过滤器如下:
class SecurityFilters { def filters = { loginCheck(controller:'*', action:'*') { before = { if(!session.user && actionName != "login") { redirect(controller:"user",action:"login") return false } }} } }
在请求处理执行之前,上述类中的loginCheck过滤器将拦截该执行动作。假如session里没有一个用户而且请求被执行,该login请求处理不是自己转向到自己。
Login请求处理也是很小的:
def login = { if(request.get) render(view:"login") else { def u = User.findByLogin(params.login) if(u) { if(u.password == params.password) { session.user = u redirect(action:"home") } else { render(view:"login", model:[message:"Password incorrect"]) } } else { render(view:"login", model:[message:"User not found"]) } } }
11.4 安全插件
如果你需要比简单认证更高级的功能,诸如授权(authorization),角色(roles)等,那么你可能要考虑使用一个可用的安全插件。
11.4.1 Acegi
Acegi插件是建立在 Spring Acegi 项目上,该项目为建立各种认证和授权架构提供了一个灵活,易扩展的框架。
Acegi插件需要你在URI和角色之间制定个详细的映射,为规范人,权威专家和请求maps提供一个默认的领域模型domain model。点击documentation on the wiki,查看更多信息。
11.4.2 JSecurity
JSecurity 是另外一个面向Java
POJO的安全框架,它也可以提供一个规范领域,用户,角色和权限的默认领域模型。使用JSecurity,你必须让每个你想保护的controller类继承一个controller基类,然后提供一个建立角色的
accessControl代码块。例子如下:
class ExampleController extends JsecAuthBase { static accessControl = { // All actions require the 'Observer' role. role(name: 'Observer')// The 'edit' action requires the 'Administrator' role. role(name: 'Administrator', action: 'edit')
// Alternatively, several actions can be specified. role(name: 'Administrator', only: [ 'create', 'edit', 'save', 'update' ]) }
… }
更多关于JSecurity的信息,参考JSecurity Quick Start。
发表评论
-
实战 Groovy: 用 Groovy 打造服务器端
2010-07-10 11:07 2721Groovlet 和 GroovyServer P ... -
实战 Groovy: 用 Groovy 生成器作标记
2010-07-10 11:07 2060Groovy 生成器让您能够利用诸如 Swing 这样 ... -
实战 Groovy: for each 剖析
2010-07-10 11:07 18189在这一期的 实战 Groovy 中,Scott Davi ... -
实战 Groovy: 用 Groovy 进行 Ant 脚本编程
2010-07-10 11:07 2059Ant 和 Maven 两者在构建处理工具的世界中占统 ... -
实战 Groovy: 在 Java 应用程序中加一些 Groovy 进来
2010-07-10 11:06 4321您有没有想过在自己相对复杂的 Java 程序中嵌入 G ... -
实战 Groovy: Groovy 的腾飞
2010-07-10 11:06 2182随着 Groovy JSR-1(及其后续发行版本)的发 ... -
实战 Groovy: 用 curry 过的闭包进行函数式编程
2010-07-10 11:06 3250在 Groovy 中处处都是闭包,Groovy 闭包惟 ... -
实战 Groovy: 关于 MOP 和迷你语言
2010-07-10 11:06 2065将耳朵贴到地上仔细听 —— MOP 正在前进!了解一下 ... -
实战 Groovy: 用 Groovy 更迅速地对 Java 代码进行单元测试
2010-07-10 11:06 2302不久以前,developerWor ... -
实战 Groovy: 构建和解析 XML
2010-07-10 11:05 7116通过本文,您将了解 ... -
实战 Groovy: 用 Groovy 进行 JDBC 编程
2010-07-10 11:05 5183这个月,随着 Andrew G ... -
实战 Groovy: 美妙的操作符
2010-07-10 11:05 2284Java™ 取消了操作符重载,但是新兴的 Groovy ... -
实战 Groovy: 使用 Groovy 模板进行 MVC 编程
2010-07-10 11:04 2911视图是 MVC 编程的一个重要部分,而 MVC 编程本 ... -
实战 Groovy: 用 Groovy 减少代码冗余
2010-07-10 11:04 2056Groovy 简洁的语法将 ... -
实战 Groovy: Groovy:Java 程序员的 DSL
2010-07-10 11:04 3079Groovy 专家 Scott Davis 将重新开始 ... -
精通 Grails: 构建您的第一个 Grails 应用程序
2010-07-06 09:37 1646Java™ 程序员不需要 ... -
Grails 部署
2010-07-06 09:36 6071部署 Grails可以使用很多种方式来部署,每一种 ... -
Grails 脚手架
2010-07-05 08:20 4076脚手架 根据指定的领域类,脚手架为你自动生成 ... -
Grails Grails 与 Hibernate
2010-07-05 08:19 2700Grails 与 Hibernate 如果 GOR ... -
Grails Grails和 Spring
2010-07-05 08:19 7902Grails和 Spring 这一节适合于高级用户 ...
相关推荐
7. **Grails 安全性** - Spring Security 插件为Grails提供了全面的安全管理,包括身份验证、授权和会话管理。 - 默认的基于角色的权限控制使得安全配置更加简单。 8. **持续集成与部署** - Grails 支持热部署,...
5. **Grails插件系统**:Grails拥有庞大的插件库,涵盖各种功能,如安全、缓存、报表、测试等。通过插件,开发者可以轻松地扩展框架功能,避免重复造轮子。 6. **Grails构建工具**:Grails的构建系统自动化处理许多...
Grails,作为一个基于Groovy语言的开源Web应用框架,深受开发者喜爱,它简化了Java开发的复杂性,提供了强大的MVC(Model-View-Controller)架构,以及丰富的插件系统。这份用户手册将帮助你深入理解和高效使用...
- **数据验证**:实现数据输入的有效性检查,增强应用的健壮性和安全性。 - **错误消息自定义**:根据不同的验证失败情况显示特定的错误信息,提高用户体验。 - **动态查询**:支持基于动态条件的查询操作,增加...
在Grails中实现用户登录功能是构建任何Web应用的基础,它确保了数据的安全性和用户权限的管理。本示例将详细解释如何在Grails中创建一个用户登录系统,特别是对于管理员用户的特定权限控制。 **1. 配置环境** 首先...
Grails 的强大之处在于其丰富的插件库,如Spring Security用于安全控制,Hibernate Search提供全文搜索功能,以及各种用于支付、邮件发送、社交网络集成的插件,极大地扩展了框架的功能。 6. **IDE集成** ...
Grails拥有丰富的插件生态系统,提供了大量的现成解决方案,涵盖了安全、缓存、邮件、社交网络等功能。插件机制大大简化了功能的添加和定制,使得开发者可以专注于核心业务逻辑,而无需从头构建所有功能。 总之,...
《使用 Grails 快速开发...同时,也将具备进一步探索Grails高级特性的基础,如插件系统、国际化、安全性和测试等。对于熟悉HTML、Web开发基础和Java或Groovy语言的开发者,Grails提供了一个高效且有趣的Web开发新选择。
Grails 3.3 是 Grails 3.x 系列中的一个版本,相比之前的版本,在性能优化、安全性增强以及新特性的支持方面都有所提升。 #### 二、Grails 3.3 的主要特性 1. **Groovy 2.4 支持**:Grails 3.3 内置了对 Groovy ...
除了上述内容,本书还探讨了Grails的高级特性,例如安全性、缓存和事务管理等。并且,由于Grails可以与Java无缝集成,读者还会学习到如何将Java和Grails结合起来,利用现有的Java技能和经验进行Web开发。 本书适合...
在安全性配置部分,提及了org.grails.plugins:spring-security-core和org.grails.plugins:spring-security-rest,这代表了Grails项目中将使用Spring Security来管理安全问题,包括认证和授权,以及Spring Security ...
### Grails快速开发Web应用:知识点详解 #### Grails框架概览 Grails是一个基于Groovy语言构建...随着实践的积累,进一步探索Grails的高级特性,如插件开发、安全性增强、性能优化等,将成为提升Web开发水平的关键。
这使得开发者可以更快地编写代码,同时享受静态类型语言的安全性。 2. **MVC架构**: Grails遵循Model-View-Controller(MVC)设计模式,这种架构允许开发者分离业务逻辑、数据模型和用户界面,提高代码可读性和可...
通过配置和定制,开发者可以实现角色管理、URL保护、CSRF防护等功能,确保应用程序的安全性。 ### 6. 插件 Grails插件系统是其强大之处,它扩展了框架的功能,提供了许多预建解决方案。例如,缓存插件用于优化性能...
通过合理地利用 Grails 过滤器,开发者可以有效地编写出整洁、可维护的代码,同时提高应用的安全性和性能。 总结来说,Grails 过滤器是 Grails 框架中一种强大的工具,它们提供了一种优雅的方式来处理应用程序的...
- **Plugins**:Grails插件系统允许开发者复用和扩展功能,如安全、缓存、邮件服务等。 - **配置管理**:通过`grails-app/conf/`目录下的配置文件,如`Config.groovy`,进行项目配置。 3. **控制器和视图**: - ...