.net - 如何在 .NET 中使用此类标头或查询参数禁用动词隧道?
问题描述
我的安全扫描失败,说我的 .NET 应用程序允许动词隧道,建议禁用它。应用程序需要接受 PUT 和 DELETE 标头以及 GET 和 POST。
扫描将这些标头发送到接受 POST 的端点:
X-HTTP-METHOD: PUT
X-HTTP-Method-Override: PUT
X-METHOD-OVERRIDE: PUT
我做了很多研究,并且很难找到“禁用”动词隧道的方法。似乎需要允许这些方法,而不是相反。
例如,在 .NET 中,HttpMethodOverrideExtensions 方法允许使用这些类型的标头。我看到了多个关于如何允许上面发布的三个标题的教程。
我的回复是否正确,默认情况下应用程序不允许动词隧道,因为允许它的方法不在应用程序的代码库中?
解决方案
我只有用 Java 解决这个问题的经验,但我希望我的解决方案有一些对 .NET 的翻译,对你有帮助。您似乎遇到了 Fortify 的 WebInspect 扫描程序报告的“经常被误用:HTTP 方法覆盖”问题。为了为我的团队解决这个问题,我实现了一个过滤器来监听我们的错误标头(x-http-method、x-http-method-override、x-method-override),将状态设置为 405 并在找到它们时中断。请参阅下面的代码。我知道这不是最优雅的解决方案,但它是我发现的唯一一个满足扫描的解决方案(抛出错误并引导用户不满意)。
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest hsReq = (HttpServletRequest) req;
HttpServletResponse hsRes = (HttpServletResponse) res;
hsRes.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
hsRes.setHeader("Pragma", "no-cache");
hsRes.setDateHeader("Expires", 0);
hsRes.setHeader("X-XSS-Protection", "1; mode=block");
hsRes.addHeader("X-Content-Type-Options", "nosniff");
hsRes.setHeader("Content-Security-Policy", "frame-ancestors 'none'; default-src *; style-src 'self' http://* 'unsafe-inline'; script-src 'self' http://* 'unsafe-inline' 'unsafe-eval'");
hsRes.setHeader("X-FRAME-OPTIONS", "DENY");
hsRes.setHeader("Strict-Transport-Security", "max-age=31536000; includeSubDomains;");
// This resolves "Often Misused: HTTP Method Override"
hsRes.setHeader("Access-Control-Allow-Methods", "GET, POST");
String methodParam = hsReq.getParameter("_method");
if (methodParam != null){
LOG.error("\n Bad actor is attempting to use HTTP Method Tunneling. \n");
hsRes.reset();
hsRes.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
return;
}
String xhmHeader = hsReq.getHeader("x-http-method");
String xhmoHeader = hsReq.getHeader("x-http-method-override");
String xmoHeader = hsReq.getHeader("x-method-override");
if ((xhmHeader != null) || (xhmoHeader != null) || (xmoHeader != null)){
LOG.error("\n Bad actor is attempting to use HTTP Method Tunneling. \n");
hsRes.reset();
hsRes.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
return;
}
chain.doFilter(req, res);
}
推荐阅读
- python-3.x - 使用 wget 下载 .xlsx 文件时出现奇怪的错误
- python - 如何用 pandas 构造向量化函数?
- android - 注册 contentObserver 以获取电池优化更改
- mongodb - 字段 authorMongoRepository 需要找不到类型的 bean
- powershell - 将 PBI Desktop 数据集转换为推送数据集
- javascript - 如何创建一个框架来显示/导航来自我的外部网站的 GitHub 存储库?
- html - 标题未在横向视图中显示
- azure-pipelines - 运行使用来自 Visual Studio 和 Azure DevOps 的应用设置的 XUnit 集成测试
- angular - 离子电容器文件系统 api 在内部存储中写入个人文件夹
- django - 我在尝试保存我的 Django 表单时收到 Key 错误消息。我无法将 Django 表单中的数据保存到数据库