JSP企业网站安全优化策略
1 URL 验证
使用对象request 的getRequestURL()或getRequestURI()获得URL 中问号(?)前面的部分,设值为req_url。设输入的URL为http://127.0.0.1:8080/login/ex23_login.jsp?Name =1 则getRequestURL()取得的值为http://127.0.0.1:8080/login/ex23_login.jsp,req.getRequestURI()取得的值为/login/ex23_login.jsp。
设定非法字符集,如{"'","\'",""",""}等。
查找url 中有无非法字符集中的字符串, 如果有则为非法,拒绝请求;反之,则进行后续的访问。
2 参数名和参数值验证
使用对象request 的getParameterNames()获得所有参数的名字集合,设为params。该函数是在不知道参数名的情况下,进行参数名和参数值合法性验证的关键。
使用nextElement()方法遍历每个参数名字,如果参数名不满足参数名定义的语法要求,则认为参数名不合法。本系统中设为符合正则表达式[a-zA-Z_0-9] 格式的参数名合法,可根据系统实际情况进行再定义。
使用对象request 的getParameterValues(name)获得某参数名的所有数值集合,设为paramValues。
设定非法字符集,如{"'","\'",""","","%","\\"}等。
查找paramValues 中有无非法字符集中的字符串, 如果有则为非法,拒绝请求;反之,则进行后续的访问。
3 输出数据过滤
输出数据过滤也是修补安全漏洞的一种办法,可以实现对一些敏感词汇的过滤和特殊字符的修改。文献6 通过改写response对象,捕获了网站输出数据,再根据自身对敏感词汇和特殊字符的定义,即可实现网站输出数据的过滤。其原理是:因原response 对象没有提供取得输出数据的方法,所以需要继承response 构建一个带缓存Buffer 的Myresponse 对象,重写write方法。这样当JSP 页面转换为Servlet 输出缓存页面时,就会调用该write 方法将页面HTML 代码写入Buffer, 而不是浏览器,有了这些数据,就可以编写过滤方法了。具体步骤如下:
编写MyWriter 类,继承PrintWriter 类,添加成员Buffer,在构造函数中调用super(response.getWriter()),并初始化Buffer。
重写PrintWriter 类的所有write 方法, 使用append 方法将数据追加到Buffer。
编写MyResponseWrapper 类, 继承HttpServletResponseWrapper,添加MyWriter 类成员mywriter。
修改chain.doFilter (request, response) 的response 为MyResponseWrapper 类的Myresponse 对象。
在doFilter 方法后,取得Myresponse 对象的Buffer,使用replaceAll 对Buffer 中敏感词汇进行替换,并使用原response 对象将buffer 内容输出到浏览器;或者跳转到一个说明页面,并报警通知信息管理员。
有些漏洞必须通过输入数据过滤来解决, 比如sql 注入漏洞,当通过条件’1or1’的形式获得某表的全部数据后,就无使用输出数据过滤方法来过滤这些合法数据了。有时需要查找过滤掉大量已有网页的敏感词汇时,输出过滤就会发挥作用了。
4 IP 过滤器doFilter 实现
使用对象request 的getRemoteAddr()方法获得浏览器端IP 地址,设为req_ip。
设定有效的内网IP 地址集合。这里有效的内网IP 要看各单位实际情况。通过查看限定页面的访问日志,能准确定义出有效内网IP 集合。本文查看/system/login/index.html 的访问日志,发现所有内网访问都映射为10.10.1.2。
如果req_ip 不在有效的内网集合中, 则拒绝访问请求。反之,则继续后续访问。
将上述代码打包导出成jar 文件,然后将jar 文件放到门户网站的WEB-INF/lib 目录下。
领取专属 10元无门槛券
私享最新 技术干货