使用过滤器防止非法访问WEB网页

问题:一般情况下,我们需要先登录,然后进入到下一个页面,但如果有人知道文件名等方式,绕过登录,可直接去访问后续页面,针对这样的问题,可以使用过滤器Filter去操作,具体方案如下:

文章转载http://www.51testing.com/html/06/183306-124904.html

附Filter学习资料:http://www.cnblogs.com/xdp-gacl/p/3948353.html

(本文档内容为个人笔记作用,如有侵权之处,联系本人,我会删除!)

我们首先定义了一些可以通过URL直接访问的页面,如登陆页面,重登陆页面等。当用户没有登陆而尝试访问受保护的URL时,Filter将拦截该请求,并把访问的URL重定向到登陆页面。

web.xml中的配置如下:

  <filter>
    
<filter-name>filterservlet</filter-name>
    
<filter-class>com.comtop.app.common.FilterServlet</filter-class>
    
<init-param>
  
<param-name>freePages</param-name>
  
<param-value>

/Login.jsp;/LoginAction.do;/index.jsp;/ReLogin.jsp;/SSOLoginAction.do;
     
</param-value>
    
</init-param>
    
<init-param>
      
<param-name>toPage</param-name>
      
<param-value>/ReLogin.jsp</param-value>
    
</init-param>
  
</filter>
  
<filter-mapping>
    
<filter-name>filterservlet</filter-name>
    
<url-pattern>*.do</url-pattern>
  
</filter-mapping>

  
<filter-mapping>
    
<filter-name>filterservlet</filter-name>
    
<url-pattern>*.jsp</url-pattern>
  
</filter-mapping>

<filter></filter>中定义一些基本信息,比如filter的名称,filter的类以及相关初始参数。这里我们把能直接访问的页面定义为freePages,并定义了它的值。还定义了默认的重定向页面,Relogin.jsp

接着定义了filter-mapping,让后缀名为.do.jspURL都被Filter所保护。

 

FilterServlet具体代码(import部分省略):


publicclassFilterServletextendsHttpServletimplementsFilter{
 privateFilterConfig filterConfig;
 privateString[]freePages;
 privateStringtoPage=null;
 privatestaticLoggerlogger;

 /**
  * 初始化filter(这里重写父类的方法)
  * @param filterConfig FilterConfig filter配置对象
  * @throws ServletException
  */
 publicvoidinit(FilterConfigfilterConfig)throwsServletException{
  logger=Toolkit.getInstance().getLogger(this.getClass().getName());
  inti=0;
  Stringpages=null;
  StringTokenizerstrTokenizer=null;

  if(logger.isDebugEnabled()){
   logger.debug("initvalidate session filter ");
  }

  this.filterConfig=filterConfig;
  //以下从配置文件获取配置信息

  this.toPage=filterConfig.getInitParameter("toPage");
  pages=filterConfig.getInitParameter("freePages")
  if(toPage==null||pages==null||toPage.trim().length()==0||
   pages.trim().length()==0){
logger.error("web.xmlfilterServlet没有配置初始化参数\"toPage\"\"freePage\".");
   thrownewServletException("web.xmlfilterServlet没有配置初始化参数
\"toPage\"\"freePage\".");
  }
  if(logger.isDebugEnabled()){
   logger.debug("toPage"+toPage);
   logger.debug("freePages:"+pages);
  }

  strTokenizer=newStringTokenizer(pages,";");
  this.freePages=newString[strTokenizer.countTokens()];
  while(strTokenizer.hasMoreTokens()){
   freePages[i++]=strTokenizer.nextToken();
  }

  if(!isFreePage(toPage)){

logger.error("web.xmlfilter初始化参数\"toPage\"的值必须是\"freePage\"中的某个页面.");
   thrownewServletException("web.xmlfilter初始化参数\"toPage\"的值

必须是\"freePage\"中的某个页面.");
  }
 }

 /**
  * 判断一个请求URI是否是不过滤的页面
  * @param requestURI String 请求URI
  * @return boolean 返回true为不过滤页面
  */

 privatebooleanisFreePage(StringrequestURI){
  booleanisFree=false;
  for(inti=0;i<freePages.length;i++){
   if(requestURI.endsWith(freePages[i])){
    returntrue;
   }
  }
  returnisFree;
 }

 /**
  * 判断请求是否为有效Session
  * @param request ServletRequest 请求对象
  * @return boolean 返回true为有效Session
  */
 privatebooleanisValidSession(ServletRequestrequest){
  HttpServletRequest httpRequest=(HttpServletRequest)request;
  if(httpRequest.getSession().getAttribute(GlobalConstants.SECURITY_LOGIN_KEY)

==
   GlobalConstants.SECURITY_IS_LOGIN){
   returntrue;
  }
  if(logger.isDebugEnabled()){
   logger.debug("Session无效,请求:"+httpRequest.getRequestURI());
  }
  returnfalse;
 }

 /**
  * 过滤动作
  * @param request ServletRequest 请求对象
  * @param response ServletResponse 响应对象
  * @param filterChain FilterChain 过滤器链对象
  */
 publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChain

filterChain){
  StringrequestURI=null;
  ActionErrors errors=newActionErrors();
  ActionError errorSession=null;
  HttpServletRequest httpRequest=(HttpServletRequest)request;
  HttpServletResponse httpResponse=(HttpServletResponse)response;
  requestURI=httpRequest.getRequestURI();

        if(logger.isDebugEnabled()){
   logger.debug("Sessionfilter RequestURI:"+requestURI);
  }
  if(!isFreePage(requestURI)){//如果是保护页面

   if(!isValidSession(request)){//如果Session无效

    StringtoPageURL=null;
    try{
     toPageURL=httpRequest.getContextPath()+toPage;
     httpResponse.encodeRedirectURL(toPageURL);
     httpResponse.sendRedirect(toPageURL);//转发响应

    }catch(IOExceptionex){
     logger.error("Sessionfilter过滤时发生IO异常",ex);
    }
   }
  }

  if(!httpResponse.isCommitted()){//如果响应未提交,交给过滤器链

   try{
    filterChain.doFilter(request,response);
   }catch(ServletExceptionsx){
    filterConfig.getServletContext().log(sx.getMessage());
   }catch(IOExceptioniox){
    filterConfig.getServletContext().log(iox.getMessage());
   }
  }

 }
 //父类的方法

 publicvoiddestroy(){
 }
 
 publicFilterConfiggetFilterConfig(){
  returnthis.filterConfig;
 }

 publicvoidsetFilterConfig(FilterConfigfilterConfig){
  this.filterConfig=filterConfig;
 }

}


这里isFreePage方法判断用户访问的URL是否是受保护的,从配置文件中将freePages的值得到后,以分号为隔离符将它们取出放到一个数组中,这个数组存放的每个String都是一个freePage。另外,isValidSession方法判断在session中是否存在用户的登陆信息,如果用户未登陆,则返回false。每一个filterdoFilter()方法
中得到当前的requestresponse,在doFilter()方法中,以下代码完成核心判断:

  if(!isFreePage(requestURI)){//如果是保护页面

   if(!isValidSession(request)){//如果Session无效

    StringtoPageURL=null;
    try{
     toPageURL=httpRequest.getContextPath()+toPage;
     httpResponse.encodeRedirectURL(toPageURL);
     httpResponse.sendRedirect(toPageURL);//转发响应

    }catch(IOExceptionex){
     logger.error("Sessionfilter过滤时发生IO异常",ex);
    }
   }
  }

只有是通过isFreePage(requestURI)isValidSession(request)两层验证的页面才能被访问到,基本实现了防止用户非法访问页面的情况。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,Spring Boot可以使用过滤器(Filter)来过滤非法字符。可以在过滤器中对请求进行预处理和后处理,比如字符编码转换、参数校验、安全控制等。以下是一个示例过滤器,它可以过滤掉请求中的非法字符: ```java @Component public class IllegalCharacterFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化过滤器 } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; // 进行字符编码转换 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); // 获取请求参数 Map<String, String[]> parameterMap = request.getParameterMap(); for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) { String name = entry.getKey(); String[] values = entry.getValue(); for (int i = 0; i < values.length; i++) { String value = values[i]; // 过滤非法字符 if (containsIllegalCharacter(value)) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "包含非法字符"); return; } } } // 执行下一个过滤器或目标资源 filterChain.doFilter(request, response); } @Override public void destroy() { // 销毁过滤器 } private boolean containsIllegalCharacter(String value) { // 判断是否包含非法字符,例如 <script>、alert() 等 return value.contains("<script>") || value.contains("alert("); } } ``` 在上述示例中,IllegalCharacterFilter 实现了 Filter 接口,并通过 @Component 注解将其注册为 Spring Bean。在 doFilter 方法中,通过 request.setCharacterEncoding 和 response.setCharacterEncoding 进行字符编码转换,然后获取请求参数并遍历每个参数值,判断是否包含非法字符。如果包含非法字符,则直接返回错误响应,否则执行下一个过滤器或目标资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值