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