簡體   English   中英

在.NET中,如何在提交之前防止或處理篡改禁用字段的表單數據?

[英]In .NET, how do I prevent, or handle, tampering with form data of disabled fields before submission?

如果將禁用的下拉列表動態呈現到頁面,則仍然可以使用Firebug或其他工具篡改提交的值並刪除“禁用的” HTML屬性。 這段代碼:

protected override void OnLoad(EventArgs e) {
    var ddlTest = new DropDownList() {ID="ddlTest", Enabled = false};
    ddlTest.Items.AddRange(new [] { new ListItem("Please select", ""), new ListItem("test 1", "1"), new ListItem("test 2", "2") });
    Controls.Add(ddlTest);
}

導致呈現此HTML:

<select disabled="disabled" id="Properties_ddlTest" name="Properties$ddlTest">
    <option value="" selected="selected">Please select</option>
    <option value="1">test 1</option>
    <option value="2">test 2</option>

</select>

當我使用Firebug刪除“禁用”屬性並更改所選選項時,會出現問題。
在提交表單和重新創建字段時,新生成的控件在OnLoad結束時具有正確的值,但是通過OnPreRender,它假定了提交控件的身份並獲得了提交的表單值。
.NET似乎無法檢測到該字段最初是在禁用狀態下創建的,並且所提交的值是偽造的。 這是可以理解的,因為可能存在合法的客戶端功能,這些功能允許刪除禁用的屬性。

除了強力方法外,是否還有其他方法可以檢測到該字段的值不應該更改?

我認為蠻力方法是一種廢話,例如在仍在OnLoad中時將正確的值保存在某個位置,然后在OnPreRender中還原該值。 由於某些字段依賴於其他字段,因此這對我來說是不可接受的。

如果確實是一個問題,則在服務器上某個位置(可能是在會話中)保留一個值,該值指示在頁面的初始呈現中將控件設置為禁用。 如果該控件在頁面回發時仍未處於禁用狀態,則說明表單已被篡改。

編輯

這樣可以防止客戶端篡改,因為表單永遠不會提交禁用的控件,因此修改后的數據將永遠不會到達服務器。 請參閱http://w3.org/TR/html401/interact/forms.html#h-17.12

構建安全的Webb應用程序的一般規則:永遠不要信任客戶端的任何輸入。 假設每個請求都是手工構建的,以便突破您的安全系統。

唯一安全的是忽略從禁用字段返回的所有數據。 該數據將必須存儲在會話中,或從數據庫(或您使用的任何數據存儲)中重新加載。

使用ViewState。 它已被加密,足以阻止一般的黑客。

回到一些老問題,我意識到至少存在一種簡單的方法:使用@Mark Hurd提到的頁面的視圖狀態。

這是一個快速的技巧,但如下所示:

    private const string defaultValue = "Hack me!"; // from original data source
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        ViewState[txtTest.ClientID] = false;
    }
    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        if(ViewState[txtTest.ClientID] != null && !(bool)ViewState[txtTest.ClientID])
            txtTest.Text = defaultValue;

        string x = txtTest.Text;
    }

我什至不記得我在處理這個問題的方法了...無論如何,如果有一個.NET屬性表示“完全禁用”並且沒有呈現給客戶端,那就太好了。 我猜這就是該解決方案表示的近似值。

只要不處理該數據,您就可以做的很好。 如果要顯示一些常量,則應將其存儲在服務器端。

用標簽替換輸入字段。

換句話說,與其禁用文本框或DropDown,不如將它們隱藏並顯示標簽。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM