Я создаю простое приложение CRUD (без использования модуля CRUD).
Моя модель представляет собой простой класс с одним атрибутом. идентификатор неявно наследуется от 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>
Мне удалось создать сценарий, в котором работает сохранение и обновление.
Способ обновления: я считываю идентификатор из скрытого поля и обновляю запись. Если идентификатор недоступен, создается новая запись.
Итак, вопрос: Можно ли взломать идентификатор, т.е. изменить его так, чтобы я изменил 1 на 2, и если запись с 2 существует, она будет перезаписана. (Я полагаю, это не должно быть сложно с firebug или другими плагинами).
Как предотвратить это? Один из вариантов, о котором я подумал, - прочитать запись с заданным идентификатором, если пользователю разрешено ее изменять, я разрешаю обновление, в противном случае - нет. Это все еще не защита от дурака, потому что, хотя пользователю может быть разрешено, «неправильная» запись может быть изменена.
Я полагаю, что это известная проблема и, надеюсь, с известным решением.
Спасибо, что нашли время ответить на мой вопрос.