【问题标题】:Grails secure URL's using get form searchGrails 使用获取表单搜索来保护 URL
【发布时间】:2015-10-01 11:14:23
【问题描述】:

我有一个使用 Spring Security 的 Grails 应用程序。

这个应用程序基本上是一个内容管理系统,所以它是一个 CRUD。

我的网址访问基本格式如下:

/$controller/$action/$id

这是遇到问题的地方。这发生在控制器中,例如,为了更改用户,我有以下 URL:

/user/update/1

在控制器中我有以下代码:

def update(Long id) {
    def user = User.get(id);
    [user: user]
}

这就是问题所在。如果用户直接更改(id)而不检查请求中的用户id是否正确,任何人都可以浏览我系统的用户。现在我有一个大问题。

我认为的解决方案是为每个注册系统创建一个唯一的哈希,这会妨碍用户理解,例如,ID 1 具有哈希 123aabbCCDD。

但是我在系统中有很多寄存器和很多域,我不知道这是否是最好的解决方案。

我需要帮助知道,例如,使用spring security,我可以做这种事情。

我试图找到问题的解决方案,但我不确定要搜索什么词,所以如果已经有像我这样的问题,请将链接放在 cmets 中。

谢谢。

【问题讨论】:

  • 您的问题非常广泛,但是“检查请求中的用户 ID 是否正确”是您的关键。什么定义将定义你如何解决这个问题。它可以是一个简单的过滤器来检查参数,也可以是像 Spring Security ACL 这样复杂的东西。这完全取决于您的需求。
  • 谢谢 Joshua,我不知道 ACL 存在。我现在正在阅读这方面的内容。对不起,如果问题相当广泛,但我不知道如何更具体。

标签: grails spring-security


【解决方案1】:

正如 Joshua 所指出的,如果这是一个需要限制哪些用户(或哪些角色)可以执行特定操作的一般问题,那么 spring-security-acl 插件会有所帮助。但这可能很繁琐,因为您通常需要以细粒度的方式对事物进行建模,并且最终会在数据库中获得 很多 的 ACL 数据。

但是,如果您只想限制用户能够编辑自己,请不要传递用户 ID。如果操作需要身份验证,您已经知道用户是谁。如果是这种情况,请将操作更改为类似

def springSecurityService

def update() {
   [user: springSecurityService.currentUser]
}

通常可以避免使用 ACL 的相关工作流程是允许用户编辑他们拥有的内容,例如CreditCard。假设您在User 类中有static hasMany = [creditCards: CreditCard]static belongsTo = [user: User](或只是User user),那么您可以允许表单发送信用卡ID,但您只需要使用修改后的查询,例如

def springSecurityService

def update(Long id) {
   def user = springSecurityService.currentUser
   def card = CreditCard.findByIdAndUser(id, user)
   [creditCard: card]
}

最终的 SQL 查询将类似于 select ... from credit_card where id=? and user_id=?,与 get() 调用(即 select ... from credit_card where id=?)的 SQL 相比,它具有很大的安全优势。恶意用户仍然可以尝试发送他们想要的任何 id,但是由于 where 子句同时检查 id 和用户外键,如果他们没有以卡所有者身份登录,则查找器将返回 null 并且您可以将其视为错误或黑客攻击,不允许访问。

请注意,您描述的哈希方法不是很安全 - 它只是“默默无闻的安全性”。如果每个用户的哈希值是恒定的,那么不难找出用户的哈希值并伪造请求(例如,同事可以只查看其他人的监视器并在浏览器中查看 url)。

【讨论】:

  • 好的。现在我了解了 ACL 的真正用途。使用该插件的唯一问题是我的应用程序使用带有 Acegi 插件的 grails 2.2.3,我需要升级它。目前最大的问题是应用程序正在运行,我不知道如何更有效,而且我有很多控制器。这并不神奇,我需要手动更改所有控制器。 @Burt 再次感谢。
  • 我发现本教程burtbeckwith.com/blog/?p=287 使用 acegi,这是我在我的应用程序中使用的实际插件,有任何为 acegi 5.3.x 编码的资源吗?
  • Acegi?您今天需要升级。快到 2016 年了。
  • *对不起,如果我的问题很愚蠢,但为什么呢? .我正在使用 grails 2.2.3。升级 Grails 版本有多大必要?因为在grails plugins页面中spring security插件兼容的版本是2.3.0 > *.还有其他版本的SS兼容这个版本吗?再次感谢@Burt。
  • 升级 Grails 可能需要做很多工作,这取决于版本之间的差异大小以及您是否使用了变化很大的功能。但这通常是值得的,因此您可以利用重要的修复、性能提升、新功能等。但是,如果您需要进行重大修复或更改,使用旧的安全库和插件对您和您的用户来说可能会有很大风险失踪。您可以使用需要 Grails 2.0+ 的 2.0-RC3 版本,并在发布时升级到 RC5 或 2.0 final,如果升级到 Grails 3,则升级到 3.0.x。
猜你喜欢
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 2019-09-20
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
相关资源
最近更新 更多