代码之家  ›  专栏  ›  技术社区  ›  Craig Walker

URL路径元素中的标识符是否存在安全问题?

  •  1
  • Craig Walker  · 技术社区  · 11 年前

    我正在使用 Devise 对于大多数用户身份验证工作。我注意到的一件事是,当为安全敏感任务传递标识符时,它们总是使用查询字符串参数完成的。

    例如,发送给用户的密码重置电子邮件中包含的URL可能如下所示:

    http://example.com/users/password/edit?reset_password_token=_aPKoNpLHm7HYs_o4Qex
    

    Devise根据 reset_password_token 并在用户重置表单时更改密码。

    我刚刚实现了一个类似的函数,Devise没有处理它。在每封电子邮件中,我都包含一个退订链接。控制器基于唯一令牌查找用户,并将其取消订阅标志设置为true,即使用户未登录。

    但是,我生成的URL如下所示:

    http://example.com/subscription/3e7eb22a268b62d5/edit
    

    这基本上和德维斯所做的事情是一样的。不同之处在于,我将令牌包含在URL路径本身中,而不是查询字符串中。

    在我看来,这更具RESTful,因为它指向用户随后更新(通过将表单发布到 PUT http://example.com/subscription/3e7eb22a268b62d5 ). 除此之外,我看不出这两种方法之间有什么区别。

    在RESTful URL上使用查询字符串参数有什么原因吗?

    2 回复  |  直到 11 年前
        1
  •  2
  •   Will Hartung    11 年前

    我缺少使用查询字符串参数的原因吗 通过RESTful URL?

    不是真的。用户使用查询参数与不使用查询参数之间的唯一真正区别是,某些干预系统可能不会使用查询参数缓存URI,因此在这种情况下,在基本URI中嵌入标识符是一种解决方案。

    也就是说,这个论点与您的用例几乎无关。

    在高级别上,REST根本不在乎,因为它将URI视为一个整体(查询参数是URI的一部分)。因此,它对此事没有任何建议。这两个URI都是唯一的“命名资源”,因此REST很高兴。

    习惯上,在BASE URI中嵌入id是非常流行的,并且它可以与边缘事例缓存场景相关,因此,这是唯一真正的为该表单与查询参数挥舞旗帜的粉丝。

    美容方面,许多人更喜欢嵌入式风格。

    我会让你权衡这些考虑。

        2
  •  -1
  •   Community Mohan Dere    9 年前

    在RESTful服务中,在URL中传递令牌并不是很好。更好的方法是在请求内容中发送它。也就是说,这个令牌是一次性的,并没有真正与身份验证相关,所以它可能不那么烦人。。。此外,我猜这个功能需要通过链接(在电子邮件中)而不是表单提交来实现,这就是为什么使用这样的URL参数。

    否则,诚实地使用动作(元素 edit )资源路径中的名称( http://example.com/subscription/3e7eb22a268b62d5/edit )不是真正的RESTful;-)事实上,动作是由所使用的方法本身描述的。在方法的情况下 POST ,如果您想支持多个操作,我们也可以使用附加提示。

    关于方法的使用 PUT ,当您希望更新资源的完整表示时,应使用它。就你的情况而言,我认为你是一种方法 柱,柱 因为您希望使用重置密码令牌对订阅执行操作(重置订阅的密码)。这是我在您的案例中看到的请求:

    POST http://example.com/subscription/3e7eb22a268b62d5
    {
        "reset_password_token": "_aPKoNpLHm7HYs_o4Qex"
    }
    

    我提供了两个链接,可以帮助您设计请求:

    根据克雷格·沃克的评论编辑。

    希望它能帮助你, 蒂埃里