Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 0405ac6

Browse filesBrowse files
committed
Add corrupted images validation
1 parent caae21c commit 0405ac6
Copy full SHA for 0405ac6

File tree

4 files changed

+133
-1
lines changed
Filter options

4 files changed

+133
-1
lines changed

‎src/Symfony/Component/Validator/Constraints/Image.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Validator/Constraints/Image.php
+4Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class Image extends File
3030
const SQUARE_NOT_ALLOWED_ERROR = '5d41425b-facb-47f7-a55a-de9fbe45cb46';
3131
const LANDSCAPE_NOT_ALLOWED_ERROR = '6f895685-7cf2-4d65-b3da-9029c5581d88';
3232
const PORTRAIT_NOT_ALLOWED_ERROR = '65608156-77da-4c79-a88c-02ef6d18c782';
33+
const CORRUPTED_IMAGE_ERROR = '5d4163f3-648f-4e39-87fd-cc5ea7aad2d1';
3334

3435
// Include the mapping from the base class
3536

@@ -49,6 +50,7 @@ class Image extends File
4950
self::SQUARE_NOT_ALLOWED_ERROR => 'SQUARE_NOT_ALLOWED_ERROR',
5051
self::LANDSCAPE_NOT_ALLOWED_ERROR => 'LANDSCAPE_NOT_ALLOWED_ERROR',
5152
self::PORTRAIT_NOT_ALLOWED_ERROR => 'PORTRAIT_NOT_ALLOWED_ERROR',
53+
self::CORRUPTED_IMAGE_ERROR => 'CORRUPTED_IMAGE_ERROR',
5254
);
5355

5456
public $mimeTypes = 'image/*';
@@ -61,6 +63,7 @@ class Image extends File
6163
public $allowSquare = true;
6264
public $allowLandscape = true;
6365
public $allowPortrait = true;
66+
public $detectCorrupted = false;
6467

6568
// The constant for a wrong MIME type is taken from the parent class.
6669
public $mimeTypesMessage = 'This file is not a valid image.';
@@ -74,4 +77,5 @@ class Image extends File
7477
public $allowSquareMessage = 'The image is square ({{ width }}x{{ height }}px). Square images are not allowed.';
7578
public $allowLandscapeMessage = 'The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.';
7679
public $allowPortraitMessage = 'The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.';
80+
public $corruptedMessage = 'This file contains corrupted image.';
7781
}

‎src/Symfony/Component/Validator/Constraints/ImageValidator.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Validator/Constraints/ImageValidator.php
+19Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Symfony\Component\Validator\Constraint;
1515
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
16+
use Symfony\Component\Validator\Exception\RuntimeException;
1617
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
1718

1819
/**
@@ -43,6 +44,24 @@ public function validate($value, Constraint $constraint)
4344
return;
4445
}
4546

47+
if ($constraint->detectCorrupted) {
48+
if (!function_exists('imagecreatefromstring')) {
49+
throw new RuntimeException('Strict image validation requires installed and enabled GD extension');
50+
}
51+
52+
$resource = @imagecreatefromstring(file_get_contents($value));
53+
54+
if (false === $resource) {
55+
$this->context->buildViolation($constraint->corruptedMessage)
56+
->setCode(Image::CORRUPTED_IMAGE_ERROR)
57+
->addViolation();
58+
59+
return;
60+
}
61+
62+
imagedestroy($resource);
63+
}
64+
4665
if (null === $constraint->minWidth && null === $constraint->maxWidth
4766
&& null === $constraint->minHeight && null === $constraint->maxHeight
4867
&& null === $constraint->minRatio && null === $constraint->maxRatio

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.