gpt4 book ai didi

grails - 使用获取表单搜索来确保Grails安全URL的安全

转载 作者:行者123 更新时间:2023-12-02 15:05:39 24 4
gpt4 key购买 nike

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

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

我的URL访问的基本格式如下:

/$controller/$action/$id

这是遇到问题的地方。这在 Controller 中发生,例如,要更改用户,我具有以下URL:
/user/update/1

并进入 Controller ,我有以下代码:
def update(Long id) {
def user = User.get(id);
[user: user]
}

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

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

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

我需要帮助才能知道,例如,使用Spring Security,我可以做这种事情。

我试图找到解决问题的方法,但是不确定要搜索哪个单词,所以如果已经有像我这样的问题,请在评论中添加链接。

谢谢。

最佳答案

正如Joshua指出的那样,如果这是一个普遍的问题,您需要限制哪些用户(或哪些角色)可以执行特定操作,那么spring-security-acl插件将为您提供帮助。但这工作起来很乏味,因为您通常需要以细粒度的方式对事物进行建模,并且最终在数据库中包含大量ACL数据。

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

def springSecurityService

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

通常可以避免使用ACL的相关工作流程是允许用户编辑自己拥有的内容,例如一个 CreditCard。假设您在 static hasMany = [creditCards: CreditCard]类和 User(或者只有 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,您可以将其视为作为错误或黑客行为,并且不允许访问。

请注意,您描述的哈希方法不是很安全-只是“默默无闻的安全性”。如果每个用户的哈希值是常数,则不难发现用户哈希值是什么并发出请求(例如,同事可以只看另一个人的监视器,然后在他们的浏览器中查看网址)。

关于grails - 使用获取表单搜索来确保Grails安全URL的安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32878292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com