@@ -54,12 +54,21 @@ final class MultipartParser
5454 */
5555 private $ uploadMaxFilesize ;
5656
57+ /**
58+ * ini setting "max_file_uploads"
59+ *
60+ * @var int
61+ */
62+ private $ maxFileUploads ;
63+
5764 private $ postCount = 0 ;
65+ private $ filesCount = 0 ;
5866
5967 /**
6068 * @param int|null $uploadMaxFilesize
69+ * @param int|null $maxFileUploads
6170 */
62- public function __construct ($ uploadMaxFilesize = null )
71+ public function __construct ($ uploadMaxFilesize = null , $ maxFileUploads = null )
6372 {
6473 $ var = ini_get ('max_input_vars ' );
6574 if ($ var !== false ) {
@@ -71,6 +80,7 @@ public function __construct($uploadMaxFilesize = null)
7180 }
7281
7382 $ this ->uploadMaxFilesize = $ uploadMaxFilesize === null ? $ this ->iniUploadMaxFilesize () : (int )$ uploadMaxFilesize ;
83+ $ this ->maxFileUploads = $ maxFileUploads === null ? (int )ini_get ('max_file_uploads ' ) : (int )$ maxFileUploads ;
7484 }
7585
7686 public function parse (ServerRequestInterface $ request )
@@ -86,6 +96,7 @@ public function parse(ServerRequestInterface $request)
8696 $ request = $ this ->request ;
8797 $ this ->request = null ;
8898 $ this ->postCount = 0 ;
99+ $ this ->filesCount = 0 ;
89100 $ this ->maxFileSize = null ;
90101
91102 return $ request ;
@@ -147,15 +158,25 @@ private function parsePart($chunk)
147158
148159 private function parseFile ($ name , $ filename , $ contentType , $ contents )
149160 {
161+ $ file = $ this ->parseUploadedFile ($ filename , $ contentType , $ contents );
162+ if ($ file === null ) {
163+ return ;
164+ }
165+
150166 $ this ->request = $ this ->request ->withUploadedFiles ($ this ->extractPost (
151167 $ this ->request ->getUploadedFiles (),
152168 $ name ,
153- $ this -> parseUploadedFile ( $ filename , $ contentType , $ contents )
169+ $ file
154170 ));
155171 }
156172
157173 private function parseUploadedFile ($ filename , $ contentType , $ contents )
158174 {
175+ // ignore excessive number of file uploads
176+ if (++$ this ->filesCount > $ this ->maxFileUploads ) {
177+ return ;
178+ }
179+
159180 $ size = strlen ($ contents );
160181
161182 // no file selected (zero size and empty filename)
0 commit comments