今天在解决系统安全漏洞及代码安全漏洞。需要设置一个允许输入的字符白名单。
因为用户可以输入 中文、大写英文、小写英文、数字、以及常规字符。
有些资料内查询的中文在 unicode编码 范围为:\u4E00-\u9FA5 这个范围为基本汉字。(文末附更多中文字符集)
\u4E00 这个怎么看,以前没有具体看过,今天分析了一下豁然开朗,原来这么简单。
\u4E00 分为两部分 \u 和 4E00
\u 为 unicode编码的意思
4E00 是十六进制数
可以将十六进制通过工具转换成10进制 在线进制转换工具
4E00转换为十进制为:19968
9FA5转换为十进制为:40869
换句话说基本中文转成十进制范围19968-40869
可以自己写个main方法测试一下、
一:将unicode编码 \u4E00 通过工具转成中文得到的是“一”。 Unicode在线转换工具
二:写个main方法将十进制19968转换成char输出。输出的也是 “一”
三:通过以上方法即可将中文在unicode编码的范围,转成在数值中的范围,这样就得到了中文转成数值后的范围了。
public static void main(String[] args) {
System.out.println("数值的19968对应的char="+(char)19968);
}
所以根据以上内容自己写了一个白名单过滤字符串工具类。
package cdb.hq.litsoft.bjyl.connector.util;
public class StringWhiteList {
public static String cleanString(String aStr){
if(aStr==null) return null;
String cleanString="";
for(int i=0;i<aStr.length();i++){
cleanString+=cleanChar(aStr.charAt(i));
}
return cleanString;
}
public static char cleanChar(char aChar) {
// 0-9
for(int i=48;i<=57;i++){
if(aChar==i){return (char)i;}
}
// 'A'-'Z'
for(int i=65;i<=90;i++){
if(aChar==i){return (char)i;}
}
// 'a'-'z'
for(int i=97;i<=122;i++){
if(aChar==i){return (char)i;}
}
// 中文
for(int i=19968;i<=40879;i++){
if(aChar==i){System.out.println((char)i+"对应的int值="+i);return (char)i;}
}
//特殊字符
switch (aChar) {
case '/':return '/';
case '.':return '.';
case '-':return '-';
case '_':return '_';
case ' ':return ' ';
}
return '%';
}
public static void main(String[] args) {
System.out.println(StringWhiteList.cleanString("0Aa中文/.-_ "));
System.out.println(StringWhiteList.cleanString("0Aa中文/.-_ !??"));
System.out.println("符号!对应的int="+(int)'!');
System.out.println("符号?对应的int="+(int)'?');
System.out.println("int的19968对应的char="+(char)19968);
System.out.println("int的40879对应的char="+(char)40879);
}
}
中文在unicode编码中的范围如下:
字符集 | 字数 | Unicode 编码 |
基本汉字 | 20902字 | 4E00-9FA5 |
基本汉字补充 | 74字 | 9FA6-9FEF |
扩展A | 6582字 | 3400-4DB5 |
扩展B | 42711字 | 20000-2A6D6 |
扩展C | 4149字 | 2A700-2B734 |
扩展D | 222字 | 2B740-2B81D |
扩展E | 5762字 | 2B820-2CEA1 |
扩展F | 7473字 | 2CEB0-2EBE0 |
扩展G | 4939字 | 30000-3134A |
康熙部首 | 214字 | 2F00-2FD5 |
部首扩展 | 115字 | 2E80-2EF3 |
兼容汉字 | 477字 | F900-FAD9 |
兼容扩展 | 542字 | 2F800-2FA1D |
PUA(GBK)部件 | 81字 | E815-E86F |
部件扩展 | 452字 | E400-E5E8 |
PUA增补 | 207字 | E600-E6CF |
汉字笔画 | 36字 | 31C0-31E3 |
汉字结构 | 12字 | 2FF0-2FFB |
汉语注音 | 43字 | 3105-312F |
注音扩展 | 22字 | 31A0-31BA |
〇 | 1字 | 3007 |