mirror of
				https://github.com/yiisoft/yii2.git
				synced 2025-11-04 14:46:19 +08:00 
			
		
		
		
	Fix #18313: Fix multipart form data parse with double quotes
This commit is contained in:
		@ -10,7 +10,7 @@ Yii Framework 2 Change Log
 | 
				
			|||||||
- Bug #18303: Fix creating migration issue for column methods used after defaultValues (wsaid)
 | 
					- Bug #18303: Fix creating migration issue for column methods used after defaultValues (wsaid)
 | 
				
			||||||
- Bug #18287: Fix for OUTPUT INSERTED and computed columns. Added flag to computed values in table schema (darkdef)
 | 
					- Bug #18287: Fix for OUTPUT INSERTED and computed columns. Added flag to computed values in table schema (darkdef)
 | 
				
			||||||
- Bug #18308: Fixed `\yii\base\Model::getErrorSummary()` reverse order (DrDeath72)
 | 
					- Bug #18308: Fixed `\yii\base\Model::getErrorSummary()` reverse order (DrDeath72)
 | 
				
			||||||
 | 
					- Bug #18313: Fix multipart form data parse with double quotes (wsaid)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
2.0.38 September 14, 2020
 | 
					2.0.38 September 14, 2020
 | 
				
			||||||
-------------------------
 | 
					-------------------------
 | 
				
			||||||
 | 
				
			|||||||
@ -141,10 +141,11 @@ class MultipartFormDataParser extends BaseObject implements RequestParserInterfa
 | 
				
			|||||||
            return [];
 | 
					            return [];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!preg_match('/boundary=(.*)$/is', $contentType, $matches)) {
 | 
					        if (!preg_match('/boundary="?(.*)"?$/is', $contentType, $matches)) {
 | 
				
			||||||
            return [];
 | 
					            return [];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        $boundary = $matches[1];
 | 
					
 | 
				
			||||||
 | 
					        $boundary = trim($matches[1], '"');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $bodyParts = preg_split('/\\R?-+' . preg_quote($boundary, '/') . '/s', $rawBody);
 | 
					        $bodyParts = preg_split('/\\R?-+' . preg_quote($boundary, '/') . '/s', $rawBody);
 | 
				
			||||||
        array_pop($bodyParts); // last block always has no data, contains boundary ending like `--`
 | 
					        array_pop($bodyParts); // last block always has no data, contains boundary ending like `--`
 | 
				
			||||||
 | 
				
			|||||||
@ -52,6 +52,45 @@ class MultipartFormDataParserTest extends TestCase
 | 
				
			|||||||
        $this->assertStringEqualsFile($_FILES['Item']['tmp_name']['file'], 'item file content');
 | 
					        $this->assertStringEqualsFile($_FILES['Item']['tmp_name']['file'], 'item file content');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testParseWithDoubleQuotes()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (defined('HHVM_VERSION')) {
 | 
				
			||||||
 | 
					            static::markTestSkipped('Can not test on HHVM because it does not support proper handling of the temporary files.');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $parser = new MultipartFormDataParser();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $boundary = '---------------------------22472926011618';
 | 
				
			||||||
 | 
					        $contentType = 'multipart/form-data; boundary="' . $boundary . '"';
 | 
				
			||||||
 | 
					        $rawBody = "--{$boundary}\nContent-Disposition: form-data; name=\"title\"\r\n\r\ntest-title";
 | 
				
			||||||
 | 
					        $rawBody .= "\r\n--{$boundary}\nContent-Disposition: form-data; name=\"Item[name]\"\r\n\r\ntest-name";
 | 
				
			||||||
 | 
					        $rawBody .= "\r\n--{$boundary}\nContent-Disposition: form-data; name=\"someFile\"; filename=\"some-file.txt\"\nContent-Type: text/plain\r\n\r\nsome file content";
 | 
				
			||||||
 | 
					        $rawBody .= "\r\n--{$boundary}\nContent-Disposition: form-data; name=\"Item[file]\"; filename=\"item-file.txt\"\nContent-Type: text/plain\r\n\r\nitem file content";
 | 
				
			||||||
 | 
					        $rawBody .= "\r\n--{$boundary}--";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $bodyParams = $parser->parse($rawBody, $contentType);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $expectedBodyParams = [
 | 
				
			||||||
 | 
					            'title' => 'test-title',
 | 
				
			||||||
 | 
					            'Item' => [
 | 
				
			||||||
 | 
					                'name' => 'test-name',
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					        $this->assertEquals($expectedBodyParams, $bodyParams);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertNotEmpty($_FILES['someFile']);
 | 
				
			||||||
 | 
					        $this->assertEquals(UPLOAD_ERR_OK, $_FILES['someFile']['error']);
 | 
				
			||||||
 | 
					        $this->assertEquals('some-file.txt', $_FILES['someFile']['name']);
 | 
				
			||||||
 | 
					        $this->assertEquals('text/plain', $_FILES['someFile']['type']);
 | 
				
			||||||
 | 
					        $this->assertStringEqualsFile($_FILES['someFile']['tmp_name'], 'some file content');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertNotEmpty($_FILES['Item']);
 | 
				
			||||||
 | 
					        $this->assertNotEmpty($_FILES['Item']['name']['file']);
 | 
				
			||||||
 | 
					        $this->assertEquals(UPLOAD_ERR_OK, $_FILES['Item']['error']['file']);
 | 
				
			||||||
 | 
					        $this->assertEquals('item-file.txt', $_FILES['Item']['name']['file']);
 | 
				
			||||||
 | 
					        $this->assertEquals('text/plain', $_FILES['Item']['type']['file']);
 | 
				
			||||||
 | 
					        $this->assertStringEqualsFile($_FILES['Item']['tmp_name']['file'], 'item file content');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @depends testParse
 | 
					     * @depends testParse
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user