1

如果禁用的下拉列表动态呈现到页面,仍然可以使用 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 中恢复值。由于某些领域依赖于其他领域,这对我来说是不可接受的。

4

6 回答 6

2

如果这确实是一个问题,那么在服务器上的某个地方(可能在会话中)保留一个值,表明该控件在页面的初始呈现时被设置为禁用。如果当页面返回时控件仍未处于禁用状态,则您知道表单已被篡改。

编辑

这对于客户端篡改是安全的,因为表单永远不会提交禁用的控件,因此修改后的数据永远不会到达服务器。请参阅http://w3.org/TR/html401/interact/forms.html#h-17.12

于 2010-04-06T05:48:27.333 回答
1

构建安全 webb 应用程序的一般规则:永远不要相信来自客户端的任何输入。假设每个请求都是手工构建的,以便突破您的安全系统。

唯一安全的是忽略从禁用字段返回的任何数据。该数据必须存储在会话中,或从数据库(或您使用的任何数据存储)重新加载。

于 2010-04-06T05:54:39.360 回答
1

使用视图状态。它的加密程度足以阻止普通黑客。

于 2010-04-06T08:09:17.820 回答
1

Going back through some old questions, I realised at least one simple approach exists: Use the page's viewstate as mentioned by @Mark Hurd.

This is a quick hack, but something like this:

    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;
    }

I can't even remember what I was doing with this problem... Anyway, it would be good if there was a .NET attribute meaning "really disabled" that wasn't rendered to the client. I guess that's what this solution represents a hack-approximation of.

于 2011-12-02T06:33:05.607 回答
0

只是不要处理这些数据,你会做得很好。如果您正在显示一些常量,那么它们应该存储在服务器端。

于 2010-04-06T05:49:54.953 回答
0

用标签替换输入字段。

换句话说,不是禁用 TextBox 或 DropDown,而是隐藏它们并显示一个标签。

于 2018-03-19T20:34:00.693 回答