java - 从安全来源获取请求主机名?

标签 java jsp tomcat

我正在网站上进行安全检查,我们有一些代码可以执行以下操作:

<link rel="stylesheet" href="<%=request.getScheme()%>://<%=request.getServerName() %>:<%=request.getServerPort()%><%= request.getContextPath() %>/css/<fmt:bundle basename="version"><fmt:message key="build.date"/><fmt:message key="js.path.separator"/></fmt:bundle>${relativePath}" media="all" type="text/css" />

其根本原因是构造一个包含构建版本的 CSS 路径,以强制浏览器加载最新的 CSS 文件并避免缓存问题。

不幸的是,构造的第一部分使用request.getServerName() 来构造URL。事实证明,这指的是来自传入请求的 HOST header 。这是一个安全漏洞,因为 header 可以被欺骗,导致生成的链接指向另一个站点而不是本地站点。

有没有更安全的方法来做到这一点?我考虑过在应用程序上下文中放置一个值,但想知道是否有更好的方法来做到这一点。

最佳答案

您不需要方案、服务器名称或服务器端口来构造您的 URL,因为它们都默认与当前请求相关。

如果您在 https://example.com:8081/project/pages/things.html 有一个页面然后像你的例子中的一个链接/project/css/<version><build-date>.css解析为 https://example.com:8081/project/css/<version><build-date>.css不管怎样,所以你可以把那些部分去掉

<link rel="stylesheet" href="<%= request.getContextPath()
     %>/css/<fmt:bundle basename="version">
            <fmt:message key="build.date"/>
            <fmt:message key="js.path.separator"/>
            </fmt:bundle>${relativePath}" media="all" type="text/css" />

关于java - 从安全来源获取请求主机名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45806133/

相关文章:

Java 扩展一般指定的类型

java - 处于等待状态的线程 - Apache Tomcat

java - Apache Felix @Reference 注解问题

apache - Tomcat 默认页面

java - 如何在控制台中每行打印特定数量的字符?

java - 关于使用 jsp 创建管理页面的建议

java - 使用 Spring "forward:"前缀导致 StackOverflowError

Tomcat7 .war 项目未部署

session - 如何在 Tomcat 中保持 HttpSession 事件?

java - 哪个配置文件告诉 Tomcat 安装 JRE 的位置?