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

Playframework 2.0 Play如何帮助我防止参数篡改攻击?,playframework-2.0,Playframework 2.0,如果表单和模型之间没有直接的1:1映射, 然后必须显式忽略敏感字段以防止 参数篡改攻击 我在游戏文档中看到过这句话 他们到底在说什么?这意味着什么 或者,play如何帮助我做到这一点呢?意思是如果我有一个模特: case class User(name: String, email: String, isAdmin: Boolean) 我重复使用该模型来创建编辑表单,该表单只将名称和电子邮件参数作为html中的字段公开,我必须小心,因为当提交时,攻击者可能会添加一个额外的参数,isAdmin=

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

我在游戏文档中看到过这句话

他们到底在说什么?这意味着什么

或者,play如何帮助我做到这一点呢?

意思是如果我有一个模特:

case class User(name: String, email: String, isAdmin: Boolean)
我重复使用该模型来创建编辑表单,该表单只将
名称
电子邮件
参数作为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 form API无关,因为它非常明确地声明了所有绑定。相比之下,基于反射的API(如Play Java form API)肯定有这个问题。

考虑到处理特定于ID的实体(例如,具有数据库ID字段的实体,您不想向用户公开)的惯用播放方式是使用隐藏字段,我自己也一直在想这个问题

Play具有CSRFCheck复合动作,可以将其焊接到控制器中(在发送表单之前使用CSRFAddToken),但是这并不能防止ID为的隐藏字段被更新

服务ID=1(隐藏)Name=“Fred”Password=“不关你的事”

返回的ID=2(隐藏)Name=“Freddie”Password=“NowIOwnYouTwo”

我有点震惊,url和/或参数篡改不是由相同的机制处理的,也不是由播放直接处理的

您可以获取CSRFToken并将其与它应该保护的ID一起缓存(或存储在DB中),但是如果您遇到了这个问题,那么您也可以将该ID作为隐藏字段一起排除,并将其缓存/存储在服务器端并引用它(在入站请求中查找)使用sessionID或CSRFToken本身

更进一步,生成另一个加密字符串,该字符串包含所需信息以及到期日期,基本上反映了所讨论的URL(您应该能够从反向路由中获得),并在返回的过程中进行解析,以检查每个参数是否允许/有效/未被篡改。看起来工作量很大,但这可能是确保“良好行为”的最低要求:

所有这些都开始蚕食无状态框架(IMHO)提供的内存优势——这意味着发送加密的数据以避免占用服务器的内存,但现在您当然要用CPU和带宽付费


记住,这只需要在POST上完成,因为所有GET都不应该改变服务器端的状态。如果什么都没有改变,你需要担心的是眼球是否被授权,而不是它们的行为是否被授权

正如通常的要点一样,无论如何,值得一提的是,在JavaAPI中,更强烈的建议是(正是因为这个问题)通过自定义表单类绑定表单。古老的谚语“永远不要相信用户”;)