@@ -86,4 +86,38 @@ public void sendUserFileGood4(Socket sock, String user) throws IOException {
86
86
fileLine = fileReader .readLine ();
87
87
}
88
88
}
89
+
90
+ public void sendUserFileGood5 (Socket sock , String user ) throws IOException {
91
+ BufferedReader filenameReader =
92
+ new BufferedReader (new InputStreamReader (sock .getInputStream (), "UTF-8" ));
93
+ String filename = filenameReader .readLine ();
94
+ File f1 = new File ("safe/file.txt" );
95
+ // GOOD: ensure that the path does not contain ".." and is used as the
96
+ // second argument to a `File` constructor
97
+ if (!filename .contains (".." )) {
98
+ File f2 = new File (f1 , filename );
99
+ f2 .exists ();
100
+
101
+ // Only sanitize `f2`; `filename` is still tainted
102
+ BufferedReader fileReader = new BufferedReader (new FileReader (filename )); // $ hasTaintFlow
103
+ }
104
+ }
105
+
106
+ public void sendUserFileGood6 (Socket sock , String user ) throws IOException {
107
+ BufferedReader filenameReader =
108
+ new BufferedReader (new InputStreamReader (sock .getInputStream (), "UTF-8" ));
109
+ String filename = filenameReader .readLine ();
110
+ File f1 = new File ("safe/file.txt" );
111
+
112
+ // GOOD: ensure that the path is normalized and is then used as the
113
+ // second argument to a `File` constructor
114
+ Path normalizedFilename = Paths .get (filename ).normalize ().toAbsolutePath ();
115
+ String normalizedFilenameStr = normalizedFilename .toString ();
116
+ File f2 = new File (f1 , normalizedFilenameStr );
117
+ f2 .exists ();
118
+
119
+ // Only sanitize `f2`; `filename` and `normalizedFilenameStr` are still tainted
120
+ BufferedReader fileReader = new BufferedReader (new FileReader (filename )); // $ hasTaintFlow
121
+ BufferedReader fileReader2 = new BufferedReader (new FileReader (normalizedFilenameStr )); // $ hasTaintFlow
122
+ }
89
123
}
0 commit comments