3232
3333final class ImageController extends AbstractController
3434{
35+ private const array ALLOWED_MIME_TYPES = [
36+ 'gif ' => 'image/gif ' ,
37+ 'jpg ' => 'image/jpeg ' ,
38+ 'jpeg ' => 'image/jpeg ' ,
39+ 'png ' => 'image/png ' ,
40+ 'webp ' => 'image/webp ' ,
41+ 'mov ' => 'video/quicktime ' ,
42+ 'mp4 ' => 'video/mp4 ' ,
43+ 'webm ' => 'video/webm ' ,
44+ ];
45+
3546 /**
3647 * @throws Exception|\Exception
3748 */
@@ -43,7 +54,7 @@ public function upload(Request $request): JsonResponse
4354 $ session = $ this ->container ->get (id: 'session ' );
4455
4556 $ uploadDir = PMF_CONTENT_DIR . '/user/images/ ' ;
46- $ validFileExtensions = [ ' gif ' , ' jpg ' , ' jpeg ' , ' png ' , ' webp ' , ' mov ' , ' mp4 ' , ' webm ' ] ;
57+ $ validFileExtensions = array_keys ( self :: ALLOWED_MIME_TYPES ) ;
4758 $ timestamp = time ();
4859
4960 if (!Token::getInstance ($ session )->verifyToken ('pmf-csrf-token ' , $ request ->query ->get ('csrf ' ))) {
@@ -93,11 +104,34 @@ public function upload(Request $request): JsonResponse
93104 );
94105 }
95106
96- // Accept upload if there was no origin, or if it is an accepted origin
107+ // Accept upload if there was no origin or if it is an accepted origin
97108 $ fileName = $ timestamp . '_ ' . $ file ->getClientOriginalName ();
98109 $ fileName = str_replace (' ' , '_ ' , $ fileName );
99110 $ file ->move ($ uploadDir , $ fileName );
100111
112+ $ filePath = $ uploadDir . $ fileName ;
113+ $ fileExtension = strtolower ((string ) $ file ->getClientOriginalExtension ());
114+
115+ // Validate actual MIME type matches the claimed extension
116+ $ detectedMime = mime_content_type ($ filePath );
117+ $ expectedMime = self ::ALLOWED_MIME_TYPES [$ fileExtension ] ?? null ;
118+
119+ if ($ detectedMime === false || $ expectedMime === null || $ detectedMime !== $ expectedMime ) {
120+ if (file_exists ($ filePath )) {
121+ unlink ($ filePath );
122+ }
123+
124+ return $ this ->json (
125+ [
126+ 'success ' => false ,
127+ 'data ' => ['code ' => Response::HTTP_BAD_REQUEST ],
128+ 'messages ' => ['File content does not match the file extension ' ],
129+ ],
130+ Response::HTTP_BAD_REQUEST ,
131+ $ headers ,
132+ );
133+ }
134+
101135 // Add to the list of uploaded files
102136 $ uploadedFiles [] = $ fileName ;
103137 }
0 commit comments