В .NET, как предотвратить или обработать несанкционированный доступ к данным формы отключенных полей перед отправкой? - PullRequest
1 голос
/ 06 апреля 2010

Если на странице динамически отображается отключенный раскрывающийся список, все еще можно использовать 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, чтобы удалить атрибут «disabled» и изменить выбранный параметр.
При отправке формы и повторном создании поля вновь созданный элемент управления имеет правильное значение к концу OnLoad, но OnPreRender принял идентичность отправленного элемента управления и получил значение отправленной формы.
Похоже, что в .NET нет способа обнаружить тот факт, что поле изначально было создано в отключенном состоянии, а отправленное значение было поддельным. Это понятно, поскольку могут существовать законные функциональные возможности на стороне клиента, которые позволят удалить отключенный атрибут.

Есть ли какой-нибудь способ, кроме метода грубой силы, обнаружить, что значение этого поля не должно было изменяться?

Я рассматриваю метод грубой силы как нечто дерьмовое, вроде сохранения правильного значения где-то еще в OnLoad и восстановления значения в OnPreRender. Поскольку некоторые поля зависят от других, для меня это было бы неприемлемо.

Ответы [ 6 ]

2 голосов
/ 06 апреля 2010

Если это действительно проблема, тогда сохраните значение где-нибудь на сервере (возможно, в сеансе), которое указывает, что элемент управления был отключен при первоначальной визуализации страницы. Если элемент управления все еще не находится в отключенном состоянии, когда страница отправляется назад, то вы знаете, что форма была подделана.

Редактировать

Это защищено от вмешательства клиента, так как отключенный элемент управления никогда не отправляется формой, и поэтому измененные данные никогда не попадут на сервер. Пожалуйста, смотрите http://w3.org/TR/html401/interact/forms.html#h-17.12.

1 голос
/ 02 декабря 2011

Возвращаясь к некоторым старым вопросам, я понял, что существует по крайней мере один простой подход: используйте состояние просмотра страницы, упомянутое @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, означающий "действительно отключен", который не отображался для клиента. Я полагаю, что это решение представляет собой хак-аппроксимацию.

1 голос
/ 06 апреля 2010

Использовать ViewState. Он зашифрован достаточно, чтобы остановить среднего хакера.

1 голос
/ 06 апреля 2010

Общее правило для создания безопасных веб-приложений: никогда не доверяйте никаким данным от клиента. Предположим, что каждый запрос был составлен вручную, чтобы прорваться через вашу систему безопасности.

Единственная надежная вещь - игнорировать любые данные, возвращаемые из полей отключения. Эти данные должны быть сохранены в сеансе или перезагружены из базы данных (или любого хранилища данных, которое вы используете).

0 голосов
/ 19 марта 2018

Заменить поля ввода метками.

Другими словами, вместо отключения TextBox или DropDown, просто спрячьте их и покажите метку.

0 голосов
/ 06 апреля 2010

Просто не обрабатывайте эти данные, и все будет в порядке. Если вы отображаете некоторые константы, то они должны храниться на стороне сервера.

...