Как исправить неправильную нейтрализацию последовательностей CRLF в заголовках HTTP («Разделение ответа HTTP»)

После запуска VeraCode он сообщил о следующей ошибке «Неправильная нейтрализация последовательностей CRLF в заголовках HTTP («Разделение ответа HTTP»)» в следующем фрагменте кода:

protected override void InitializeCulture() {
        //If true then setup the ability to have a different culture loaded
        if (AppSettings.SelectLanguageVisibility) {
            //Create cookie variable and check to see if that cookie exists and set it if it does.
            HttpCookie languageCookie = new HttpCookie("LanguageCookie");
            if (Request.Cookies["LanguageCookie"] != null)
                languageCookie = Request.Cookies["LanguageCookie"];

            //Check to see if the user is changing the language using a query string.
            if (Server.UrlDecode(Request.QueryString["l"]) != null)
                languageCookie.Value = Server.UrlDecode(Request.QueryString["l"]);

            //Check to make sure the cookie isn't null and set the culture variable to auto if it is and the value of the cookie if it isn't.
            if (languageCookie.Value == null)
                languageCookie.Value = string.Empty;

            string culture = languageCookie.Value.ToString();
            if (string.IsNullOrEmpty(culture))
                culture = "Auto";

            //Use to set the Culture and UI Culture.
            this.UICulture = culture;
            this.Culture = culture;
            if (culture != "Auto") {
                //If culture is changed set the new Current Culture and CurrentUICulture.
                System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo(culture);
                System.Threading.Thread.CurrentThread.CurrentCulture = ci;
                System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
            }

            //Update the cookie value with the new culture and initialize the culture.
            Response.Cookies.Set(languageCookie);
            Response.Cookies["LanguageCookie"].Expires = DateTime.Now.ToLocalTime().AddYears(1);
            Response.Cookies["LanguageCookie"].HttpOnly = true;
        }
        else {
            //Else keep language as English if localization is not enabled.
            this.UICulture = "en";
            this.Culture = "en";
        }

        base.InitializeCulture();
    }

В отчете указана строка, содержащая следующий код:Response.Cookies.Set(languageCookie); Какое исправление можно использовать для устранения этой ошибки?

Спасибо


person piterskiy    schedule 24.02.2014    source источник
comment
Я знаю, что это старый вопрос, но если вы нашли решение, было бы неплохо, если бы вы отметили ответ как принятый. (Если ни один не подходит, вы можете добавить свой собственный и выбрать его.)   -  person jacobq    schedule 16.11.2017


Ответы (6)


Самый простой способ устранить эту проблему — использовать ESAPI httputilities, присутствующие в esapi jar. Ты можешь использовать

ESAPI.httpUtilities().setHeader(response,param,value);
ESAPI.httpUtilities().addCookies(response, param,value);

и аналогичные методы для других задач. Вам нужно будет установить ESAPI.properrties в вашем пути к классам. Именно так мы реализовали для Java. Те же функции доступны и для других языков.

Никакой дополнительной работы не требуется, и это решит проблему в veracode.

person Tarun    schedule 15.04.2014
comment
это джава. С# не использует ESAPI. - person RG-3; 04.02.2018
comment
Да, это Java, возможно, нам нужно сделать спин-офф здесь. В любом случае текущая подпись для addCookie: ESAPI.httpUtilities().addCookie(response, cookie); - person devwebcl; 18.04.2018
comment
@devwebcl: мне нужна дополнительная библиотека для .NET :) - person Tarun; 31.10.2019
comment
Пожалуйста, найдите последние методы, доступные в ESAPI.jar для Java;1. addCookie (файл cookie) 2. addCookie (ответ HttpServletResponse, файл cookie) - person Panneerselvam; 18.11.2020

Я считаю, что проблема в том, что линия

languageCookie.Value = Server.UrlDecode(Request.QueryString["l"]);

принимает (ненадежный) пользовательский ввод (т.е. Request.QueryString["l"]). Попробуйте добавить вызов функции для удаления любых символов возврата каретки или перевода строки (включая их закодированные эквиваленты, такие как %0d и %0a) из этого параметра строки запроса, прежде чем сохранять его в languageCookie.

Например, вы можете попробовать изменить эту строку на:

languageCookie.Value = Server.UrlDecode(Request.QueryString["l"])
                         .Replace("\r", string.Empty)
                         .Replace("%0d", string.Empty)
                         .Replace("%0D", string.Empty)
                         .Replace("\n", string.Empty)
                         .Replace("%0a", string.Empty)
                         .Replace("%0A", string.Empty);

хотя это, вероятно, следует немного почистить (в настоящее время я не программист на С#).

Смотрите также

person jacobq    schedule 12.04.2014

Это выглядит как ложное срабатывание, поскольку ASP.Net автоматически проверяет заголовки ответов и кодирует символы CRLF, когда параметр конфигурации EnableHeaderChecking имеет значение true (значение по умолчанию). Это доступно, начиная с версии 2.0 .Net. framework, а также защитит заголовок ответа от символов CRLF, присутствующих в имени файла cookie.

Рекомендации:

Я понимаю, что сканер не может быть уверен, что настройки сервера будут правильными, поэтому я провел несколько тестов с функцией, которая заменяет любые символы CRLF из строки, используемой в имени файла cookie, но Veracode просто не примет ее.

Похоже, что сканер будет принимать код очистки только из заранее определенного списка утилит. Я провел довольно много тестов с URLEncode (который будет кодировать символы CRLF) из нескольких утвержденных утилит, но пока безуспешно.

Рекомендации:

person mrcandido    schedule 04.10.2018

Описание

Вызов функции содержит ошибку разделения ответа HTTP. Запись недезинфицированного пользовательского ввода в HTTP-заголовок позволяет злоумышленнику манипулировать HTTP-ответом, отображаемым браузером, что приводит к отравлению кеша и атакам межсайтового скриптинга.

Рекомендации

Удалите неожиданные возвраты каретки и переводы строк из предоставленных пользователем данных, используемых для создания ответа HTTP. Всегда проверяйте введенные пользователем данные, чтобы убедиться, что они соответствуют ожидаемому формату, по возможности используя процедуры централизованной проверки данных.

Код выпуска

response.setHeader(headerKey,headerValue); 
response.addHeader(headerKey, headerValue);

Фиксированный код

DefaultHTTPUtilities httpUtilities = new DefaultHTTPUtilities(); 
httpUtilities.setHeader(headerKey,headerValue); 
httpUtilities.addHeader(response, headerKey,headerValue);
person Baskar Madasamy    schedule 12.11.2015
comment
Что такое объект DefaultHTTPutilities? В какой библиотеке он находится? Это сторонний объект? Открытый источник? - person scott.korin; 15.12.2015
comment
Здесь есть проблема, длина headerKey как в setHeader, так и в addHeader жестко запрограммирована, setHeader равен 50, addHeader равен 20. Но я хочу добавить заголовок, длина которого превышает 20..., это всегда терпит неудачу. Даже если я переопределю addHeader, response.addHeader также вызовет проблему с veracode... Есть идеи? - person Ron; 26.09.2018
comment
Этот ответ выглядит так, как будто он был скопирован и вставлен из документации VeraCode для этого правила сканера. Какую новую информацию вы добавляете сюда? - person jacobq; 31.01.2019

Один вкладыш для замены всех символов, вызывающих CRLF, с использованием StringUtils. Меня устраивает

StringUtils.replaceEach(strForCRLF, new String[] { "\n", "\r", "%0d", "%0D", "%0a", "%0A" }, new String[] { "", "", "", "", "", "" });

person harshal bhavsar    schedule 17.04.2017

В Asp.Net вы должны проверить две вещи: сначала файлы cookie должны быть только http. Вы можете указать это в своей веб-конфигурации.

<httpCookies httpOnlyCookies="true"/>

и после этого убедитесь, что вы очистили то, что вы сохраняете в своих файлах cookie, например

HttpCookie cookies=new HttpCookies("key",Sanitizer.GetSafeHtml(value));

Этот класс дезинфицирующего средства взят из библиотеки ANtixss. Для получения дополнительной информации вы можете проверить эту ссылку Неправильная нейтрализация последовательностей CRLF в заголовках HTTP ("Разделение ответа HTTP") (CWE ID 113)

person Shubham    schedule 25.05.2019