我正在构建一个简单的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读取记录,如果允许用户修改它,我允许更新,否则不允许.这仍然不是万无一失的,因为虽然可以允许用户,但可以修改"错误"记录.
我想这是一个已知的问题,希望有一个已知的解决方案.
感谢您抽出宝贵时间回答我的问题.
所以问题是: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)
希望有所帮助.
| 归档时间: |
|
| 查看次数: |
2344 次 |
| 最近记录: |