如何防止带有ID的隐藏字段被黑客攻击

Nas*_*sir 7 playframework

我正在构建一个简单的CRUD应用程序(不使用CRUD模块).

我的模型是一个带有一个属性的简单类.id是从Model隐式继承的.

@Entity
public class Account extends Model {

    @Required
    public String domain;
}
Run Code Online (Sandbox Code Playgroud)

该观点如下.请注意带有id的隐藏字段.

<form class="form-horizontal" action="@{Application.save}" method="POST">
<fieldset>
    <legend>Settings</legend>
    <input type="hidden" name="account.id" value="${account?.id}">

    #{field 'account.domain'}
    <div class="control-group #{if field.error != null} error #{/if}">
        <label class="control-label" for="${field.id}">&{field.name}</label>
        <div class="controls">
            <input type="text" class="input-xlarge" id="${field.id}" value="${field.value}" name="${field.name}">
            <span class="help-inline">${field.error}</span>
        </div>        
    </div>
    #{/field}        

    <div class="form-actions">
        <input class="btn btn-primary" type="submit" value="Save">
    </div>

</fieldset>
Run Code Online (Sandbox Code Playgroud)

我已经能够构建一个保存,更新工作的场景.

更新的方式是我从隐藏字段中读取ID,并更新记录.如果ID不可用,则会创建新记录.

所以问题是: ID是否可以被黑客攻击,即修改以便我将1更改为2,并假设存在2的记录,它将被覆盖.(我想用firebug或其他插件来说应该不难).

我该如何防止这种情况?我想到的一个选项是用给定的Id读取记录,如果允许用户修改它,我允许更新,否则不允许.这仍然不是万无一失的,因为虽然可以允许用户,但可以修改"错误"记录.

我想这是一个已知的问题,希望有一个已知的解决方案.

感谢您抽出宝贵时间回答我的问题.

Dom*_*orn 9

所以问题是:ID是否可以被黑客攻击,即修改以便我将1更改为2,并假设存在2的记录,它将被覆盖.(我想用firebug或其他插件来说应该不难).

我该如何防止这种情况?我想到的一个选项是用给定的Id读取记录,如果允许用户修改它,我允许更新,否则不允许.这仍然不是万无一失的,因为虽然可以允许用户,但可以修改"错误"记录.

当然,攻击者可能会更改记录的ID.

有几种方法可以最大限度地减少这种攻击的影响.

1)最简单的方法 - 对象获取:

从数据库中获取对象并检查它是否属于相关用户.这将防止其他用户弄乱不属于他们的对象,但不会阻止用户更改属于他的另一个对象.在大多数情况下,这是一种简单的方法.

2)更复杂:签字:

这里的想法是签署您提供给模板的常量,并检查表单提交后哈希是否仍然匹配. 这与播放会话的内容非常相似.攻击者不可能乱用常量(例如id)并提供最大的安全性.但是,你还有更多的工作要做.

例:

    public static void someActionDisplayingForm(){
  SomeObject o = ....
  SomeOtherObject o2 = ....
      String constants = o.id + "|" + o2.id;
      String hash = Crypto.sign(constants);
       render(o, o2, hash);
}
Run Code Online (Sandbox Code Playgroud)

在您拥有的模板中

 #{form ...}
   <input type='hidden' name='id1' value='${o.id}' />
   <input type='hidden' name='id2' value='${o2.id}' />
   <input type='hidden' name='hash' value='${hash}' />
Run Code Online (Sandbox Code Playgroud)

在处理你将要做的表格的方法中

 public static void processing(String id1, String id2, String hash, String otherValues, ...){
   String constants = id1 + "|" + id2;
   String checkHash = Crypto.sign(constants);
    if(!checkHash.equals(hash))
     badRequest();
   ... 
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.