从2018年6月4日开始,我们的生产站点开始接收包含无效值Cookie的请求:
_a_d3t6sf="duUt#<WFf>>nD=9O&lG9y)DN"
值不同,但是所有请求的名称都相同。
异常看起来像这样:
System.Web.HttpRequestValidationException (0x80004005): A potentially dangerous Request.Cookies value was detected from the client (_a_d3t6sf="xdZ<et[)27rL^5lBe6rL_<[...").
at System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection)
at System.Web.HttpRequest.ValidateCookieCollection(HttpCookieCollection cc)
at System.Web.HttpRequest.get_Cookies()
at System.Web.HttpRequest.FillInParamsCollection()
at System.Web.HttpRequest.GetParams()
at System.Web.HttpRequest.get_Params()
at ASP._sites__shared_svc_getstrings_aspx.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in ___\getStrings.aspx:line 6
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
at System.Web.UI.Page.Render(HtmlTextWriter writer)
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
at System.Web.UI.Page.ProcessRequest()
at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context)
at System.Web.UI.Page.ProcessRequest(HttpContext context)
at ASP._sites__shared_svc_getstrings_aspx.ProcessRequest(HttpContext context) in ___\root\3403aaf9\baa39378\App_Web_zbqbtb3n.2.cs:line 0
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
在我们的代码中没有这样的cookie,在请求之前没有表单发布或我们可以验证的任何内容。我们的配置中有验证模式2.0
<httpRuntime targetFramework="4.5" requestValidationMode="2.0" />
所以只有.aspx页会抛出该异常。其中之一是西班牙在线支付系统的回调页面。而且它也从真实的支付系统服务器上获得了该cookie-已经完成付款,请求已发送给我们,但由于该cookie而无效。
有三个.aspx页面,它们是样式,脚本和javascript本地化字符串的最小化源。因此,一次完整页面加载每次都会引发三个异常,但是只有少数客户端具有此cookie。在我们的计算机上,我们无法复制它。
所以:
1.我们没有添加或读取该cookie的东西。
2.并非每个客户都拥有它。
3.来自在线支付服务的安全请求每天都会发送支付数据,但也会有一次Cookie。
4.今天已安装所有Windows更新,包括.net安全性-没有任何变化。
5.我们无法关闭验证。
6.最近一次代码更改是在一个月前完成的,而所有这些更改大约是在两周前开始的。
寻找任何想法和建议。谢谢。
答案 0 :(得分:0)
也许您正在使用zp.js
或pluso-like.js
插件。
他们进行一些可疑的活动,并加载添加了_a_d3t6sf
cookie的'processor.js'脚本。如果客户很幸运,他将获得
duu2BAdLFlYTaTgr_h4WB6
但如果不是,他将获得不安全的Cookie值,如
duu2BAdLFlYTaT#^ 0 [AZ?WB6
关于pluso.ru的一些article
答案 1 :(得分:0)
我对此和所有可能的第三方无效cookie的解决方案:
1)复制或反映CrossSiteScriptingValidation.cs类,该类用于在框架内部验证HttpRequest:
https://referencesource.microsoft.com/#System.Web/CrossSiteScriptingValidation.cs,3c599cea73c5293b
2)在
protected void Application_BeginRequest( Object sender, EventArgs e ){}
验证cookie
// Validate and remove all invalid cookies
try
{
for( var i = Request.Cookies.Count - 1; i >= 0; i-- )
{
var cookie = Request.Cookies.Get( i );
if( string.IsNullOrWhiteSpace( cookie?.Value ) )
{
continue;
}
if( CrossSiteScriptingValidation.IsDangerousString( cookie.Value ) )
{
Request.Cookies.Remove( cookie.Name );
// Remove cookie from client
Response.Cookies.Add( new HttpCookie( cookie.Name ) { Expires = DateTime.Now.AddDays( -1d ) } );
}
}
}
catch( Exception ex )
{
Log.Error( "Failed to validate cookies. ", ex );
}