web安全之XSS注入

之前在做项目的时候有遇到一些安全问题,XSS注入就是其中之一

那么,什么是XSS注入呢?

XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意脚本代码,而程序对于用户输入内容未过滤,当用户浏览该页之时,嵌入其中Web里面的脚本代码会被执行,从而达到恶意攻击用户的特殊目的。

跨站脚本攻击的危害:窃取cookie、放蠕虫、网站钓鱼 …

跨站脚本攻击的分类主要有:存储型XSS、反射型XSS、DOM型XSS

XSS漏洞是Web应用程序中最常见的漏洞之一。如果您的站点没有预防XSS漏洞的固定方法,那么就存在XSS漏洞。这个利用XSS漏洞的病毒之所以具有重要意义是因为,通常难以看到XSS漏洞的威胁,而该病毒则将其发挥得淋漓尽致。

通俗点讲,就是 恶意用户在某个表单或者公共区域输入了 可执行的html/js代码,窃取用户信息或者攻击网站

比如评论功能

假如我在评论里输入了一段可执行的script,让他弹出 123,当我把评论提交,如果没有网站没有做处理的话,那么我的脚本就会当成评论展示给其他人看,但是它在页面执行了,然后大伙一到我的评论页面就会弹出 123.

 

如何防御XSS注入

主要就是进行过滤,对可能引起XSS的注入进行过滤

 1 import java.net.URLEncoder;  2  3 /**  4  * 过滤非法字符工具类  5  *  6 */  7 public class EncodeFilter {  8  9 //过滤大部分html字符  10 public static String encode(String input) {  11 if (input == null) {  12 return input;  13  }  14 StringBuilder sb = new StringBuilder(input.length());  15 for (int i = 0, c = input.length(); i < c; i++) {  16 char ch = input.charAt(i);  17 switch (ch) {  18 case '&': sb.append("&amp;");  19 break;  20 case '<': sb.append("&lt;");  21 break;  22 case '>': sb.append("&gt;");  23 break;  24 case '"': sb.append("&quot;");  25 break;  26 case '\'': sb.append("'");  27 break;  28 case '/': sb.append("/");  29 break;  30 default: sb.append(ch);  31  }  32  }  33 return sb.toString();  34  }  35  36 //js端过滤  37 public static String encodeForJS(String input) {  38 if (input == null) {  39 return input;  40  }  41  42 StringBuilder sb = new StringBuilder(input.length());  43  44 for (int i = 0, c = input.length(); i < c; i++) {  45 char ch = input.charAt(i);  46  47 // do not encode alphanumeric characters and ',' '.' '_'  48 if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' ||  49 ch >= '0' && ch <= '9' ||  50 ch == ',' || ch == '.' || ch == '_') {  51  sb.append(ch);  52 } else {  53 String temp = Integer.toHexString(ch);  54  55 // encode up to 256 with \\xHH  56 if (ch < 256) {  57 sb.append('\\').append('x');  58 if (temp.length() == 1) {  59 sb.append('0');  60  }  61  sb.append(temp.toLowerCase());  62  63 // otherwise encode with \\uHHHH  64 } else {  65 sb.append('\\').append('u');  66 for (int j = 0, d = 4 - temp.length(); j < d; j ++) {  67 sb.append('0');  68  }  69  sb.append(temp.toUpperCase());  70  }  71  }  72  }  73  74 return sb.toString();  75  }  76  77 /**  78  * css非法字符过滤  79  * http://www.w3.org/TR/CSS21/syndata.html#escaped-characters  80 */  81 public static String encodeForCSS(String input) {  82 if (input == null) {  83 return input;  84  }  85  86 StringBuilder sb = new StringBuilder(input.length());  87  88 for (int i = 0, c = input.length(); i < c; i++) {  89 char ch = input.charAt(i);  90  91 // check for alphanumeric characters  92 if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' ||  93 ch >= '0' && ch <= '9') {  94  sb.append(ch);  95 } else {  96 // return the hex and end in whitespace to terminate  97 sb.append('\\').append(Integer.toHexString(ch)).append(' ');  98  }  99  } 100 return sb.toString(); 101  } 102 103 /** 104  * URL参数编码 105  * http://en.wikipedia.org/wiki/Percent-encoding 106 */ 107 public static String encodeURIComponent(String input) { 108 return encodeURIComponent(input, "utf-8"); 109  } 110 111 public static String encodeURIComponent(String input, String encoding) { 112 if (input == null) { 113 return input; 114  } 115  String result; 116 try { 117 result = URLEncoder.encode(input, encoding); 118 } catch (Exception e) { 119 result = ""; 120  } 121 return result; 122  } 123 124 public static boolean isValidURL(String input) { 125 if (input == null || input.length() < 8) { 126 return false; 127  } 128 char ch0 = input.charAt(0); 129 if (ch0 == 'h') { 130 if (input.charAt(1) == 't' && 131 input.charAt(2) == 't' && 132 input.charAt(3) == 'p') { 133 char ch4 = input.charAt(4); 134 if (ch4 == ':') { 135 if (input.charAt(5) == '/' && 136 input.charAt(6) == '/') { 137 138 return isValidURLChar(input, 7); 139 } else { 140 return false; 141  } 142 } else if (ch4 == 's') { 143 if (input.charAt(5) == ':' && 144 input.charAt(6) == '/' && 145 input.charAt(7) == '/') { 146 147 return isValidURLChar(input, 8); 148 } else { 149 return false; 150  } 151 } else { 152 return false; 153  } 154 } else { 155 return false; 156  } 157 158 } else if (ch0 == 'f') { 159 if( input.charAt(1) == 't' && 160 input.charAt(2) == 'p' && 161 input.charAt(3) == ':' && 162 input.charAt(4) == '/' && 163 input.charAt(5) == '/') { 164 165 return isValidURLChar(input, 6); 166 } else { 167 return false; 168  } 169  } 170 return false; 171  } 172 173 static boolean isValidURLChar(String url, int start) { 174 for (int i = start, c = url.length(); i < c; i ++) { 175 char ch = url.charAt(i); 176 if (ch == '"' || ch == '\'') { 177 return false; 178  } 179  } 180 return true; 181  } 182 183 }

当然主要看原理,你也可以写成js公共方法,在需要的地方过滤也一样

 

原文链接:https://www.cnblogs.com/jiangshichao/p/7537693.html

原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/17131

(0)
上一篇 2023年3月5日
下一篇 2023年3月5日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

优速盾注册领取大礼包www.cdnb.net
/sitemap.xml