파일 업로드 파일명 검증 취약점
File Upload Lack of File Name Validation
Last updated
File Upload Lack of File Name Validation
Last updated
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
@WebServlet("/upload")
public class FileUploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Part filePart = request.getPart("file");
String fileName = filePart.getSubmittedFileName(); // 사용자 입력값 직접 사용
Files.copy(filePart.getInputStream(), Paths.get("uploads", fileName));
}
}import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
@WebServlet("/upload")
public class SecureFileUploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Part filePart = request.getPart("file");
String fileName = sanitizeFileName(filePart.getSubmittedFileName());
if (!isFileNameAllowed(fileName)) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid file name");
return;
}
// 서버에서 안전한 파일명 생성
String storedFileName = UUID.randomUUID().toString() + ".txt";
Path targetPath = Paths.get("uploads").resolve(storedFileName);
Files.copy(filePart.getInputStream(), targetPath);
}
private String sanitizeFileName(String fileName) {
return Paths.get(fileName).getFileName().toString(); // 경로 탐색 문자 제거
}
private boolean isFileNameAllowed(String fileName) {
return fileName.matches("^[a-zA-Z0-9._-]+$"); // 안전한 파일명 패턴 검증
}
}