Можно ли удалить некоторые данные с помощью HttpModule? - PullRequest
5 голосов
/ 24 июня 2009

Я конвертирую старый классический сайт asp в asp.net.

Приложение в основном является расширением набора инструментов для данного набора пользователей, но оно размещено у внешнего поставщика.

Чтобы выполнить плавную передачу в это приложение, он ПОСТАВЛЯЕТ некоторые данные XML, которые запускают «потенциально опасное значение Request.Form». Я знаю, что могу отключить флаг validateRequest, но я бы не стал этого делать.

Я написал httpmodule, который берет эти данные и использует их для аутентификации пользователя. Можно ли использовать тот же модуль или другой модуль для удаления этих «плохих» значений в данных поста до этого? данные "проверены"?

В противном случае, если ни одна из этих идей не сработает, я открыт для других предложений.

Ответы [ 3 ]

8 голосов
/ 18 июля 2009

Да. В следующем классе реализован интерфейс IHttpModule, а также регистры и события, которые сработают до того, как произойдет проверка HttpRequestValidationException. Он проверяет, что запрос является POST и что «testinput» не равен NULL, а затем HTML кодирует его. Класс должен быть зарегистрирован в вашем Web.config как httpModule.

Класс ...

using System;
using System.Collections.Specialized;
using System.Reflection;
using System.Web;

public class PrevalidationSanitizer : System.Web.IHttpModule
{
    private HttpApplication httpApp;

    public void Init(HttpApplication httpApp)
    {
        this.httpApp = httpApp;
        httpApp.PreRequestHandlerExecute += new System.EventHandler(PreRequestHandlerExecute_Event);
    }

    public void Dispose() { }

    public void PreRequestHandlerExecute_Event(object sender, System.EventArgs args)
    {
        NameValueCollection form = httpApp.Request.Form;

        Type type = form.GetType();

        PropertyInfo prop = type.GetProperty("IsReadOnly", BindingFlags.Instance 
            | BindingFlags.IgnoreCase | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);

        prop.SetValue(form, false, null);

        if (httpApp.Request.RequestType == "POST" != null 
            && httpApp.Request.Form["testinput"])
                httpApp.Request.Form.Set("testinput"
                    , httpApp.Server.HtmlEncode(httpApp.Request.Form["testinput"]));
    }
}

web.config entry ...

<system.web>
  <httpModules>
    <add type="PrevalidationSanitizer" name="PrevalidationSanitizer" />
...
0 голосов
/ 13 июля 2009

Звучит как много хлопот. Что такого плохого в использовании validateRequest пометки уровня страницы?

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

0 голосов
/ 28 июня 2009

Я бы соблазнился вычеркнуть плохую схему размещения XML-данных в полевом посте через HTML-форму. Я понимаю, что вы хотите портировать "без проблем", что, как я понимаю, означает, что вы хотите иметь возможность поддерживать как ASP, так и ASPX-страницы некоторое время. Однако в этом случае вам следует рассмотреть возможность одновременного изменения как формы, так и цели действия формы.

Полагаю, это похоже на совет, который я дал здесь . Только в этом случае ситуация ухудшается тем, что шаблон кода в исходном ASP не соответствует желаемому, даже в пределах ограничений классического ASP.

Если вы не хотите полностью переносить форму ASP и ее страницу действий одновременно, рассмотрите возможность изменения страницы ASP, чтобы использовать XHR для отправки XML в ashx, который помещает XML в безопасное место и возвращает GUID. Поместите возвращенный GUID в скрытое поле вместо поля, в котором изначально содержался XML. На принимающей странице ASPX используйте GUID для получения ранее отправленного XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...