运行VeraCode后,它在以下代码片段中报告了以下错误“HTTP标头中的CRLF序列中断不正确('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); 可以使用什么修复来消除该错误?
感谢的
答案 0 :(得分:4)
我认为问题是因为行
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);
虽然这应该可以稍微清理一下(我现在不是C#程序员)。
另见
答案 1 :(得分:3)
删除此问题的最简单方法是使用esapi jar中的ESAPI httputilities。 你可以使用
ESAPI.httpUtilities().setHeader(response,param,value);
ESAPI.httpUtilities().addCookies(response, param,value);
和其他任务的类似方法。您需要在类路径中设置ESAPI.properrties。这是我们为Java实现的方式。其他语言也可以使用相同的功能。
不需要额外的工作,它将解决veracode中的问题。
答案 2 :(得分:1)
这看起来像是误报,因为当配置选项 EnableHeaderChecking 为true(默认值)时,ASP.Net会自动检查响应标头并编码CRLF字符。此版本自2.0版开始提供。 .Net框架,还将保护响应标头免受cookie名称中存在的CRLF字符的影响。
参考文献:
我了解扫描仪不能相信服务器设置正确,所以我去做了一些测试,使用了一个功能,该功能可以替换cookie名称中使用的字符串中的所有CRLF字符,但是Veracode根本不会接受它。
似乎扫描仪将只接受预定义的实用程序列表中的清理代码。我使用了一些已批准的实用程序对URLEncode(将对CRLF字符进行编码)进行了很多测试,但还是没有成功。
参考文献:
答案 3 :(得分:0)
使用StringUtils替换导致CRLF的所有字符的一个衬垫。它对我有用
StringUtils.replaceEach(strForCRLF,new String [] {“\ n”,“\ r”,“%0d”,“%0D”,“%0a”,“%0A”},new String [] { “”,“”,“”,“”,“”,“”}};
答案 4 :(得分:0)
在Asp.Net中,您必须检查两件事,首先cookie必须是httponly。您可以在webconfig中指定
<httpCookies httpOnlyCookies="true"/>
,然后确保已将要保存在cookie中的santant
HttpCookie cookies=new HttpCookies("key",Sanitizer.GetSafeHtml(value));
此消毒剂类来自ANtixss库。 有关详细信息,您可以检查此链接 Improper Neutralization of CRLF Sequences in HTTP Headers ('HTTP Response Splitting') (CWE ID 113)
答案 5 :(得分:-1)
描述
函数调用包含HTTP响应拆分缺陷。将未经过授权的用户提供的输入写入HTTP标头允许攻击者操纵浏览器呈现的HTTP响应,从而导致缓存中毒和crosssite脚本攻击。
建议
从用户提供的用于构造HTTP响应的数据中删除意外的回车和换行符。始终验证用户提供的输入,以确保它符合预期的格式,尽可能使用集中数据验证例程。
问题代码
response.setHeader(headerKey,headerValue);
response.addHeader(headerKey, headerValue);
固定代码
DefaultHTTPUtilities httpUtilities = new DefaultHTTPUtilities();
httpUtilities.setHeader(headerKey,headerValue);
httpUtilities.addHeader(response, headerKey,headerValue);