Estoy construyendo una aplicación CRUD sencillo (no usar el módulo CRUD).Cómo prevenir los campos ocultos con el ID de ser atacado
Mi modelo es una clase simple con un solo atributo. el id se hereda de manera implícita de Model.
@Entity
public class Account extends Model {
@Required
public String domain;
}
La vista es la siguiente. Tenga en cuenta el campo oculto con 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>
que han sido capaces de construir un escenario en el que guardar, actualizar funciona.
La forma en que se realiza la actualización es que leo el ID del campo oculto y actualizo el registro. Si ID no está disponible, se crea un nuevo registro.
Así que la pregunta es: Se puede hackear la ID, es decir, modificarla para que cambie 1 a 2, y suponiendo que exista un registro con 2, se sobrescribe. (Supongo que no debería ser difícil con Firebug u otros complementos).
¿cómo puedo evitar esto? Una opción que pensé es leer el registro con el Id dado, si el usuario puede modificarlo, permito la actualización, de lo contrario no. Esto todavía no es infalible porque, aunque se podría permitir al usuario, el registro "incorrecto" podría modificarse.
Imagino que este es un problema conocido y con suerte con una solución conocida.
Gracias por tomarse el tiempo para responder a mi pregunta.
Esto parece ser exactamente lo que necesitaba. Crypto.sign calcula la firma HMAC.SHA1. Voy a probarlo esta noche. Lo que había estado reflexionando era tener un secreto específico del usuario, pero ese es un detalle de implementación. Has proporcionado claridad a la neblina en mi mente. Gracias :) – Nasir
funciona como un encanto. Más simple que mantener el estado en el servidor. Planeo usar claves específicas del usuario que generaré en el momento de la suscripción en lugar del secreto de la aplicación que se usa de forma predeterminada. [Método de firma con 2 params] (http://www.playframework.org/documentation/api/1.2/play/libs/Crypto.html#sign%28java.lang.String,%20byte []% 29) – Nasir
I ' No estoy seguro de por qué te molestaría. Play Framework es completamente sin estado. Si se da cuenta de que solo se puede modificar el ID de cuenta 1 en el GET, ¿por qué no puede resolverlo de nuevo en el POST? La sesión ya identifica al usuario. No hay ninguna razón para encriptar nada más. –