0

我需要有关如何在我当前的 Java 网站上获得最大安全性的建议。

我已经将这两个应用程序部署在 Centos6 服务器上端口 8080 上的一个 tomcat-7 实例下。

.war 文件

  • website.war(上下文名称为 ROOT)
  • processor.war(上下文名称是处理器)

批处理罐

  • 批处理.jar

安全要求

  • website.war 可公开访问。无需安保
  • processor.war 从 website.war 获取 HTTP 请求并返回结果以供网站显示给用户。
  • batch.jar 在服务器的后台运行,所以我猜除了安全服务器之外不需要任何安全性。

目前我已添加到 processor.war 的 web.xml 以保护以下内容

  • 只有在 tomcat-users.xml 文件中设置了 user 和 pass 的请求才能访问 /process url。
  • 只有在 tomcat-users.xml 文件中设置了 user 和 pass 并设置了 'admin' 角色的请求才能访问 /admin url。

这是我对 processor.war 的 web.xml 文件的配置。

  <security-constraint> 
    <web-resource-collection> 
        <web-resource-name>Admin</web-resource-name> 
        <url-pattern>/*</url-pattern> 
    </web-resource-collection>
    <auth-constraint> 
        <role-name>admin</role-name> 
    </auth-constraint>
 </security-constraint> 
  <security-constraint> 
    <web-resource-collection> 
        <web-resource-name>Public</web-resource-name> 
        <url-pattern>/processor/process*</url-pattern> 
    </web-resource-collection>
    <auth-constraint>
        <role-name>user</role-name>
        <role-name>admin</role-name>
    </auth-constraint>
  </security-constraint>

这足够安全吗?我读过攻击者可以欺骗请求并读取 HTTP 请求中的密码。我只想真正保护processor.war,以便

  • 只有 website.war (localhost:8080) 可以将请求发布到 processor.war localhost:8080/processor/process
  • 并且只有管理员用户可以访问 localhost:8080/processor/admin 页面。

有人可以告诉我是否需要更多的安全性,如果是,我能做些什么来保护它?

4

1 回答 1

0

我是如何理解架构的,您将前端与后端分开。前端没有安全漏洞,但您想保护后端服务(或一些 html、css、js 文件,如果存在)

如果您可以以可理解的方式做到这一点,请解释为什么需要这种方法?

Tomcat 是一个 Servlet 容器,这意味着这里的所有东西都是纯 Java。这就是您可以轻松保护您喜欢的任何 URL 的原因。或者您可以构建自我(自定义)角色或基于权限的安全系统。此外,在过滤器接口的帮助下,您可以过滤应用服务器特定应用程序 (WAR) 中任何请求的文件的任何 URL。

这是一个简短的例子:

@WebFilter("/secured/*")
public class LoginFilter implements Filter {

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println(" loginFilter servlet begin ");
          HttpServletResponse httpResponse = (HttpServletResponse) response;
          HttpServletRequest httpRequest = (HttpServletRequest) request;
          String URI = ((HttpServletRequest)request).getRequestURI();
          HttpSession session =httpRequest.getSession(false);
          String emailFromWeb = null;
          String loginURL = httpRequest.getContextPath() + "/login.html";
          String rootURL = httpRequest.getContextPath() + "/secured/root.html";
          String userURL = httpRequest.getContextPath() + "/secured/user.html";
          String logoutURL=httpRequest.getContextPath() + "/logout";

          if(session==null){
              System.out.println("false inquery session is null");
              httpResponse.sendRedirect(loginURL);
              return;

          }
          emailFromWeb  = session.getAttribute("email").toString();     

          System.out.println(" email from Session "+emailFromWeb);


              if  (httpRequest.getRequestURI().equals(loginURL)){
                  System.out.println("login page inquery");
                  chain.doFilter(request, response);
                  return;
              } 
              if(httpRequest.getRequestURI().matches(".*(css|jpg|png|gif|js)")){
                    System.out.println(" inquery by "+httpRequest.getRequestURI());
                    chain.doFilter(request, response);
                    return;
                }

              if (httpRequest.getRequestURI().equals(rootURL)&&Authentication.isPermitted(emailFromWeb, "RootPage")) {
                  System.out.println("root page inquery");
                  chain.doFilter(request, response);
                  return;
              } 

              else if(httpRequest.getRequestURI().equals(userURL)&&Authentication.isPermitted(emailFromWeb, "UserPage")){
                  System.out.println("user page inquery");
                  chain.doFilter(request, response);
                  return;
              }
              else if(httpRequest.getRequestURI().equals(logoutURL)){
                  System.out.println("logout inquery");
                  httpResponse.sendRedirect(loginURL);
                  return;
              }
              else {
                  System.out.println("false inquery");
                  httpResponse.sendRedirect(loginURL);
                  return;
              }



    }
}
于 2016-05-13T23:48:52.480 回答