6

运行 VeraCode 后,在以下代码片段中报错“Improper Neutralization of CRLF Sequences in HTTP Headers ('HTTP Response Splitting')”:

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); 可以使用什么修复程序来消除该错误?

谢谢

4

6 回答 6

6

消除此问题的最简单方法是使用 esapi jar 中的 ESAPI httputilities。您可以使用

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

以及其他任务的类似方法。您需要在类路径中设置 ESAPI.properrties。这是我们为 Java 实现的方式。其他语言也可以使用相同的功能。

不需要额外的工作,它将解决 veracode 中的问题。

于 2014-04-15T06:04:46.830 回答
5

我相信问题是因为线路

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

接受(不受信任的)用户输入(即Request.QueryString["l"])。尝试添加一个函数调用以从该查询字符串参数中删除任何回车符或换行符(包括它们的编码等效项,例如%0dand ),然后再将其存储到.%0alanguageCookie

例如,您可以尝试将该行更改为:

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

虽然这可能应该清理一下(我现在不是 C# 程序员)。

也可以看看

于 2014-04-12T17:40:28.070 回答
2

看起来像是误报,因为当配置选项EnableHeaderChecking为 true(默认值)时,ASP.Net 将自动检查响应标头并编码 CRLF 字符。这从 .Net 框架的 2.0 版开始可用,并且还将保护响应针对 cookie 名称中存在的 CRLF 字符的标头。

参考:

我知道扫描仪不能相信服务器设置是正确的,所以我用一个函数做了一些测试,该函数替换了 cookie 名称中使用的字符串中的任何 CRLF 字符,但 Veracode 根本不会接受它。

扫描器似乎只接受来自预定义实用程序列表的清理代码。我从一些批准的实用程序中使用 URLEncode(它将对 CRLF 字符进行编码)进行了很多测试,但没有运气。

参考:

于 2018-10-04T02:12:20.643 回答
0

在 Asp.Net 中,您必须首先检查两件事 cookie 必须是 httponly 。您可以在 webconfig 中指定

<httpCookies httpOnlyCookies="true"/>

然后确保你已经清理了你保存在你的cookies中的东西,比如

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

这个消毒剂类来自 ANtixss 库。有关详细信息,您可以查看此链接 HTTP 标头中 CRLF 序列的不正确中和('HTTP 响应拆分')(CWE ID 113)

于 2019-05-25T04:03:42.660 回答
0

使用 StringUtils 替换导致 CRLF 的所有字符的衬线。这个对我有用

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

于 2017-04-17T08:19:59.330 回答
0

描述

函数调用包含 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);
于 2015-11-12T07:09:38.123 回答