lizongbo at 618119.com 工作,生活,Android,前端,Linode,Ubuntu,nginx,java,apache,tomcat,Resin,mina,Hessian,XMPP,RPC

2010年02月25日

使用Google Email Uploader备份Microsoft Office Outlook邮件到google apps里的邮箱。

Filed under: 杂七杂八 — 标签:, , , , , — lizongbo @ 21:46
由于Microsoft Office Outlook收到的邮件太多,加上电脑上启动了一堆程序,导致Outlook启动很慢很卡,
使用搜索功能的时候,更是卡得要命。
曾经分别尝试过安装Google Desktop Search和Windows Desktop Search 4.0,但是效果更差,
让本来就卡的电脑更卡了,全文搜索功能等同废品。
迫于无奈,于是另寻其它方法。

目前GMail和QQMail都支持了邮件全文搜索,
如果能够将邮件阅读之后转发到GMail或QQMail里进行备份,然后利用搜索功能查找邮件,那将是很美好的事情。

可惜遇到了第一个难题,就是Exchage Server限制了邮件自动转发,
要求发给其它邮箱的邮件,件标题都必须加上指定的前缀。
outlook的邮件规则支持自动转发,但是不支持配置前缀,
在每次阅读邮件后手工加前缀再转发,没法活了。
于是想到的第一个方法,就是找outlook插件,肯定早就有人就类似需求了,
通过google搜索“outlook addons forward”,确实找到了很多免费的或收费的插件,
下载下来试用后发现,支持自动转发邮件的配置里,还是没法在转发前对邮件标题等信息进行修改,
也就不可能加固定前缀。

此路不通,再找其它方法:
QQMail和Gmail都提供了IMAP方式访问邮箱,
用google搜索得知使用foxmail客户端可以将邮件通过imap方式快速上传到服务器。
(google搜索“foxmail  imap 备份”可以了解详细操作),但再仔细一看,Foxmail不支持Exchange Server方式访问,
而Exchange Server更是没有提供imap和pop3访问方式。也就是说没有用foxmail来备份了。

接下来再想办法:
Gmail支持imap,Microsoft Office Outlook呢,支持复制邮件到本地文件夹,
自动将每个邮件导成一个单独的文件。
如果手工批量复制邮件到指定文件夹,再写个程序,用javamail解析文件,
然后再调用imap接口上传,看上去也还凑合。
于是动手实验,发现Microsoft Office Outlook导出的文件是不明格式的msg文件,
只有Outlook Express 备份出来的文件是方便解析的eml格式,
而Outlook Express 不用imap和pop3是没法连Exchage Server的,这个方法也就没戏。

还曾幻想自己写vba脚本来实现转发功能,但是一番google搜索之后,发现这个太难了,还是放弃这个想法。

万般无奈之下之下,想想总应该有可以导入邮件到gmail的工具吧,这些工具或许有导入outlook邮件的方法,
于是搜索"gmail import email",找到了
Google Email Uploader(http://mail.google.com/mail/help/email_uploader.html),
一看到页面上介绍支持Microsoft Outlook,总算看到希望了。

飞快下载安装文件,安装后运行Google Email Uploader,提示Microsoft Office Outlook正在运行,不能操作。
于是关掉Microsoft Office Outlook后再启动Google Email Uploader,
看到说支持Microsoft Outlook,Outlook Express,Thunderbird这三种邮件客户端,
点 next,看到gmail账号的输入框。
输入gmaila账号信息,点sing in,结果提示如下:

---------------------------
Uploading email to gmail.com or googlemail.com is not enabled
---------------------------
Your account is not allowed to upload email.
You must login to GMail for your domain before you can use this feature.
 Also, your domain administrator may need to enable email migration for your domain.
---------------------------
确定
---------------------------

晕倒,还是不支持Gmail啊,继续google搜索“Uploading email to gmail.com or googlemail.com is not enabled”。
在网上找到了答案,原来这个只支持google apps里的电子邮件导入。
很幸运,Google apps开放的时候,正好通过网页代理去激活了618119.com的电子邮件服务,虽然密码早就忘了。
于是快速找回相关密码,重新登录账号,确认@618119.com的电子邮件可用。

再接下来就很顺利了,邮件顺利的导入到了google apps托管的电子邮箱里,
第一次导入的邮件非常多,等了一两个小时才搞定。
Microsoft Office Outlook本地的邮件也可以放心大胆删除并压缩pst文件了,
清理之后,本地邮件的文件夹大小控制在100M左右。
找邮件的时候登录gmail进行搜索。

还可以下载Google apps的桌面小程序,实际就是chrome浏览器的简单包装了快捷方式。
618119.com Email的启动命令如下。

"C:\Program Files\Google\Google Apps\googleapps.exe" --domain=618119.com --mail.google.com

几次备份之后,“目前您已经使用 7421 MB 中的 680 MB (9%)。”,按这个速度,备份空间是足够的了。

上面说了那么多废话,简而言之就一句话,如果你有已经激活google apps的电子邮件服务的独立域名邮箱,
就可以使用Google Email Uploader快速备份outlook邮件到gmail。享受轻松的全文检索服务。

已经向QQMail提过支持邮件导入的建议了,不过不知道QQMail会不会实现这样的功能。

2010年02月23日

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

Filed under: Java — 标签:, , , , — lizongbo @ 22:32

使用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]

2010年02月21日

迁移blog到homezz的新服务器

Filed under: 杂七杂八 — 标签:, — lizongbo @ 22:30

迁移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加关键字找自己以前记录的经验,对好记性不如烂笔头是深有体会了。

Powered by WordPress