Xss攻击原理及防止办法简介
1 XSS原理
Cross Site Script(XSS),跨站脚本威胁。
XSS之所以会发生, 是因为用户输入的数据变成了代码。 所以我们需要对用户输入的数据进行HTML Encode处理。 将其中的"中括号", “单引号”,“引号” 之类的特殊字符进行编码。
恶意攻击者可以利用跨站脚本攻击做到:
1、盗取用户cookie,伪造用户身份登录;
2、让浏览者被迫执行某页面操作,以用户身份向服务器发起请求,达到攻击目的;
3、结合浏览器漏洞,下载病毒木马到浏览者的计算机上执行;
4、衍生url跳转漏洞;
5、让官方网站出现钓鱼页面;
6、蠕虫攻击。
跨站脚本攻击有几种情形:
a、html属性位置
b、html标签内
c、javascript标签块内
2 测试条件
测试条件 | 测试工具 | 测试方法 | 描述 |
---|---|---|---|
1、存在将用户的输入内容,输出到页面的情况 | 浏览器 | 观察用户提交的数据,最终在页面中有展示 | XSS问题的本质是将用户的输入内容,未做处理,直接输出到页面,所以如果用户提交的数据最后没有返回到页面,没有在返回的response中原样输出,那就不需要测试XSS |
3 防Xss攻击的方法
方法一:
编写代码将html字符转义,至少在输出的时候要进行转义。
/**
* 转义标记以正常显示
*
* @param input
* @return String
*/
public static String replaceTag(String input) {
StringBuilder filtered = new StringBuilder(input.length());
char c;
for (int i = 0; i <= input.length() - 1; i++) {
c = input.charAt(i);
switch (c) {
case '<':
filtered.append("<");
break;
case '>':
filtered.append(">");
break;
case '"':
filtered.append(""");
break;
case '&':
filtered.append("&");
break;
default:
filtered.append(c);
}
}
return (filtered.toString());
}
方法二:
使用Apache的工具类org.apache.commons.lang3.StringEscapeUtils;
public static String filterHtml(String input, String[] excludeTags){
String escapeStr = StringEscapeUtils.escapeHtml4(input);
if(ArrayUtils.isEmpty(excludeTags)){
return escapeStr;
}
// 不对excludeTags中的tag(如<br>)等进行转义
for (String excludeTag : excludeTags){
escapeStr = escapeStr.replaceAll(Pattern.quote(ESAPI.encoder().encodeForHTML(excludeTag)), excludeTag);
}
return escapeStr;
}
// 测试
public static void main(String[] args) {
System.out.println(filterHtml("<iframe οnlοad=alert('店小弎')><br>",new String[]{"<br>"}));
}