我正在構建一個簡單的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上算出來呢?會話已經識別用戶。沒有理由加密其他任何東西。 –