10
10
@app .route ("/path1" )
11
11
def path_injection ():
12
12
filename = request .args .get ('filename' , '' )
13
- f = open (os .path .join (STATIC_DIR , filename )) # NOT OK
13
+ f = open (os .path .join (STATIC_DIR , filename )) # $result=BAD
14
14
15
15
16
16
@app .route ("/path2" )
17
17
def path_injection ():
18
18
# Normalized, but not checked
19
19
filename = request .args .get ('filename' , '' )
20
20
npath = os .path .normpath (os .path .join (STATIC_DIR , filename ))
21
- f = open (npath ) # NOT OK
21
+ f = open (npath ) # $result=BAD
22
22
23
23
24
24
@app .route ("/path3" )
@@ -28,7 +28,7 @@ def unsafe_path_normpath():
28
28
npath = os .path .normpath (os .path .join (STATIC_DIR , filename ))
29
29
if npath .startswith (STATIC_DIR ):
30
30
pass
31
- f = open (npath ) # NOT OK
31
+ f = open (npath ) # $result=BAD
32
32
33
33
34
34
@app .route ("/path4" )
@@ -37,15 +37,15 @@ def safe_path_normpath():
37
37
filename = request .args .get ('filename' , '' )
38
38
npath = os .path .normpath (os .path .join (STATIC_DIR , filename ))
39
39
if npath .startswith (STATIC_DIR ):
40
- f = open (npath ) # OK
40
+ f = open (npath ) # $result= OK
41
41
42
42
43
43
@app .route ("/path5" )
44
44
def unsafe_path_realpath ():
45
45
# Normalized (by `realpath` that also follows symlinks), but not checked properly
46
46
filename = request .args .get ('filename' , '' )
47
47
npath = os .path .realpath (os .path .join (STATIC_DIR , filename ))
48
- f = open (npath ) # NOT OK
48
+ f = open (npath ) # $result=BAD
49
49
50
50
51
51
@app .route ("/path6" )
@@ -54,15 +54,15 @@ def safe_path_realpath():
54
54
filename = request .args .get ('filename' , '' )
55
55
npath = os .path .realpath (os .path .join (STATIC_DIR , filename ))
56
56
if npath .startswith (STATIC_DIR ):
57
- f = open (npath ) # OK
57
+ f = open (npath ) # $result= OK
58
58
59
59
60
60
@app .route ("/path6" )
61
61
def unsafe_path_abspath ():
62
62
# Normalized (by `abspath`), but not checked properly
63
63
filename = request .args .get ('filename' , '' )
64
64
npath = os .path .abspath (os .path .join (STATIC_DIR , filename ))
65
- f = open (npath ) # NOT OK
65
+ f = open (npath ) # $result=BAD
66
66
67
67
68
68
@app .route ("/path7" )
@@ -71,7 +71,7 @@ def safe_path_abspath():
71
71
filename = request .args .get ('filename' , '' )
72
72
npath = os .path .abspath (os .path .join (STATIC_DIR , filename ))
73
73
if npath .startswith (STATIC_DIR ):
74
- f = open (npath ) # OK
74
+ f = open (npath ) # $result= OK
75
75
76
76
77
77
@app .route ("/abspath_tricky" )
@@ -84,22 +84,22 @@ def safe_path_abspath_tricky():
84
84
filename = request .args .get ('filename' , '' )
85
85
possibly_unsafe_path = os .path .join (STATIC_DIR , filename )
86
86
if os .path .abspath (possibly_unsafe_path ).startswith (STATIC_DIR ):
87
- f = open (possibly_unsafe_path ) # OK
87
+ f = open (possibly_unsafe_path ) # $SPURIOUS: result=BAD
88
88
89
89
90
90
@app .route ("/int-only/<int:foo_id>" )
91
91
def flask_int_only (foo_id ):
92
92
# This is OK, since the flask routing ensures that `foo_id` MUST be an integer.
93
93
path = os .path .join (STATIC_DIR , foo_id )
94
- f = open (path ) # OK TODO: FP
94
+ f = open (path ) # $spurious: result=BAD
95
95
96
96
97
97
@app .route ("/not-path/<foo>" )
98
98
def flask_not_path (foo ):
99
99
# On UNIX systems, this is OK, since without being marked as `<path:foo>`, flask
100
100
# routing ensures that `foo` cannot contain forward slashes (not by using %2F either).
101
101
path = os .path .join (STATIC_DIR , foo )
102
- f = open (path ) # OK if only running on UNIX systems, NOT OK if could be running on windows
102
+ f = open (path ) # $result=BAD // OK if only running on UNIX systems, NOT OK if could be running on windows
103
103
104
104
105
105
@app .route ("/no-dot-dot" )
@@ -110,7 +110,7 @@ def no_dot_dot():
110
110
# handle if `filename` is an absolute path
111
111
if '../' in path :
112
112
return "not this time"
113
- f = open (path ) # NOT OK
113
+ f = open (path ) # $result=BAD
114
114
115
115
116
116
@app .route ("/no-dot-dot-with-prefix" )
@@ -121,15 +121,15 @@ def no_dot_dot_with_prefix():
121
121
# Therefore, for UNIX-only programs, the `../` check is enough to stop path injections.
122
122
if '../' in path :
123
123
return "not this time"
124
- f = open (path ) # OK if only running on UNIX systems, NOT OK if could be running on windows
124
+ f = open (path ) # $result=BAD // OK if only running on UNIX systems, NOT OK if could be running on windows
125
125
126
126
127
127
@app .route ("/replace-slash" )
128
128
def replace_slash ():
129
129
filename = request .args .get ('filename' , '' )
130
130
path = os .path .join (STATIC_DIR , filename )
131
131
sanitized = path .replace ("/" , "_" )
132
- f = open (sanitized ) # OK if only running on UNIX systems, NOT OK if could be running on windows
132
+ f = open (sanitized ) # $result=BAD // OK if only running on UNIX systems, NOT OK if could be running on windows
133
133
134
134
135
135
@app .route ("/stackoverflow-solution" )
@@ -139,7 +139,7 @@ def stackoverflow_solution():
139
139
path = os .path .join (STATIC_DIR , filename )
140
140
if os .path .commonprefix ((os .path .realpath (path ), STATIC_DIR )) != STATIC_DIR :
141
141
return "not this time"
142
- f = open (path ) # OK TODO: FP
142
+ f = open (path ) # $SPURIOUS: result=BAD
143
143
144
144
145
145
SAFE_FILES = ['foo' , 'bar' , 'baz' ]
@@ -149,4 +149,4 @@ def safe_set_of_files():
149
149
filename = request .args .get ('filename' , '' )
150
150
if filename in SAFE_FILES :
151
151
path = os .path .join (STATIC_DIR , filename )
152
- f = open (path ) # OK TODO: FP
152
+ f = open (path ) # $SPURIOUS: result=BAD
0 commit comments