我正在网站上进行安全检查,我们有一些代码可以执行以下操作:
<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/