保护Servlet应用程序中的内部视图层模板页面

时间:2020-03-06 14:57:31  来源:igfitidea点击:

关于Java中的MVC Web应用程序,我有一个非常基本的问题。

从原始JSP的古老年代一直到Seam等当前技术,最基本的模式一直是控制器的内部调度,该控制器最初接受请求到视图层,该视图层创建要发送到客户端的输出。

通常通过使用URL向Servlet容器请求新资源来完成此内部调度(尽管该机制可能会通过额外的配置层隐藏)。这些URL的映射是通过相同的web.xml完成​​的,该web.xml也将"真实" URL定义到外部。

除非采取特殊措施,否则通常可以直接直接访问视图层。见证Seam的"注册"演示,我们可以绕过" register.seam"并直接转到" registered.xhtml"。这是一个潜在的安全问题。至少,它泄漏了视图模板源代码。

我知道这只是一个基本的示例应用程序,但是奇怪的是,需要采取任何额外措施来声明这些内部资源对外部不可见。

限制URL入口点的最简单方法是什么?

是否有类似" WEB-INF"目录的内容,这是一个只能由内部请求访问的不可思议的URL路径组件?

解决方案

我不建议允许Internet请求直接访问应用服务器。我将网络服务器放在前面,然后在其中允许某些类型的URL的请求。不想让人们去foo.com/jsps吗?一劳永逸地限制在那里。

这里有一个关于这个话题的话题:隐藏在WEB-INF后面的页面?

解决此问题的一种方法是构造一个Servlet过滤器,该过滤器检查每个请求的请求路径并相应地处理每个请求。这是一个链接,可以入门,使用JSP的JavaServer Pages(JSP)和JSTL访问控制

我们可以通过在web.xml部署描述符中使用security-constraint来阻止对内部资源的访问。

例如,我使用以下配置来防止直接访问JSP:

<!-- Prevent direct access to JSPs. -->
<security-constraint>
    <web-resource-collection>
        <web-resource-name>JSP templates</web-resource-name>
        <url-pattern>*.jsp</url-pattern>
    </web-resource-collection>
    <auth-constraint/> <!-- i.e. nobody -->
</security-constraint>

现在,我看到了一些将其内部JSP放入" WEB-INF / jsp"中的应用程序。至少对于JSP以及Velocity而言,这样做似乎都是可行的。但是,它似乎不适用于JSF。