这里似乎有两种驱动力。你想告诉最终用户什么,你不想告诉攻击者什么。您可以披露的最具破坏性的信息可能是与错误输出相关的任何时间信息。
再说一次,在一些 CSRF 攻击中,错误是可见的,而在其他攻击中,错误可能被抑制或隐藏。这会让我想在高安全性站点中执行这些操作:
起初,我喜欢这里的建议,即进入“编辑”屏幕,允许用户验证正在尝试的更改。然后我想到了点击劫持的可能性,以及这如何消除它的任何好处。再说一次,我不想在我的网站上启用不受支持的“功能”,外部用户可以代表某人预先填写表格。如果需要,我会为此目的提供一个专用端点。
到目前为止,我在处理错误时喜欢的其他操作包括:
尽管大多数实现都允许使用种子,但 ASP.NET MVC 尤其可以轻松地在整个站点中实现常量(编译入)种子。这constant可能会鼓励攻击者尝试猜测您的种子是什么。为了防止这种情况,我粘贴了一些 ASP.NET MVC 代码来解决一些问题
首先,请查看此博客以了解基本实现。然后OnAuthorization像这样修改方法
protected override void OnAuthorization(AuthorizationContext filterContext)
{
TimeSpan maxSleepDuration = new TimeSpan(0, 0, 0, 0, 700); //Errors will always take 700ms
DateTime timeStart = DateTime.UtcNow;
base.OnAuthorization(filterContext);
string httpMethodOverride = filterContext.HttpContext.Request.GetHttpMethodOverride();
if (this._verbs.Verbs.Contains(httpMethodOverride, StringComparer.OrdinalIgnoreCase))
{
try
{
this._validator.OnAuthorization(filterContext);
}
catch (HttpAntiForgeryException e)
{
//todo: Custom actions here? Track the IP? Referrer? Do special actions based on IP?
TimeSpan timespent = DateTime.UtcNow - timeStart;
int sleepDuration = maxSleepDuration.Milliseconds - timespent.Milliseconds;
if (sleepDuration > 0 && sleepDuration != System.Threading.Timeout.Infinite)
System.Threading.Thread.Sleep(sleepDuration);
//todo: Error here, or redirect back to validation screen
throw e;
}
}
}
最后,您可能希望验证您的MachineKey 未设置为autogenerate ,并确保在您的 ITOps 计划中轮换此密钥。