11package org .hswebframework .web .file ;
22
3+ import org .hswebframework .web .authorization .exception .AccessDenyException ;
34import org .junit .Test ;
45import org .springframework .http .MediaType ;
56
7+ import java .text .Normalizer ;
68import java .util .Arrays ;
79import java .util .HashSet ;
810
@@ -12,17 +14,17 @@ public class FileUploadPropertiesTest {
1214
1315
1416 @ Test
15- public void testNoSet (){
16- FileUploadProperties uploadProperties = new FileUploadProperties ();
17+ public void testNoSet () {
18+ FileUploadProperties uploadProperties = new FileUploadProperties ();
1719 assertFalse (uploadProperties .denied ("test.xls" , MediaType .ALL ));
1820
1921 assertFalse (uploadProperties .denied ("test.exe" , MediaType .ALL ));
2022 }
2123
2224 @ Test
23- public void testDenyWithAllow (){
24- FileUploadProperties uploadProperties = new FileUploadProperties ();
25- uploadProperties .setAllowFiles (new HashSet <>(Arrays .asList ("xls" ,"json" )));
25+ public void testDenyWithAllow () {
26+ FileUploadProperties uploadProperties = new FileUploadProperties ();
27+ uploadProperties .setAllowFiles (new HashSet <>(Arrays .asList ("xls" , "json" )));
2628
2729 assertFalse (uploadProperties .denied ("test.xls" , MediaType .ALL ));
2830 assertFalse (uploadProperties .denied ("test.XLS" , MediaType .ALL ));
@@ -31,30 +33,30 @@ public void testDenyWithAllow(){
3133 }
3234
3335 @ Test
34- public void testDenyWithAllowMediaType (){
35- FileUploadProperties uploadProperties = new FileUploadProperties ();
36- uploadProperties .setAllowMediaType (new HashSet <>(Arrays .asList ("application/xls" ,"application/json" )));
36+ public void testDenyWithAllowMediaType () {
37+ FileUploadProperties uploadProperties = new FileUploadProperties ();
38+ uploadProperties .setAllowMediaType (new HashSet <>(Arrays .asList ("application/xls" , "application/json" )));
3739
3840 assertFalse (uploadProperties .denied ("test.json" , MediaType .APPLICATION_JSON ));
3941
4042 assertTrue (uploadProperties .denied ("test.exe" , MediaType .ALL ));
4143 }
4244
4345
44-
4546 @ Test
46- public void testDenyWithDenyMediaType (){
47- FileUploadProperties uploadProperties = new FileUploadProperties ();
47+ public void testDenyWithDenyMediaType () {
48+ FileUploadProperties uploadProperties = new FileUploadProperties ();
4849 uploadProperties .setDenyMediaType (new HashSet <>(Arrays .asList ("application/json" )));
4950
5051 assertFalse (uploadProperties .denied ("test.xls" , MediaType .ALL ));
5152
5253 assertTrue (uploadProperties .denied ("test.exe" , MediaType .APPLICATION_JSON ));
5354
5455 }
56+
5557 @ Test
56- public void testDenyWithDeny (){
57- FileUploadProperties uploadProperties = new FileUploadProperties ();
58+ public void testDenyWithDeny () {
59+ FileUploadProperties uploadProperties = new FileUploadProperties ();
5860 uploadProperties .setDenyFiles (new HashSet <>(Arrays .asList ("exe" )));
5961
6062 assertFalse (uploadProperties .denied ("test.xls" , MediaType .ALL ));
@@ -64,4 +66,80 @@ public void testDenyWithDeny(){
6466 }
6567
6668
69+ @ Test
70+ // https://github.com/hs-web/hsweb-framework/issues/344
71+ public void testIllegalFileName () {
72+ FileUploadProperties uploadProperties = new FileUploadProperties ();
73+ uploadProperties .setUseOriginalFileName (true );
74+
75+ // 基本的路径遍历攻击
76+ FileUploadProperties .StaticFileInfo fileInfo = uploadProperties
77+ .createStaticSavePath ("../../../../pom.xml" );
78+ assertFalse (fileInfo .getSavePath ().contains ("../" ));
79+ assertFalse (fileInfo .getRelativeLocation ().contains ("../" ));
80+ assertFalse (fileInfo .getLocation ().contains ("../" ));
81+
82+ // Windows风格的路径遍历攻击
83+ fileInfo = uploadProperties .createStaticSavePath ("..\\ ..\\ ..\\ ..\\ pom.xml" );
84+ assertFalse (fileInfo .getSavePath ().contains ("..\\ " ));
85+ assertFalse (fileInfo .getRelativeLocation ().contains ("..\\ " ));
86+ assertFalse (fileInfo .getLocation ().contains ("..\\ " ));
87+
88+ // URL编码的路径遍历
89+ fileInfo = uploadProperties .createStaticSavePath ("..%2F..%2F..%2F..%2Fpom.xml" );
90+ assertFalse (fileInfo .getSavePath ().contains ("../" ));
91+ assertFalse (fileInfo .getSavePath ().contains ("..%2F" ));
92+ assertFalse (fileInfo .getRelativeLocation ().contains ("../" ));
93+ assertFalse (fileInfo .getLocation ().contains ("../" ));
94+
95+ // 双重URL编码
96+ fileInfo = uploadProperties .createStaticSavePath ("..%252F..%252F..%252Fpom.xml" );
97+ assertFalse (fileInfo .getSavePath ().contains ("../" ));
98+ assertFalse (fileInfo .getSavePath ().contains ("..%2F" ));
99+ assertFalse (fileInfo .getSavePath ().contains ("..%252F" ));
100+
101+ // Unicode编码的路径遍历
102+ fileInfo = uploadProperties .createStaticSavePath ("..%c0%af..%c0%afpom.xml" );
103+ assertFalse (fileInfo .getSavePath ().contains ("../" ));
104+ assertFalse (fileInfo .getRelativeLocation ().contains ("../" ));
105+
106+ // 绝对路径攻击 - Linux
107+ fileInfo = uploadProperties .createStaticSavePath ("/etc/passwd" );
108+ assertFalse (fileInfo .getSavePath ().startsWith ("/etc/" ));
109+ assertFalse (fileInfo .getLocation ().contains ("/etc/passwd" ));
110+
111+ // 绝对路径攻击 - Windows
112+ fileInfo = uploadProperties .createStaticSavePath ("C:\\ Windows\\ System32\\ config\\ sam" );
113+ assertFalse (fileInfo .getSavePath ().contains ("C:\\ " ));
114+ assertFalse (fileInfo .getSavePath ().contains ("System32" ));
115+
116+ // 混合斜杠
117+ fileInfo = uploadProperties .createStaticSavePath ("..\\ ../..\\ ../pom.xml" );
118+ assertFalse (fileInfo .getSavePath ().contains ("../" ));
119+ assertFalse (fileInfo .getSavePath ().contains ("..\\ " ));
120+
121+ // 过度的路径遍历
122+ fileInfo = uploadProperties .createStaticSavePath ("../../../../../../../../../../../../etc/passwd" );
123+ assertFalse (fileInfo .getSavePath ().contains ("../" ));
124+ assertFalse (fileInfo .getLocation ().contains ("/etc/" ));
125+
126+
127+ // // 带有空字节注入
128+ assertThrows (AccessDenyException .class ,
129+ ()->{
130+ uploadProperties .createStaticSavePath ("../../pom.xml\0 .jpg" );
131+ });
132+
133+ // 点和斜杠的各种组合
134+ fileInfo = uploadProperties .createStaticSavePath ("....//....//pom.xml" );
135+ assertFalse (fileInfo .getSavePath ().contains (".." ));
136+ assertFalse (fileInfo .getSavePath ().contains ("//" ));
137+
138+ // 反斜杠编码
139+ fileInfo = uploadProperties .createStaticSavePath ("..%5c..%5cpom.xml" );
140+ assertFalse (fileInfo .getSavePath ().contains ("..\\ " ));
141+ assertFalse (fileInfo .getSavePath ().contains ("..%5c" ));
142+ }
143+
144+
67145}
0 commit comments