1010@app .route ("/path1" )
1111def path_injection ():
1212 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
1414
1515
1616@app .route ("/path2" )
1717def path_injection ():
1818 # Normalized, but not checked
1919 filename = request .args .get ('filename' , '' )
2020 npath = os .path .normpath (os .path .join (STATIC_DIR , filename ))
21- f = open (npath ) # NOT OK
21+ f = open (npath ) # $result=BAD
2222
2323
2424@app .route ("/path3" )
@@ -28,7 +28,7 @@ def unsafe_path_normpath():
2828 npath = os .path .normpath (os .path .join (STATIC_DIR , filename ))
2929 if npath .startswith (STATIC_DIR ):
3030 pass
31- f = open (npath ) # NOT OK
31+ f = open (npath ) # $result=BAD
3232
3333
3434@app .route ("/path4" )
@@ -37,15 +37,15 @@ def safe_path_normpath():
3737 filename = request .args .get ('filename' , '' )
3838 npath = os .path .normpath (os .path .join (STATIC_DIR , filename ))
3939 if npath .startswith (STATIC_DIR ):
40- f = open (npath ) # OK
40+ f = open (npath ) # $result= OK
4141
4242
4343@app .route ("/path5" )
4444def unsafe_path_realpath ():
4545 # Normalized (by `realpath` that also follows symlinks), but not checked properly
4646 filename = request .args .get ('filename' , '' )
4747 npath = os .path .realpath (os .path .join (STATIC_DIR , filename ))
48- f = open (npath ) # NOT OK
48+ f = open (npath ) # $result=BAD
4949
5050
5151@app .route ("/path6" )
@@ -54,15 +54,15 @@ def safe_path_realpath():
5454 filename = request .args .get ('filename' , '' )
5555 npath = os .path .realpath (os .path .join (STATIC_DIR , filename ))
5656 if npath .startswith (STATIC_DIR ):
57- f = open (npath ) # OK
57+ f = open (npath ) # $result= OK
5858
5959
6060@app .route ("/path6" )
6161def unsafe_path_abspath ():
6262 # Normalized (by `abspath`), but not checked properly
6363 filename = request .args .get ('filename' , '' )
6464 npath = os .path .abspath (os .path .join (STATIC_DIR , filename ))
65- f = open (npath ) # NOT OK
65+ f = open (npath ) # $result=BAD
6666
6767
6868@app .route ("/path7" )
@@ -71,7 +71,7 @@ def safe_path_abspath():
7171 filename = request .args .get ('filename' , '' )
7272 npath = os .path .abspath (os .path .join (STATIC_DIR , filename ))
7373 if npath .startswith (STATIC_DIR ):
74- f = open (npath ) # OK
74+ f = open (npath ) # $result= OK
7575
7676
7777@app .route ("/abspath_tricky" )
@@ -84,22 +84,22 @@ def safe_path_abspath_tricky():
8484 filename = request .args .get ('filename' , '' )
8585 possibly_unsafe_path = os .path .join (STATIC_DIR , filename )
8686 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
8888
8989
9090@app .route ("/int-only/<int:foo_id>" )
9191def flask_int_only (foo_id ):
9292 # This is OK, since the flask routing ensures that `foo_id` MUST be an integer.
9393 path = os .path .join (STATIC_DIR , foo_id )
94- f = open (path ) # OK TODO: FP
94+ f = open (path ) # $spurious: result=BAD
9595
9696
9797@app .route ("/not-path/<foo>" )
9898def flask_not_path (foo ):
9999 # On UNIX systems, this is OK, since without being marked as `<path:foo>`, flask
100100 # routing ensures that `foo` cannot contain forward slashes (not by using %2F either).
101101 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
103103
104104
105105@app .route ("/no-dot-dot" )
@@ -110,7 +110,7 @@ def no_dot_dot():
110110 # handle if `filename` is an absolute path
111111 if '../' in path :
112112 return "not this time"
113- f = open (path ) # NOT OK
113+ f = open (path ) # $result=BAD
114114
115115
116116@app .route ("/no-dot-dot-with-prefix" )
@@ -121,15 +121,15 @@ def no_dot_dot_with_prefix():
121121 # Therefore, for UNIX-only programs, the `../` check is enough to stop path injections.
122122 if '../' in path :
123123 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
125125
126126
127127@app .route ("/replace-slash" )
128128def replace_slash ():
129129 filename = request .args .get ('filename' , '' )
130130 path = os .path .join (STATIC_DIR , filename )
131131 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
133133
134134
135135@app .route ("/stackoverflow-solution" )
@@ -139,7 +139,7 @@ def stackoverflow_solution():
139139 path = os .path .join (STATIC_DIR , filename )
140140 if os .path .commonprefix ((os .path .realpath (path ), STATIC_DIR )) != STATIC_DIR :
141141 return "not this time"
142- f = open (path ) # OK TODO: FP
142+ f = open (path ) # $SPURIOUS: result=BAD
143143
144144
145145SAFE_FILES = ['foo' , 'bar' , 'baz' ]
@@ -149,4 +149,4 @@ def safe_set_of_files():
149149 filename = request .args .get ('filename' , '' )
150150 if filename in SAFE_FILES :
151151 path = os .path .join (STATIC_DIR , filename )
152- f = open (path ) # OK TODO: FP
152+ f = open (path ) # $SPURIOUS: result=BAD
0 commit comments