Play如何帮助我防止参数篡改攻击?

时间:2015-03-11 04:31:32

标签: playframework-2.0

  

如果表单和模型之间没有直接的1:1映射,   然后必须明确忽略敏感字段以防止a   参数篡改攻击。

我在https://playframework.com/documentation/2.3.x/ScalaForms#Defining-constraints-on-the-form

的Play文档中看到了这句话 他们真正在说什么?这是什么意思?
或者怎么玩可以帮助我做到这一点

2 个答案:

答案 0 :(得分:3)

如果我有模特,那就说:

case class User(name: String, email: String, isAdmin: Boolean)

我重用该模型来创建一个仅将nameemail参数作为html中的字段公开的编辑表单,我必须要小心,因为当它被提交时,攻击者可以添加一个额外的参数isAdmin=true,这最终会使自己成为管理员。相反,如果我有一个特定的表单类:

case class UserForm(name: String, email: String)

case class User(name: String, email: String, isAdmin: Boolean) {
  def updateFromForm(userForm: UserForm): User =
    user.copy(name = userForm.name, email = userForm.email)
}

然后没有机会发生这种情况,因为没有字段可以绑定isAdmin

实际上,这一点与Play Scala表单API无关,因为它无论如何都非常明确地声明所有绑定。相比之下,基于反射的API(例如Play Java表单API)肯定存在这个问题。

答案 1 :(得分:0)

鉴于处理特定于ID的实体的惯用Play方式(例如,您不想向用户公开其上具有数据库ID字段的实体)是使用隐藏字段我一直在想这个确切的事情我。

Play具有可以焊接到Controller中的CSRFCheck复合操作(在发送表单之前使用CSRFAddToken)但是这不会阻止具有ID的隐藏字段被更新。

服务ID = 1(隐藏)姓名="弗雷德"密码=" NoneOfYourBusiness"

返回ID = 2(隐藏)姓名=" Freddie"密码=" NowIOwnYouTwo"

我有点震惊的是,网址和/或参数篡改不是由同一机制或直接播放来处理的。

您可以抓取CSRFToken并将其缓存(或将其存储在数据库中)以及它应该保护的ID但是如果您要解决这个问题,那么您可以将ID完全排除在外隐藏字段和缓存/存储在服务器端并使用sessionID或CSRFToken本身引用它(在入站请求中查找它)。

OR

更进一步,生成另一个加密的字符串,其中包含所需的信息以及到期日期,该日期基本上反映了相关的URL(您应该能够从反向路由中获取)并在返回的路上进行解析检查每个参数是否被允许/有效/未被篡改。似乎很多工作,但它可能是确保"良好行为的最低要求" :)

所有这一切都开始消耗无状态框架提供的内存优势(恕我直言) - 这指向加密数据,以免耗尽服务器的内存但当然现在你用CPU和带宽付费。

请记住,这只需要在POST上完成,因为所有GET都不应该更改状态服务器端。如果没有任何改变你需要担心的是,如果眼球被授权,如果他们表现得不是。