- 浏览: 5134974 次
- 性别:
- 来自: 天津
博客专栏
-
实战 Groovy
浏览量:29046
文章分类
- 全部博客 (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 2669Groovlet 和 GroovyServer P ... -
实战 Groovy: 用 Groovy 生成器作标记
2010-07-10 11:07 2008Groovy 生成器让您能够利用诸如 Swing 这样 ... -
实战 Groovy: for each 剖析
2010-07-10 11:07 18115在这一期的 实战 Groovy 中,Scott Davi ... -
实战 Groovy: 用 Groovy 进行 Ant 脚本编程
2010-07-10 11:07 2003Ant 和 Maven 两者在构建处理工具的世界中占统 ... -
实战 Groovy: 在 Java 应用程序中加一些 Groovy 进来
2010-07-10 11:06 4253您有没有想过在自己相对复杂的 Java 程序中嵌入 G ... -
实战 Groovy: Groovy 的腾飞
2010-07-10 11:06 2130随着 Groovy JSR-1(及其后续发行版本)的发 ... -
实战 Groovy: 用 curry 过的闭包进行函数式编程
2010-07-10 11:06 3190在 Groovy 中处处都是闭包,Groovy 闭包惟 ... -
实战 Groovy: 关于 MOP 和迷你语言
2010-07-10 11:06 2018将耳朵贴到地上仔细听 —— MOP 正在前进!了解一下 ... -
实战 Groovy: 用 Groovy 更迅速地对 Java 代码进行单元测试
2010-07-10 11:06 2260不久以前,developerWor ... -
实战 Groovy: 构建和解析 XML
2010-07-10 11:05 7071通过本文,您将了解 ... -
实战 Groovy: 用 Groovy 进行 JDBC 编程
2010-07-10 11:05 5118这个月,随着 Andrew G ... -
实战 Groovy: 美妙的操作符
2010-07-10 11:05 2243Java™ 取消了操作符重载,但是新兴的 Groovy ... -
实战 Groovy: 使用 Groovy 模板进行 MVC 编程
2010-07-10 11:04 2855视图是 MVC 编程的一个重要部分,而 MVC 编程本 ... -
实战 Groovy: 用 Groovy 减少代码冗余
2010-07-10 11:04 2010Groovy 简洁的语法将 ... -
实战 Groovy: Groovy:Java 程序员的 DSL
2010-07-10 11:04 3043Groovy 专家 Scott Davis 将重新开始 ... -
精通 Grails: 构建您的第一个 Grails 应用程序
2010-07-06 09:37 1604Java™ 程序员不需要 ... -
Grails 部署
2010-07-06 09:36 6024部署 Grails可以使用很多种方式来部署,每一种 ... -
Grails 脚手架
2010-07-05 08:20 4032脚手架 根据指定的领域类,脚手架为你自动生成 ... -
Grails Grails 与 Hibernate
2010-07-05 08:19 2655Grails 与 Hibernate 如果 GOR ... -
Grails Grails和 Spring
2010-07-05 08:19 7840Grails和 Spring 这一节适合于高级用户 ...
相关推荐
Grails 安全性 ###The Bookstore 一个 Grails 3.0 示例应用程序,具有您可以理解的简单安全性。 哲学: 吻 实现的功能: 注册(注册) 登录(验证) 登出(登出) 标签库 <security>... <security>... ...
Grails-Springsecurity-username-email-login 此种子用于在您的应用程序中配置 spring 安全性并启用使用用户名或电子邮件登录 vai Grails spring 安全性插件仅支持通过用户名登录。 如果您需要通过用户名或密码启用...
自2015年10月21日起,它使用来自安全性基准的最新JDK 8u60。从获取安装程序并进行安装。 安装后,将JDK安装目录的bin目录的路径添加到PATH系统环境变量中。 Grails安装 使用截至2015年10月21日的最新Grails 3.0.9。...
首先,您需要按照在您的应用程序中配置 spring 安全性。 步骤 2. 现在修改你的 BuildConfig.groovy 并在插件中添加以下行以安装 spring 安全休息插件 compile ":spring-security-rest:1.4.1.RC2", { excludes: '...
除了代码本身意外,该项目还会考察你的其他素质,比如团队合作技能,比如git的使用,与人交流的能力,主动性等一个真正的职场人员应该有的基本素质。 题目要求: 采用GORM作为底层,将题目中的集成测试全部跑通。 ...
Shiro提供了应用程序安全性API来执行以下方面(我喜欢将它们称为应用程序安全性的4个基石): 身份验证-证明用户身份,通常称为用户“登录”。 授权-访问控制 密码术-保护或隐藏数据以防窥视 会话管理-每个用户的...
经过测试的功能完备的Spring 3.2参考应用程序,具有JPA持久性,REST Level-3资源,异步处理,作业,安全性,单元,模拟,集成,功能,其余客户端存根,性能测试以及许多最佳实践,聚集了在MVC / Spring / Grails网络...
NicosCMS 是一个基于 Grails 框架构建的内容管理服务器,运行在 Java Servlet ...Joomla,但具有卓越的安全性和功能 请访问我们的参考站点:http://li1250-82.members.linode.com:8080/OrthodoxMission/homepage/index
5.7 处理领域对象安全性 198 5.7.1 问题 198 5.7.2 解决方案 198 5.7.3 工作原理 199 5.8 小结 208 第6章 将Spring与其他Web框架集成 209 6.1 在一般Web应用中访问Spring 209 6.1.1 问题 209 6.1.2...
5.7 处理领域对象安全性 198 5.7.1 问题 198 5.7.2 解决方案 198 5.7.3 工作原理 199 5.8 小结 208 第6章 将Spring与其他Web框架集成 209 6.1 在一般Web应用中访问Spring 209 6.1.1 问题 209 6.1.2...
在项目初始化阶段采用ASM生成好字节码,因此支持编译前预备,可替换减少运行期的错误,显着提升程序的强壮性 支持安全查询,防止SQL注入 支持与主流数据库连接池框架集成 支持@Query查询,使用@Cond