Вопрос по asp.net, asp-classic – Можно ли удалить некоторые данные с помощью HttpModule?

5

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

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

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

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

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

Ваш Ответ

3   ответа
8

а также регистрирует и регистрирует событие, которое сработает до того, как произойдет проверка 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" />
...
А, это умно! Я не знал, что вы можете сделать объект формы доступным для записи. Я думаю, что решение проблемы Дейва было бы проанализировать учетные данные безопасности и удалить их из объекта коллекции Form с помощью Form.Remove () Alex
Как хорошо, отметив это как ответ, однако я сам не проверял Dave
Я проверил это, и это сработало как прелесть, однако я никогда раньше не изменял объекты, доступные только для чтения, поэтому я не уверен в последствиях этого, однако подозреваю, что коллекции в запросе сделаны для чтения. только по природе того, что они есть, а не потому, что они должны быть. MyItchyChin
Параметры формы / запроса существуют где-нибудь еще в памяти? Или коллекция Form является единственным их источником? John Bubriski♦
@ JohnBubriski - Да, свойство Request.Params возвращает коллекцию NameValueCollection, являющуюся объединением HttpValueCollections QueryString, Form, Cookies и ServerVariables. Это Lazy, поэтому объединенная коллекция создается при первом обращении к свойству. Исходные данные HTTP POST также существуют в необработанном формате, поэтому их можно повторно проанализировать для создания исходных коллекций. MyItchyChin
0

validateRequest пометить уровень страницы?

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

так как клиент может опубликовать эти учетные данные на любой странице, я должен отключить проверочный запрос для каждой страницы Dave
Я собирался предложить фильтр для входного потока, но у него есть свой собственный набор проблем, с которыми приходится иметь дело. CptSkippy имеет хорошее решение! Alex
0

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

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

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

Приложение, которое публикует данные, я не могу контролировать. Я планирую перевести все приложение вендора из asp в aspx. Я жду ответа на него и надеюсь, что мне удастся изменить действие формы, но я точно не знаю, насколько гибким будет отдел. Dave

Похожие вопросы