发表于: 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类型的枚举.
* 通过Enumeration的hasMoreElements()方法遍历.
* 再由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:这个过滤器的跳转还要完善一下。
评论