发表于: 2017-10-05 23:50:45

1 738



今天完成的事情:

1.完善代码,修改bug

2.写一个过滤器,过滤关键字符,防止脚本攻击


明天计划的事情

1.了解监听器

2. 监听在线人数和session的数量。

3.了解事物管理器


遇到的问题:

什么是过滤器?

它可以对静态资源例如图片,html网页,文件等进行拦截。可以实现例如:对字符进行编码,URL级别的权限访问控制、过滤敏感词汇、压缩响应信息,监控ip的访问次数等

开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截

是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理。可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。


spring过滤器和web容器的过滤器的关系?

spring的过滤器集成了一些常用的功能,例如字符编码等,但也可以继承其方法重新构造。


什么是脚本攻击

跨站脚本攻击指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。

例如在论坛发表一下留言:

<script>alert("XSS");</script>


http://blog.csdn.net/u012763794/article/details/45869479



收获:

1.完善代码,修改bug

当入学时间为空的时候自定义的

taglib

把时间戳转换为年月日,网页无法浏览 500


解决方案: 添加用户时默认入学时间为0

<td>
   <c:if test="${studentTable.enrolAt == '0'}">
   未入学
  </c:if>
   <c:if test="${studentTable.enrolAt != '0'}">
      <date:date value ="${studentTable.enrolAt}" />
   </c:if>
</td>



2.写一个过滤器,过滤关键字符,防止脚本攻击

主要参考:http://blog.csdn.net/reggergdsg/article/details/52821502

<filter>
 <filter-name>InvalidCharacterFilter</filter-name>
 <filter-class>task.jnshu.filter.InvalidCharacterFilter</filter-class>
</filter>
<filter-mapping>
 <filter-name>InvalidCharacterFilter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>




    //需要过滤的字符
   public static String[] invalidCharacter = new String[]{

"script","select","insert","document","window","function","ruman",
           "delete","update","prompt","alert","create","alter",
           "drop","iframe","link","where","replace","function","onabort",
           "onactivate","onafterprint","onafterupdate","onbeforeactivate",
           "onbeforecopy","onbeforecut","onbeforedeactivateonfocus",
           "onkeydown","onkeypress","onkeyup","onload",
           "expression","applet","layer","ilayeditfocus","onbeforepaste",
           "onbeforeprint","onbeforeunload","onbeforeupdate",
           "onblur","onbounce","oncellchange","oncontextmenu",
           "oncontrolselect","oncopy","oncut","ondataavailable",
           "ondatasetchanged","ondatasetcomplete","ondeactivate",
           "ondrag","ondrop","onerror","onfilterchange","onfinish","onhelp",
           "onlayoutcomplete","onlosecapture","onmouse","ote",
           "onpropertychange","onreadystatechange","onreset","onresize",
           "onresizeend","onresizestart","onrow","onscroll",
           "onselect","onstaronsubmit","onunload","IMgsrc","infarction"
   };

   protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {

       loggerICF.info("这是继承spring的过滤器");
       String parameterName = null;
       String parameterValue = null;
       //获取请求的参数

    /**
        * 来源:http://www.cnblogs.com/fsjohnhuang/p/4040785.html
        * @SuppressWarnings 作用:用于抑制编译器产生警告信息。
      * @SuppressWarnings("unchecked")  抑制单类型的警告
      * 其注解目标为类、字段、函数、函数入参、构造函数和函数的局部变量。
      */
//        @SuppressWarnings("unchecked")

       /**
        * request的数据放到Enumeration<String>

      * request.getParameterNames()方法是将发送请求页面中form表单里所有具有name属性的表单对

       象获取(包括button).

        * 返回一个Enumeration类型的枚举.
        * 通过EnumerationhasMoreElements()方法遍历.
        * 再由nextElement()方法获得枚举的值.此时的值是form表单中所有控件的name属性的值.
        */
       Enumeration<String> allParameter = request.getParameterNames();

// allParameter.hasMoreElements()测试此枚举是否包含更多的元素。返回值为boolean
       while(allParameter.hasMoreElements()){
//此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素,在这里是
        parameterName = allParameter.nextElement();
           parameterValue = request.getParameter(parameterName);
           if(parameterValue != null){
                for(String str : invalidCharacter){

//检查字符串(参数parameterValue)是否包含字符串(参数str), 忽略大小写.返回类型boolean
                   if(StringUtils.containsIgnoreCase(parameterValue,str)){

                       String url = request.getRequestURL().toString();
                       loggerICF.info("在这里说明有非法字符" + str);

                     /**
                       * (1)request.getRequestDispatcher()是请求转发,前后页面共享一个request ;
                       * 这个是在服务端运行的,对浏览器来说是透明的。

                       * (2)response.sendRedirect()是重新定向,前后页面不是一个request

                   而这个是在浏览器端运行的。

                 * (3)forward()request中的参数继续传递,

                    redirect()则是重新生成request了。

                 * (4)getRequestDispatcher是服务器内部跳转,地址栏信息不变,

                     只能跳转到web应用内的网页。

                  *    sendRedirect是页面重定向,地址栏信息改变,可以跳转到任意网页。
                 */
                       request.setAttribute("errorMessage","非法字符" + str);

                       RequestDispatcher requestDispatcher = request.getRequestDispatcher(url.

                             substring(22,url.length()).toString());

                       requestDispatcher.forward(request,response);
                       return;
                      }
                 }
            }
         }
         super.doFilterInternal(request,response,filterChain);
      }
  }


在以下代码中

RequestDispatcher requestDispatcher = request.getRequestDispatcher(url.substring(22,url.length()).toString());

requestDispatcher.forward(request,response)

本应该跳转到相应页面,但是却没有跳转。需要研究一下。


所以只能在controller里要检测的地方加入以下代码:

//非法字符
try{
String errorMessage = request.getAttribute("errorMessage").toString();
   if(errorMessage != null) {
String script = "<script language='javaScript'> alert('" + errorMessage + "');</script>";
       out.write(script.getBytes());
       response.setHeader("refresh", "0;url=/a/login");
       return;
   }
}catch (Exception e){
e.printStackTrace();
}



结果:



进度: 

         任务开始时间:8.14

         预计完成时间:10.6

         是否有延期风险:有,还有监听器、事务管理器

禅道:http://task.ptteng.com/zentao/project-task-264.html


PS:这个过滤器的跳转还要完善一下。





返回列表 返回列表
评论

    分享到