Skip to content

Commit 9a4c9e8

Browse files
committed
unrestricted file upload python
1 parent de08a1a commit 9a4c9e8

File tree

12 files changed

+49
-20
lines changed

12 files changed

+49
-20
lines changed

Path Manipulation/while File Upload/java/fileupload.pathmanipulation/src/main/java/securecodingexamples/fileupload/pathmanipulation/UploadController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ private static boolean isValidName(String filename) {
100100
private static String validFilename(String filename) {
101101
int dotIndex = filename.lastIndexOf(".");
102102
String name = filename.substring(0, dotIndex);
103-
String extension = filename.substring(dotIndex + 1);
103+
String extension = filename.substring(dotIndex + 1).toLowerCase();
104104
return name + "." + extension;
105105
}
106106

Path Manipulation/while File Upload/java/fileupload.pathmanipulation/src/main/resources/static/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
<title>File Upload</title>
33
<h1>Upload new files</h1>
44
<form method="post" enctype="multipart/form-data" action="/uploadFile">
5-
<input type="file" accept="text/plain, application/pdf" name="file"/><!--Client Side Validation for file type-->
5+
<input type="file" accept="text/plain, application/pdf" name="file"/><!--Client Side Validation for allowed file type-->
66
<input type="Submit" name="Upload"/>
77
</form>

Unrestriced File Upload/java/src/main/java/securecodingexamples/unrestricted/fileupload/UploadController.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class UploadController{
2828
private static final Logger logger = Logger.getLogger(UploadController.class.getName());
2929
private static final String TEMP_DIRECTORY = System.getProperty("java.io.tmpdir");
3030
private static final String UPLOAD_DIRECTORY = TEMP_DIRECTORY + File.separator + "Uploads";
31-
private static final String[] ALLOWED_EXTENSIONS = {"jpg", "png", "pdf"}; //jpg, png, pdf
31+
// private static final String[] ALLOWED_EXTENSIONS = {"jpg", "png", "pdf"}; //jpg, png, pdf
3232
private static final Pattern FILENAME_REGEX_PATTERN = Pattern.compile("[a-zA-Z0-9-_]+");
3333

3434
//MAGIC_NUMBERS HashMap to contain the allowed magic numbers of the files.
@@ -39,6 +39,8 @@ public class UploadController{
3939
MAGIC_NUMBERS.put("jpg","FFD8FF");
4040
MAGIC_NUMBERS.put("png","89504E47");
4141
}
42+
43+
private static final String[] ALLOWED_EXTENSIONS = MAGIC_NUMBERS.keySet().toArray(new String[0]);
4244

4345
public static void main(String[] args) {
4446
File uploadDir = new File(UPLOAD_DIRECTORY);
@@ -77,8 +79,7 @@ public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile file) {
7779

7880
if(isValidName(filename) && isValidExtension(filename)){
7981
logger.info("Valid Filename and Extension");
80-
String validFilename = validFilename(filename);
81-
validFilename = getUniqueFilename(validFilename);
82+
String validFilename = getUniqueFilename(validFilename(filename));
8283

8384
if(isValidMagicNumber(fileMagicNumber, "jpg") || isValidMagicNumber(fileMagicNumber, "png") || isValidMagicNumber(fileMagicNumber, "pdf") ){
8485
logger.info("Valid Magic Number");
@@ -130,7 +131,7 @@ private static boolean isValidName(String filename) {
130131
private static String validFilename(String filename) {
131132
int dotIndex = filename.lastIndexOf(".");
132133
String name = filename.substring(0, dotIndex);
133-
String extension = filename.substring(dotIndex + 1);
134+
String extension = filename.substring(dotIndex + 1).toLowerCase();
134135
return name + "." + extension;
135136
}
136137

Binary file not shown.

Unrestriced File Upload/python/securecodingexamples/unrestricted/fileupload/src/app.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import tempfile
66
from werkzeug.exceptions import RequestEntityTooLarge
77
import logging
8-
from .pathmanipulation import is_valid_name, is_valid_extension, valid_filename, get_unique_filename
8+
from .pathmanipulation import is_valid_name, is_valid_extension, valid_filename, get_unique_filename, get_magic_number, is_valid_magic_number
99

1010
app = Flask(__name__)
1111
TEMPDIR = tempfile.gettempdir()
@@ -53,17 +53,22 @@ def upload_file():
5353

5454
if request.content_length > max_length:
5555
return jsonify({"error": "File size exceeds the limit"}), 400
56+
57+
if (file is None or not is_valid_name(file.filename)):
58+
return jsonify({"error" : "Invalid Filename"}), 400
59+
60+
if (file is None or not is_valid_extension(file.filename)):
61+
return jsonify({"error" : "Invalid Extension"}), 400
5662

5763
if file and is_valid_name(file.filename) and is_valid_extension(file.filename):
58-
filename = valid_filename(file.filename)
59-
if filename:
64+
if (is_valid_magic_number(file, "pdf") or is_valid_magic_number(file, "png") or is_valid_magic_number(file, "jpg")):
6065
unique_filename = get_unique_filename(app.config["UPLOAD_DIRECTORY"], valid_filename(file.filename))
61-
file_path = os.path.join(app.config["UPLOAD_DIRECTORY"], unique_filename)
62-
file.save(file_path)
63-
logger.info(f"File '{unique_filename}' uploaded successfully at {file_path}")
66+
safe_file_path = os.path.join(app.config["UPLOAD_DIRECTORY"], unique_filename)
67+
file.save(safe_file_path)
68+
logger.info(f"File '{unique_filename}' uploaded successfully at {safe_file_path}")
6469
return jsonify({"success": "File uploaded successfully"}), 200
6570
else:
66-
return jsonify({"error": "Invalid filename"}), 400
71+
return jsonify({"error" : "Invalid File Type"}), 400
6772
else:
6873
return jsonify({"error": "Invalid file format"}), 400
6974
except RequestEntityTooLarge as e:

0 commit comments

Comments
 (0)