我是.Net Core的初学者,正在寻找一种解决方案来保护应用程序免受IE攻击。
我在控制器中使用了以下代码:
string userAgent = Request.Headers["User-Agent"].ToString();
var flagsIE = new [] {"MSIE", "Trident"};
if(flagsIE.Any(userAgent.Contains)){
return RedirectToAction("BadBrowser");
}
现在,如果有人尝试使用IE访问该页面,他们将被重定向到一个信息页面,要求他们使用现代的浏览器。与其将代码添加到每个Controller.cs中,我不希望在项目级别上添加它,以便使其独立于项目中的位置而执行。
而且,我知道可以通过_Layout.cshtml实现,我的问题是:我将在何处以及如何实现一个函数,以使其随项目一起在所有请求的视图中执行,而无需在Controller中添加每个请求。
谢谢你。
UPDATE:正如Icepickle在评论中建议的那样,我在Startup.cs
中使用了中间件并获得了预期的结果:
app.Use(async (context,next) =>
{
string userAgent = context.Request.Headers["User-Agent"].ToString();
var IEkeywords = new [] {"MSIE", "Trident"};
if (IEkeywords.Any(userAgent.Contains)){
context.Response.Redirect("/IE/redirect/badbrowser.html");
return;
}
await next();
});
永远不要那样做。排除具有重定向的浏览器是导致大量用户代理欺骗的原因。有效地使该AgentId无用。而且按照您编写它的方式,您可能会得到很多假阳性。
从互联网的早期开始也是一个坏主意,我们希望摆脱它:https://en.wikipedia.org/wiki/User_agent#User_agent_spoofing
您可以尝试在_Layout.cshtml中添加js以检测浏览器为IE:
<script>
var isIE = false || !!document.documentMode;
if (isIE) {
window.location.href = "/Home/ForbidInfo";
}
</script>
然后在Home控制器下创建一个名为ForbidInfo
的视图,该视图向用户显示他无法使用IE显示视图的消息。
((注意:此视图的布局必须为null,否则它将进入无穷循环)]
@{
ViewData["Title"] = "ForbidInfo";
Layout = null;
}
<h1>Please use a modern browser!</h1>
这些设置之后,当您在IE中运行视图时,它将被重定向到FordidInfo页面。
如果您的页面不使用_layout,则需要在相应的视图上分别添加js,以确保它不会在IE中显示。