替代格式隐藏在表单中的id字段

时间:2014-08-12 16:34:44

标签: security grails

目前,我的Grails表单使用隐藏的id字段和隐藏的版本字段进行编辑。这似乎是一个巨大的安全风险,因为有人可以编辑他们有权访问的表单并更改id以更新不同的记录。通过将版本设置为版本1,版本可能会发生同样的情况。我的问题是:在表单中不以ID(以可编辑的方式)公开ID的最佳做法是什么?

1 个答案:

答案 0 :(得分:4)

通常通过检查用户是否可以访问具有从浏览器接收到的ID的对象来减轻这种风险,因此即使他们篡改了ID,他们对于伪装的尝试也会失败,例如。

class OrderController {

  def deleteOrder(Order order) {
    User loggedInUser = getCurrentUser()

    if (order.owner.id == loggedInUser.id) {
      // let them delete their order
    } else {
      // tell them to bugger off
    }
  }
}

您还可以对ID进行加密/哈希,例如将ID和散列ID作为隐藏表单字段包括在内,然后在服务器端检查收到的ID是否与收到的散列ID匹配。这应该确保他们没有篡改ID或它的哈希值。

然而,这仍然没有证明他们可以访问具有此ID的对象,因此严格来说,您仍然需要像上面那样进行检查,这使得加密/散列相当无意义的IMO。

对于版本字段,他们不能通过篡改来做任何伤害。如果他们将版本更改为其他数字,那么(假设您正在检查脏写),他们会收到通知,告知他们提交的数据已过时(即使它不是&#39 ; t)的