1.背景
パブリック 静的文字列読み取り(文字列のパス){ // 与えられた位置からファイルを取得する ファイルファイル= 新しい新しいファイル(パス); } CID 1565229(数1):システム制御ファイルパス、ファイル名またはURI。(PATH_MANIPULATION)。5 シンク:.汚染パスまたはURIパスの値を使用して構成。これは、変更または重要または機密ファイルの存在をテストし、アクセスする攻撃を可能にすることができます。 適切な入力検証溶液を介して脆弱性経路。これは、安全でないパストラバーサル文字ブラックリストに文字セットは入力の安全性を向上させることができますが、推奨される方法は、文字セットのホワイトリストを期待することができます。私たちは、絶対パスとディレクトリトラバーサルのアップを除外する必要があります。
2.ソリューション
2.1シナリオ1
1つの パブリック クラスCleanPathUtil { 2 パブリック 静的文字列cleanString(文字列str){ 3 であれば(STR == NULL)戻り ヌル。 4 StringBuilderのSB = 新規のStringBuilder(); 5 のための(INT iは= 0; iは<str.length(); ++ I){ 6 sb.append(cleanChar(str.charAt(I)))。 7 } 8 リターンsb.toString()。 9 } 10 11 プライベート 静的 チャーcleanChar(チャーCH){ 12 13 // 0から9まで 14 用(INTは I 48 =; I <58; ++ I){ 15 であれば(CH == I)リターン(CHAR )I。 16 } 17 18 // 'A' - 'Z' 19 用(INT I 65 =; I <91; ++ i)が{ 20 であれば(CH == I)リターン(CHAR )I。 21 } 22 23 // '' - 'Z' 24 用(int型私は97を=。I <123; ++ I){ 25 であれば(CH == I)リターン(CHAR )I。 26 } 27 28 // 他の有効な文字 29 スイッチ(CH){ 30 ケース '/' : 31 リターン '/' 。 32 ケース '' : 33 リターン '' ; 34 ケース ' - ' : 35 リターン ' - ' 。 36 ケース '_' : 37 リターン'_' ; 38 ケース '' : 39 リターン '' ; 40 ケース '' : 41 リターン '' ; 42 ケース '!' : 43 リターン '!' ; 44 ケース '@' : 45 リターン '@' ; 46 ケース '#' : 47 リターン '#' ; 48 ケース '$' : 49 リターン '$' ; '%' : 51 リターン '%' 。 52 ケース '^' : 53 リターン '^' 。 54 ケース '&' : 55 リターン '&' ; 56 ケース '*' : 57 リターン '*' ; 58 ケース '(' : 59 リターン '(' ; 60 ケース '') : 61 リターン '') 。 62 ケース '+' : '+' ; 64 ケース '=' : 65 リターン '=' 。 66 ケース ':' : 67 リターン ':' ; 68 ケース ';' : 69 リターン ';' ; 70 ケース '?' : 71 リターン '?' ; 72 ケース ' "' : 73 リターン '"' ; 74 ケース '<' : 75 リターン '<' ; 76 ケース'>' : 77 リターン '>' ; 78 ケース ''' : 79 リターン ''' ; 80 } 81 IF (isChineseChar(CH)) 82 リターンCH; 83 log.error(「[ALARM]認識されない文字、チェックしてくださいファイルINPUTのパス名" ); 84 リターン '%' ; 85 } 86 87 // 中国語の文字や記号の分析は、Unicodeに従って符号化された 88 のプライベート 静的 ブール isChineseChar(チャーC){ 89 Character.UnicodeBlock UB = Character.UnicodeBlock.of(C); 90 リターン UB == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || UB == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS 91 || UB == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || UB == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B 92 || UB == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || UB == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS 93 || UB == Character.UnicodeBlock.GENERAL_PUNCTUATION。 94 } 95 96 }
2.2シナリオ2
1つの パブリック クラスStringVerifyUtil { 2 パブリック 静的文字列verifyNonNullString(文字入力){ 3 のchar [] originalChars = input.toCharArray()。 4 のchar []文字= 新しい CHAR [originalChars.length]。 5 のための(INT I 0 =; I <originalChars.length; iが++ ){ 6つの 文字[I] = purifyChar(originalChars [I])。 7 } 8 リターン 新しい文字列(文字)。 9 } 10 11 民間 静的 チャー purifyChar(チャーinputc){ 12 リターンinputc。 13 } 14 }
3使用
1 パブリック 静的文字列読み取り(文字列のパス){ 2 // 指定された場所からファイルを取得 3。 文字列cleanpath = StringVerifyUtil.verifyNonNullString(パス); 4 ファイルファイル= 新しい新ファイル(cleanpath); 5 }