使用Servlet Filter来防止Xss漏洞和SQL注入的方法

2010年02月23日

使用Servlet Filter来防止Xss漏洞和SQL注入的方法

在用java进行web业务开发的时候,对于页面上接收到的参数,除了极少数是步可预知的内容外,大量的参数名和参数值都是不会出现触发Xss漏洞的字符。而通常为了避免Xss漏洞,都是开发人员各自在页面输出和数据入库等地方加上各种各样的encode方法来避免Xss问题。而由于开发人员的水平不一,加上在编写代码的过程中安全意识的差异,可能会粗心漏掉对用户输入内容进行encode处理。针对这种大量参数是不可能出现引起Xss和SQL注入漏洞的业务场景下,因此可以使用一个适用大多数业务场景的通用处理方法,牺牲少量用户体验,来避免Xss漏洞和SQL注入。
那就是利用Servlet的过滤器机制,编写定制的XssFilter,将request请求代理,覆盖getParameter和getHeader方法将参数名和参数值里的指定半角字符,强制替换成全角字符。
使得在业务层的处理时不用担心会有异常输入内容。

相关的代码如下:
XssFilter.java
[code]
package com.lizongbo.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class XssFilter implements Filter {

@Override
public void init(FilterConfig config) throws ServletException {
}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper(
(HttpServletRequest) request);
chain.doFilter(xssRequest, response);
}

@Override
public void destroy() {
}
}

[/code]

XssHttpServletRequestWrapper.java
[code]
package com.lizongbo.filter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

/**
*
* @author lizongbo
*
*/
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
HttpServletRequest orgRequest = null;

public XssHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
orgRequest = request;
}

/**
* 覆盖getParameter方法,将参数名和参数值都做xss过滤。<br/>
* 如果需要获得原始的值,则通过super.getParameterValues(name)来获取<br/>
* getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
*/
@Override
public String getParameter(String name) {
String value = super.getParameter(xssEncode(name));
if (value != null) {
value = xssEncode(value);
}
return value;
}

/**
* 覆盖getHeader方法,将参数名和参数值都做xss过滤。<br/>
* 如果需要获得原始的值,则通过super.getHeaders(name)来获取<br/>
* getHeaderNames 也可能需要覆盖
*/
@Override
public String getHeader(String name) {

String value = super.getHeader(xssEncode(name));
if (value != null) {
value = xssEncode(value);
}
return value;
}

/**
* 将容易引起xss漏洞的半角字符直接替换成全角字符
*
* @param s
* @return
*/
private static String xssEncode(String s) {
if (s == null || s.isEmpty()) {
return s;
}
StringBuilder sb = new StringBuilder(s.length() + 16);
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch (c) {
case '>':
sb.append('>');//全角大于号
break;
case '<':
sb.append('<');//全角小于号
break;
case '\'':
sb.append('‘');//全角单引号
break;
case '\"':
sb.append('“');//全角双引号
break;
case '&':
sb.append('&');//全角
break;
case '\\':
sb.append('\');//全角斜线
break;
case '#':
sb.append('#');//全角井号
break;
default:
sb.append(c);
break;
}
}
return sb.toString();
}

/**
* 获取最原始的request
*
* @return
*/
public HttpServletRequest getOrgRequest() {
return orgRequest;
}
/**
* 获取最原始的request的静态方法
*
* @return
*/
public static HttpServletRequest getOrgRequest(HttpServletRequest req) {
if(req instanceof XssHttpServletRequestWrapper){
return ((XssHttpServletRequestWrapper)req).getOrgRequest();
}

return req;
}
}

}
[/code]

Tags: filter, Java, servlet, SQL, Xss

Related posts

迁移blog到homezz的新服务器

2010年02月21日

迁移blog到homezz的新服务器。

2009-09-07,cosbeta(jiang dong)发来邮件通知说不再继续合租bluehost了,
并免费分配了homezz的主机,让愿意搬家的可以转移到homezz.com (同样是美国的高速虚拟主机)

由于一直忙,收到邮件后,去homezz.com注册了帐号,只要了开通密码,就一直没管了。

原本想象中的blog搬家应该会很麻烦,因此计划在春节期间来弄。
但是春节在家玩《植物大战僵尸》,游戏打通关了,blog搬家的事也就给忘了。
今年是年后上班第一天,下午回家比较早,终于决定不能再拖了,于是开始迁移blog。

1.首先,在google输入“homezz 安装 wordpress”,一下子就找到了在homezz上安装wordpress的文章。
homezz.com/blog/html/一步一步教你安装wordpress-2.html ,可以不能直接打开了,用google快照打开。
当初也是cosbeta帮我装好wordpress我只管使用的,今天参考这篇文章,先去homezz.com登陆,进入到cPanel中,将数据库建立好。
再下载了最新的wordpress2.9.2:

http://cn.wordpress.org/wordpress-2.9.2-zh_CN.tar.gz

在cPanel中上传文件并解压到tmp目录,再移动wordpress目录下的文件到public_html目录下。

2.配置hosts文件。
运行 sudo gedit,然后打开/etc/hosts文件。
加入下面几行。
75.126.115.214 ftp.618119.com
75.126.115.214 618119.com
69.89.31.74    old.618119.com

3.接下来就是访问 http;//618119.com,安装提示初始化了blog.

4.从gmail里翻出WordPress Database Backup插件备份的最新的数据库备份压缩文件,下载后再通过cPanel里phpMy管理将数据库脚本上传导入到数据库中。

5.用原来的老帐号登录blog后台管理,对照旧的blog,下载安装了以下插件:
Autolink URI
Blogroll Page
Google XML Sitemaps

No Revisions
Optimize DB
SEO No Duplicate
Simple Tags
Some Chinese Please!
Tag Suggest Thing
WordPress Database Backup

Wordpress Thread Comment

6.登录dnspod.com,没想到很久没登录之后现在登录后还需要先激活帐号,帐号激活之后,把dnsp解析记录里的ip 69.89.31.74改到了75.126.115.214。

7.尚未完成的事情有:a.要在2010-05-20前续费,由于linux下不方便给支付宝充值,只有过几天在其它电脑上再折腾了。
b.在以前的618119.com上传的一些配合文章内容的静态文件,正在重新下载,后面再重新传到新服务器。

c.以前针对搜索引擎优化对wordprss的代码有修改,这次是全新安装的,修改的代码只能以后再补进去了,为了避免升级wordpress带来代码合并的麻烦,后面抽空把代码弄成插件形式折腾上去吧。

这次迁移还比较顺利,以后还是要继续写点笔记记录自己所学的东西,最近常在google输入618119加关键字找自己以前记录的经验,对好记性不如烂笔头是深有体会了。

Tags: homezz, Wordpress

Related posts

在64位 Ubuntu 9.04 上编译Firefox 3.5

2009年07月13日

在64位 Ubuntu 9.04 上编译Firefox 3.5

在64位的ubuntu9.04上面使用解压版的Firefox3.5,没法使用64位的Flash插件,命令行下运行可以看到类似下面的错误信息:

lizongbo@lizongbo-nb1:/opt/firefox$ ./firefox
Gtk-Message: Failed to load module “canberra-gtk-module”: /usr/lib/gtk-2.0/modules/libcanberra-gtk-module.so: wrong ELF class: ELFCLASS64
Gtk-Message: Failed to load module “canberra-gtk-module”: /usr/lib/gtk-2.0/modules/libcanberra-gtk-module.so: wrong ELF class: ELFCLASS64
nsHeaderInfo: registerSelf called!
nsHeaderInfo: registerSelf called!
/usr/lib/gio/modules/libgiogconf.so: wrong ELF class: ELFCLASS64
Failed to load module: /usr/lib/gio/modules/libgiogconf.so
/usr/lib/gio/modules/libgvfsdbus.so: wrong ELF class: ELFCLASS64
Failed to load module: /usr/lib/gio/modules/libgvfsdbus.so
/usr/lib/gio/modules/libgioremote-volume-monitor.so: wrong ELF class: ELFCLASS64
Failed to load module: /usr/lib/gio/modules/libgioremote-volume-monitor.so
LoadPlugin: failed to initialize shared library /home/lizongbo/.mozilla/plugins/libflashplayer.so [/home/lizongbo/.mozilla/plugins/libflashplayer.so: wrong ELF class: ELFCLASS64]

因此选择编译代码进行安装:

1.下载源代码:

http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.5/source/firefox-3.5-source.tar.bz2

2.解压 firefox-3.5-source.tar.bz2到 /opt下面:

lizongbo@lizongbo-nb1:/opt/mozilla-1.9.1$ pwd
/opt/mozilla-1.9.1

3.到/opt/mozilla-1.9.1下,运行

./configure –enable-application=browser

根据报错的信息,安装需要的相关库。
大概主要有build-essential 等:
因此运行以下命令安装苦文件:
sudo apt-get install build-essential autoconf automake1.9

sudo apt-get install  libasound2-dev

sudo apt-get install libdbus-glib-1-dev

sudo apt-get install libglib2.0-dev

4.保证./configure –enable-application=browser 能够通过之后,
运行 sudo make ,编译过程需要很长时间,这个时候出去逛一下再回来。
//lizongbo@lizongbo-nb1:/opt/mozilla-1.9.1$ sudo make

5.等make完成了,运行
sudo make install
//lizongbo@lizongbo-nb1:/opt/mozilla-1.9.1$ sudo make install

这个时候安装好了,从菜单里启动的时候不再是firefox3.0.11了。
但是界面是英文的。

6.下载Firefox linux版的中文语言包:

http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.5/linux-i686/xpi/zh-CN.xpi

7.安装之后重启,节目仍然是英文的,这个英文默认编译的属性是英文的。
在地址栏输入:about:config。
然后搜索general.useragent.locale。找到之后,将默认的en-US改成zh-CN,注意是减号不是下划线。

然后重启,中文版的Firefox界面出来了。

8.下载flash64位版插件,下载地址为:
http://download.macromedia.com/pub/labs/flashplayer10/libflashplayer-10.0.22.87.linux-x86_64.so.tar.gz

解压libflashplayer-10.0.22.87.linux-x86_64.so.tar.gz将libflashplayer.so复制到用户主目录的.mozilla/plugins,即:~/.mozilla/plugins.

(Ubuntu下flash乱码的解决方法为删除49-sansserif.conf,执行下面的命令即可:
cd /etc/fonts/conf.d/
sudo cp 49-sansserif.conf 49-sansserif.conf_backup
sudo rm 49-sansserif.conf)

9.访问谷歌的音乐搜索:
http://www.google.cn/music/songscreener

可以看到flash显示正常。

Tags: FireFox, flash, Linux, Ubuntu

Related posts