我正在构建一个简单的CRUD应用程序(不使用CRUD模块)。如何防止带有ID的隐藏字段被黑客攻击
我的模型是一个具有一个属性的简单类。 id是从Model中隐式继承的。
@Entity
public class Account extends Model {
@Required
public String domain;
}
该视图如下。请注意带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>
我已经能够建立这样一个场景,保存,更新工作。
的方式更新做的是,我读了隐藏字段的ID,并更新记录。如果ID不可用,则创建新记录。
所以问题是: ID可以被破解,即修改,使我改变1到2,并假设与2存在的记录,它会被覆盖。 (我猜想用萤火虫或其他插件应该不难)。
我该如何预防?我想到的一个选择是用给定的Id读取记录,如果允许用户修改它,则允许更新,否则不允许。这仍然不是傻瓜证明,因为虽然用户可以被允许,但“错误的”记录可以被修改。
我想这是一个已知的问题,并希望与已知的解决方案。
感谢您花时间回答我的问题。
这看起来正是我所需要的。 Crypto.sign计算HMAC.SHA1签名。今晚我会尝试一下。我一直在研究的是具有用户特定的秘密,但这是一个实现细节。你已经澄清了我心中的阴霾。谢谢:) – Nasir
就像一个魅力。比维护服务器状态更简单。我打算使用用户特定的密钥,我将在注册时生成密钥,而不是默认使用的应用程序密钥。 [带2个参数的符号方法](http://www.playframework.org/documentation/api/1.2/play/libs/Crypto.html#sign%28java.lang.String,%20byte []%29) – Nasir
I'米不知道为什么你会打扰。 Play框架是完全无状态的。如果它可以发现只有帐号ID 1可以在GET上修改,为什么它不能在POST上算出来呢?会话已经识别用户。没有理由加密其他任何东西。 –