Skip to content

Enhanced Customer Data Validation to Mitigate Code Injection Risks #39030

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 148 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
148 commits
Select commit Hold shift + click to select a range
a98f88f
Improve Name Validation in Quote Model Refined Regex Pattern
in-session Aug 9, 2024
213510f
Update di.xml
in-session Aug 9, 2024
65ef19b
Add middle name for validation
in-session Aug 9, 2024
66e445b
add GlobalForbiddenPatterns
in-session Aug 9, 2024
daa5d87
Create GlobalValidationRule.php
in-session Aug 9, 2024
6ecfdbc
Update di.xml
in-session Aug 9, 2024
a834c94
Update GlobalForbiddenPatterns.php
in-session Aug 9, 2024
2d92ef2
GlobalNameValidator.php
in-session Aug 9, 2024
24bc2b3
Update NameValidationRule.php
in-session Aug 9, 2024
d36abbb
Update Name.php
in-session Aug 9, 2024
aa80b31
Update NameTest.php
in-session Aug 9, 2024
0d31501
Update Name.php
in-session Aug 9, 2024
652a2a9
Update NameTest.php
in-session Aug 9, 2024
2d3497c
Update Name.php
in-session Aug 9, 2024
3ecc033
Update GlobalValidationRule.php
in-session Aug 9, 2024
148e69c
Update GlobalValidationRule.php
in-session Aug 9, 2024
d5e13ad
Update GlobalValidationRule.php
in-session Aug 9, 2024
1d9973c
Update GlobalNameValidator.php
in-session Aug 9, 2024
adf906b
Create GlobalPhoneValidation
in-session Aug 9, 2024
be64bb7
Update NameTest.php
in-session Aug 13, 2024
9df5657
Update Name.php
in-session Aug 13, 2024
0e0977e
Update Telephone.php
in-session Aug 13, 2024
39b4436
Update TelephoneTest.php
in-session Aug 13, 2024
021b601
Update GlobalForbiddenPatterns.php
in-session Aug 13, 2024
506ccb4
Update GlobalValidationRule.php
in-session Aug 13, 2024
d016a1b
Update system.xml
in-session Aug 13, 2024
5e7c11e
Update EmailAddress.php
in-session Aug 13, 2024
bbba9d3
Update GlobalValidationRule.php
in-session Aug 13, 2024
6c3c8f4
Update EmailAddress.php
in-session Aug 13, 2024
2aee657
Update City.php
in-session Aug 13, 2024
fa21fcf
Update Street.php
in-session Aug 13, 2024
dd12118
Update EmailAddress.php
in-session Aug 13, 2024
e81a0e6
Update Sharing.php
in-session Aug 13, 2024
f8c1419
Update EmailAddress.php
in-session Aug 13, 2024
0e4928c
Update system.xml
in-session Aug 13, 2024
f053515
Update TelephoneTest.php
in-session Aug 14, 2024
e0b602b
Update TelephoneTest.php
in-session Aug 14, 2024
a0f6e82
Merge branch '2.4-develop' into patch-16
in-session Aug 22, 2024
806305f
Update GlobalValidationRule.php
in-session Aug 23, 2024
b246ca0
Update di.xml
in-session Aug 23, 2024
b35a854
Update NameValidationRule.php
in-session Aug 23, 2024
88a881c
Update BillingAddressValidationRule.php
in-session Aug 23, 2024
92825bf
Update ShippingAddressValidationRule.php
in-session Aug 23, 2024
ecb10b4
Delete app/code/Magento/Quote/Model/ValidationRules/GlobalValidationR…
in-session Aug 23, 2024
5529550
Update system.xml
in-session Aug 23, 2024
40b1517
Merge branch '2.4-develop' into patch-16
in-session Aug 23, 2024
3f2fe6c
Update Sharing.php
in-session Aug 23, 2024
32d5008
Update City.php
in-session Aug 23, 2024
f2b2652
Update CityTest.php
in-session Aug 23, 2024
98e6a40
Update Street.php
in-session Aug 23, 2024
99d8e55
Update StreetTest.php
in-session Aug 23, 2024
38b27df
Create GlobalStreetValidator.php
in-session Aug 23, 2024
0a41bde
Update GlobalStreetValidator.php
in-session Aug 23, 2024
a76fcb9
Update Street.php
in-session Aug 23, 2024
a0b5c1f
Create GlobalCityValidator.php
in-session Aug 23, 2024
35eab54
Update City.php
in-session Aug 23, 2024
82f4df9
Update GlobalCityValidator.php
in-session Aug 23, 2024
a2f733c
Rename GlobalPhoneValidation to GlobalPhoneValidation.php
in-session Aug 23, 2024
557fb0f
Update TelephoneTest.php
in-session Aug 23, 2024
586b313
Update Telephone.php
in-session Aug 23, 2024
3fb2026
Update ShippingAddressValidationRule.php
in-session Aug 23, 2024
5e91253
Update GlobalForbiddenPatterns.php
in-session Aug 23, 2024
fa97229
Update ShippingAddressValidationRule.php
in-session Aug 23, 2024
4cac2b7
Update BillingAddressValidationRule.php
in-session Aug 23, 2024
3229a58
Update ShippingAddressValidationRule.php
in-session Aug 23, 2024
b3a2402
Update Sharing.php
in-session Aug 24, 2024
c3bb45b
Update BillingAddressValidationRule.php
in-session Aug 24, 2024
3e770fa
Update ShippingAddressValidationRule.php
in-session Aug 24, 2024
0290b52
Update NameValidationRule.php
in-session Aug 24, 2024
fdb3158
Update BillingAddressValidationRule.php
in-session Aug 24, 2024
548b1d9
Update ShippingAddressValidationRule.php
in-session Aug 24, 2024
ef5413a
Update NameValidationRule.php
in-session Aug 24, 2024
d705242
Update GlobalCityValidator.php
in-session Aug 24, 2024
b06f792
Update ShippingAddressValidationRule.php
in-session Aug 24, 2024
97a2702
Update NameValidationRule.php
in-session Aug 24, 2024
2743e31
Update Street.php
in-session Aug 24, 2024
f2fe7be
Update GlobalForbiddenPatterns.php
in-session Aug 24, 2024
8bfaaaf
Update Sharing.php
in-session Aug 24, 2024
10da227
Update ShippingAddressValidationRule.php
in-session Aug 24, 2024
f5bf45e
Update NameValidationRule.php
in-session Aug 24, 2024
baddb62
Update BillingAddressValidationRule.php
in-session Aug 24, 2024
199789e
Update Review.php
in-session Aug 24, 2024
7486983
Update Mail.php
in-session Aug 24, 2024
2253d53
Update GlobalPhoneValidation.php
in-session Aug 24, 2024
ee5af0e
Update GlobalPhoneValidation.php
in-session Aug 25, 2024
9710c8e
Update GlobalPhoneValidation.php
in-session Aug 25, 2024
2257ff5
Update GlobalPhoneValidation.php
in-session Aug 25, 2024
b364963
Update GlobalForbiddenPatterns.php
in-session Aug 25, 2024
de4da4e
Update GlobalStreetValidator.php
in-session Aug 26, 2024
fbfb1f4
Update GlobalNameValidator.php
in-session Aug 26, 2024
8ab1c85
Update GlobalCityValidator.php
in-session Aug 26, 2024
2cc40c4
Update Sharing.php
in-session Aug 27, 2024
336ecfb
Create AddressValidationRule.php
in-session Aug 27, 2024
6391fc0
Update BillingAddressValidationRule.php
in-session Aug 27, 2024
d9f714d
Update ShippingAddressValidationRule.php
in-session Aug 27, 2024
ac6170e
Update BillingAddressValidationRule.php
in-session Aug 27, 2024
679f563
Update BillingAddressValidationRule.php
in-session Aug 27, 2024
7560da1
Update ShippingAddressValidationRule.php
in-session Aug 27, 2024
b8b8228
Update ShippingAddressValidationRule.php
in-session Aug 27, 2024
2ef3e20
Update GlobalForbiddenPatterns.php
in-session Aug 27, 2024
a541e5a
Update NameValidationRule.php
in-session Aug 27, 2024
82f3518
Update BillingAddressValidationRule.php
in-session Aug 27, 2024
0ac5c7d
Update ShippingAddressValidationRule.php
in-session Aug 27, 2024
9c2ad64
Update Mail.php
in-session Aug 27, 2024
2b733a0
Update Review.php
in-session Aug 27, 2024
2ffd060
Update AddressValidationRule.php
in-session Aug 27, 2024
2baeff5
Update AddressValidationRule.php
in-session Aug 27, 2024
938e507
Update GlobalForbiddenPatterns.php
in-session Aug 27, 2024
4af77fb
Update AddressValidationRule.php
in-session Aug 27, 2024
2f33722
Update Mail.php
in-session Aug 27, 2024
df00412
Update GlobalForbiddenPatterns.php
in-session Aug 27, 2024
7f2caed
Update AddressValidationRule.php
in-session Aug 27, 2024
b21065a
Update GlobalForbiddenPatterns.php
in-session Aug 27, 2024
4e01d23
Update AddressValidationRule.php
in-session Aug 27, 2024
bfd9197
Update AddressValidationRule.php
in-session Aug 27, 2024
daae5e7
Update AddressValidationRule.php
in-session Aug 27, 2024
57f8e7f
Update GlobalCityValidator.php
in-session Aug 27, 2024
777253d
Update GlobalNameValidator.php
in-session Aug 27, 2024
8f19095
Update GlobalPhoneValidation.php
in-session Aug 27, 2024
0fea457
Update GlobalStreetValidator.php
in-session Aug 27, 2024
a783403
Update GlobalForbiddenPatterns.php
in-session Aug 27, 2024
ed5d363
Update Mail.php
in-session Aug 27, 2024
8286059
Update GlobalStreetValidator.php
in-session Aug 28, 2024
14c1b4c
Update GlobalPhoneValidation.php
in-session Aug 28, 2024
02baadd
Update GlobalNameValidator.php
in-session Aug 28, 2024
66a9b3e
Update GlobalForbiddenPatterns.php
in-session Aug 28, 2024
b9f1668
Update GlobalCityValidator.php
in-session Aug 28, 2024
c489a90
Update City.php
in-session Aug 28, 2024
663e811
Update Name.php
in-session Aug 28, 2024
fab1c33
Update Street.php
in-session Aug 28, 2024
468476c
Update Telephone.php
in-session Aug 28, 2024
762d1cd
Update CityTest.php
in-session Aug 28, 2024
22284e0
Update NameTest.php
in-session Aug 28, 2024
467ec68
Update StreetTest.php
in-session Aug 28, 2024
481ed57
Update TelephoneTest.php
in-session Aug 28, 2024
b9d7d74
Update AddressValidationRule.php
in-session Aug 28, 2024
49d2acf
Update GlobalNameValidator.php
in-session Aug 28, 2024
568743e
Update GlobalPhoneValidation.php
in-session Aug 28, 2024
fc98eba
Update GlobalPhoneValidation.php
in-session Aug 28, 2024
3e7a738
Update GlobalNameValidator.php
in-session Aug 28, 2024
f9d3527
Update GlobalForbiddenPatterns.php
in-session Aug 28, 2024
cb04a74
Update GlobalNameValidator.php
in-session Aug 28, 2024
9539b49
Update GlobalStreetValidator.php
in-session Aug 28, 2024
f140848
Update GlobalPhoneValidation.php
in-session Aug 28, 2024
4bd9691
Update GlobalCityValidator.php
in-session Aug 28, 2024
0ab9061
Update system.xml
in-session Aug 28, 2024
5299e31
Update system.xml
in-session Aug 28, 2024
b8dfb94
Update system.xml
in-session Aug 28, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 27 additions & 1 deletion app/code/Magento/Contact/Model/Mail.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
use Magento\Store\Model\StoreManagerInterface;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\App\Area;
use Magento\Framework\Validator\GlobalForbiddenPatterns;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\Exception\LocalizedException;

class Mail implements MailInterface
{
Expand All @@ -33,24 +36,32 @@ class Mail implements MailInterface
*/
private $storeManager;

/**
* @var GlobalForbiddenPatterns
*/
private $forbiddenPatternsValidator;

/**
* Initialize dependencies.
*
* @param ConfigInterface $contactsConfig
* @param TransportBuilder $transportBuilder
* @param StateInterface $inlineTranslation
* @param StoreManagerInterface|null $storeManager
* @param GlobalForbiddenPatterns $forbiddenPatternsValidator
*/
public function __construct(
ConfigInterface $contactsConfig,
TransportBuilder $transportBuilder,
StateInterface $inlineTranslation,
StoreManagerInterface $storeManager = null
StoreManagerInterface $storeManager = null,
GlobalForbiddenPatterns $forbiddenPatternsValidator
) {
$this->contactsConfig = $contactsConfig;
$this->transportBuilder = $transportBuilder;
$this->inlineTranslation = $inlineTranslation;
$this->storeManager = $storeManager ?: ObjectManager::getInstance()->get(StoreManagerInterface::class);
$this->forbiddenPatternsValidator = $forbiddenPatternsValidator;
}

/**
Expand All @@ -59,9 +70,24 @@ public function __construct(
* @param string $replyTo
* @param array $variables
* @return void
* @throws LocalizedException
*/
public function send($replyTo, array $variables)
{
$validationErrors = [];
$fieldsToValidate = [
'name' => $variables['data']['name'] ?? '',
'comment' => $variables['data']['comment'] ?? '',
'email' => $variables['data']['email'] ?? '',
];
$this->forbiddenPatternsValidator->validateData($fieldsToValidate, $validationErrors);

if (!empty($validationErrors)) {
throw new \Magento\Framework\Exception\LocalizedException(
__(implode("\n", $validationErrors))
);
}

/** @see \Magento\Contact\Controller\Index\Post::validatedParams() */
$replyToName = !empty($variables['data']['name']) ? $variables['data']['name'] : null;

Expand Down
41 changes: 15 additions & 26 deletions app/code/Magento/Customer/Model/Validator/City.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,53 +9,42 @@

use Magento\Customer\Model\Customer;
use Magento\Framework\Validator\AbstractValidator;
use Magento\Framework\Validator\GlobalCityValidator;

/**
* Customer city fields validator.
*/
class City extends AbstractValidator
{
/**
* Allowed characters:
*
* \p{L}: Unicode letters.
* \p{M}: Unicode marks (diacritic marks, accents, etc.).
* ': Apostrophe mark.
* \s: Whitespace characters (spaces, tabs, newlines, etc.).
* @var GlobalCityValidator
*/
private const PATTERN_CITY = '/(?:[\p{L}\p{M}\s\-\']{1,100})/u';
private $cityValidator;

/**
* Validate city fields.
* City constructor.
*
* @param Customer $customer
* @return bool
* @param GlobalCityValidator $cityValidator
*/
public function isValid($customer)
public function __construct(GlobalCityValidator $cityValidator)
{
if (!$this->isValidCity($customer->getCity())) {
parent::_addMessages([[
'city' => "Invalid City. Please use A-Z, a-z, 0-9, -, ', spaces"
]]);
}

return count($this->_messages) == 0;
$this->cityValidator = $cityValidator;
}

/**
* Check if city field is valid.
* Validate city fields.
*
* @param string|null $cityValue
* @param Customer $customer
* @return bool
*/
private function isValidCity($cityValue)
public function isValid($customer): bool
{
if ($cityValue != null) {
if (preg_match(self::PATTERN_CITY, $cityValue, $matches)) {
return $matches[0] == $cityValue;
}
if (!$this->cityValidator->isValidCity($customer->getCity())) {
parent::_addMessages([[
'city' => __("Invalid City. Please use only A-Z, a-z, 0-9, spaces, commas, -, ., ', &, [], ().")
]]);
}

return true;
return count($this->_messages) == 0;
}
}
45 changes: 21 additions & 24 deletions app/code/Magento/Customer/Model/Validator/Name.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,27 @@

use Magento\Customer\Model\Customer;
use Magento\Framework\Validator\AbstractValidator;
use Magento\Framework\Validator\GlobalNameValidator;

/**
* Customer name fields validator.
*/
class Name extends AbstractValidator
{
private const PATTERN_NAME = '/(?:[\p{L}\p{M}\,\-\_\.\'’`&\s\d]){1,255}+/u';
/**
* @var GlobalNameValidator
*/
private $nameValidator;

/**
* Name constructor.
*
* @param GlobalNameValidator $nameValidator
*/
public function __construct(GlobalNameValidator $nameValidator)
{
$this->nameValidator = $nameValidator;
}

/**
* Validate name fields.
Expand All @@ -25,35 +39,18 @@ class Name extends AbstractValidator
*/
public function isValid($customer)
{
if (!$this->isValidName($customer->getFirstname())) {
parent::_addMessages([['firstname' => 'First Name is not valid!']]);
if (!$this->nameValidator->isValidName($customer->getFirstname())) {
parent::_addMessages([['firstname' => __('First Name is not valid!')]]);
}

if (!$this->isValidName($customer->getLastname())) {
parent::_addMessages([['lastname' => 'Last Name is not valid!']]);
if (!$this->nameValidator->isValidName($customer->getLastname())) {
parent::_addMessages([['lastname' => __('Last Name is not valid!')]]);
}

if (!$this->isValidName($customer->getMiddlename())) {
parent::_addMessages([['middlename' => 'Middle Name is not valid!']]);
if (!$this->nameValidator->isValidName($customer->getMiddlename())) {
parent::_addMessages([['middlename' => __('Middle Name is not valid!')]]);
}

return count($this->_messages) == 0;
}

/**
* Check if name field is valid.
*
* @param string|null $nameValue
* @return bool
*/
private function isValidName($nameValue)
{
if ($nameValue != null) {
if (preg_match(self::PATTERN_NAME, $nameValue, $matches)) {
return $matches[0] == $nameValue;
}
}

return true;
}
}
49 changes: 18 additions & 31 deletions app/code/Magento/Customer/Model/Validator/Street.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,60 +9,47 @@

use Magento\Customer\Model\Customer;
use Magento\Framework\Validator\AbstractValidator;
use Magento\Framework\Validator\GlobalStreetValidator;

/**
* Customer street fields validator.
*/
class Street extends AbstractValidator
{
/**
* Allowed characters:
* @var GlobalStreetValidator
*/
private $streetValidator;

/**
* Street constructor.
*
* \p{L}: Unicode letters.
* \p{M}: Unicode marks (diacritic marks, accents, etc.).
* ,: Comma.
* -: Hyphen.
* .: Period.
* `'’: Single quotes, both regular and right single quotation marks.
* &: Ampersand.
* \s: Whitespace characters (spaces, tabs, newlines, etc.).
* \d: Digits (0-9).
* @param GlobalStreetValidator $streetValidator
*/
private const PATTERN_STREET = "/(?:[\p{L}\p{M}\"[],-.'’`&\s\d]){1,255}+/u";
public function __construct(GlobalStreetValidator $streetValidator)
{
$this->streetValidator = $streetValidator;
}

/**
* Validate street fields.
*
* @param Customer $customer
* @return bool
*/
public function isValid($customer)
public function isValid($customer): bool
{
foreach ($customer->getStreet() as $street) {
if (!$this->isValidStreet($street)) {
if (!$this->streetValidator->isValidStreet($street)) {
parent::_addMessages([[
'street' => "Invalid Street Address. Please use A-Z, a-z, 0-9, , - . ' ’ ` & spaces"
'street' => __(
"Invalid Street Address. Please use only A-Z, a-z, 0-9, spaces, commas, -, ., ', " .
"&, [], ()"
)
]]);
}
}

return count($this->_messages) == 0;
}

/**
* Check if street field is valid.
*
* @param string|null $streetValue
* @return bool
*/
private function isValidStreet($streetValue)
{
if ($streetValue != null) {
if (preg_match(self::PATTERN_STREET, $streetValue, $matches)) {
return $matches[0] == $streetValue;
}
}

return true;
}
}
41 changes: 15 additions & 26 deletions app/code/Magento/Customer/Model/Validator/Telephone.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,28 @@

use Magento\Customer\Model\Customer;
use Magento\Framework\Validator\AbstractValidator;
use Magento\Framework\Validator\GlobalPhoneValidation;

/**
* Customer telephone fields validator.
*/
class Telephone extends AbstractValidator
{
/**
* Allowed char:
* @var GlobalPhoneValidation
*/
private $phoneValidator;

/**
* Telephone constructor.
*
* \() :Matches open and close parentheses
* \+: Matches the plus sign.
* \-: Matches the hyphen.
* \d: Digits (0-9).
* @param GlobalPhoneValidation $phoneValidator
*/
private const PATTERN_TELEPHONE = '/(?:[\d\s\+\-\()]{1,20})/u';

public function __construct(GlobalPhoneValidation $phoneValidator)
{
$this->phoneValidator = $phoneValidator;
}

/**
* Validate telephone fields.
*
Expand All @@ -33,29 +39,12 @@ class Telephone extends AbstractValidator
*/
public function isValid($customer)
{
if (!$this->isValidTelephone($customer->getTelephone())) {
if (!$this->phoneValidator->isValidPhone($customer->getTelephone())) {
parent::_addMessages([[
'telephone' => "Invalid Phone Number. Please use 0-9, +, -, (, ) and space."
'telephone' => __('Invalid Phone Number. Please use 0-9, +, -, (), /, and space.')
]]);
}

return count($this->_messages) == 0;
}

/**
* Check if telephone field is valid.
*
* @param string|null $telephoneValue
* @return bool
*/
private function isValidTelephone($telephoneValue)
{
if ($telephoneValue != null) {
if (preg_match(self::PATTERN_TELEPHONE, (string) $telephoneValue, $matches)) {
return $matches[0] == $telephoneValue;
}
}

return true;
}
}
Loading