Skip to content
This repository has been archived by the owner on Jan 31, 2020. It is now read-only.

Commit

Permalink
Update EmailAddress validator with correct list of reserved IP addresses
Browse files Browse the repository at this point in the history
  • Loading branch information
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 7 deletions.
29 changes: 22 additions & 7 deletions src/EmailAddress.php
Original file line number Diff line number Diff line change
Expand Up @@ -270,11 +270,23 @@ public function useDomainCheck($domain = true)
*
* The following addresses are seen as reserved
* '0.0.0.0/8', '10.0.0.0/8', '127.0.0.0/8'
* '100.64.0.0/10'
* '172.16.0.0/12'
* '198.18.0.0/15'
* '128.0.0.0/16', '169.254.0.0/16', '191.255.0.0/16', '192.168.0.0/16'
* '192.0.0.0/24', '192.0.2.0/24', '192.88.99.0/24', '198.51.100.0/24', '203.0.113.0/24', '223.255.255.0/24'
* '169.254.0.0/16', '192.168.0.0/16'
* '192.0.2.0/24', '192.88.99.0/24', '198.51.100.0/24', '203.0.113.0/24'
* '224.0.0.0/4', '240.0.0.0/4'
* @see http://en.wikipedia.org/wiki/Reserved_IP_addresses
*
* As of RFC5753 (JAN 2010), the following blocks are no logner reserved:
* - 128.0.0.0/16
* - 191.255.0.0/16
* - 223.255.255.0/24
* @see http://tools.ietf.org/html/rfc5735#page-6
*
* As of RFC6598 (APR 2012), the following blocks are now reserved:
* - 100.64.0.0/10
* @see http://tools.ietf.org/html/rfc6598#section-7
*
* @param string $host
* @return boolean Returns false when minimal one of the given addresses is not reserved
Expand All @@ -294,19 +306,22 @@ protected function isReserved($host)
foreach ($host as $server) {
// Search for 0.0.0.0/8, 10.0.0.0/8, 127.0.0.0/8
if (!preg_match('/^(0|10|127)(\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))){3}$/', $server) &&
// Search for 172.16.0.0.12
// Search for 100.64.0.0/10
!preg_match('/^100\.(6[0-4]|[7-9][0-9]|1[0-1][0-9]|12[0-7])(\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))){2}$/', $server) &&
// Search for 172.16.0.0/12
!preg_match('/^172\.(1[6-9]|2[0-9]|3[0-1])(\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))){2}$/', $server) &&
// Search for 198.18.0.0/15
!preg_match('/^198\.(1[8-9])(\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))){2}$/', $server) &&
// Search for 128.0.0.0/16, 169.254.0.0/16, 191.255.0.0/16, 192.168.0.0/16
!preg_match('/^(128\.0|169\.254|191\.255|192\.168)(\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))){2}$/', $server) &&
// Search for 192.0.0.0/24, 192.0.2.0/24, 192.88.99.0/24, 198.51.100.0/24, 203.0.113.0/24, 223.255.255.0/24
!preg_match('/^(192\.0\.(0|2)|192\.88\.99|198\.51\.100|203\.0\.113|223\.255\.255)\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))$/', $server) &&
// Search for 169.254.0.0/16, 192.168.0.0/16
!preg_match('/^(169\.254|192\.168)(\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))){2}$/', $server) &&
// Search for 192.0.2.0/24, 192.88.99.0/24, 198.51.100.0/24, 203.0.113.0/24
!preg_match('/^(192\.0\.2|192\.88\.99|198\.51\.100|203\.0\.113)\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))$/', $server) &&
// Search for 224.0.0.0/4, 240.0.0.0/4
!preg_match('/^(2(2[4-9]|[3-4][0-9]|5[0-5]))(\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))){3}$/', $server)) {
return false;
}
}
return true;
}

/**
Expand Down
69 changes: 69 additions & 0 deletions test/EmailAddressTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -651,4 +651,73 @@ public function testUseMxRecordsBasicInvalid()
$this->assertFalse($validator->isValid($input), implode("\n", $this->validator->getMessages()) . $input);
}
}

/**
* @group ZF-12349
*/
public function testReservedIpRangeValidation()
{
$validator = new TestAsset\EmailValidatorWithExposedIsReserved();
// 0.0.0.0/8
$this->assertTrue($validator->isReserved('0.0.0.0'));
$this->assertTrue($validator->isReserved('0.255.255.255'));
// 10.0.0.0/8
$this->assertTrue($validator->isReserved('10.0.0.0'));
$this->assertTrue($validator->isReserved('10.255.255.255'));
// 127.0.0.0/8
$this->assertTrue($validator->isReserved('127.0.0.0'));
$this->assertTrue($validator->isReserved('127.255.255.255'));
// 100.64.0.0/10
$this->assertTrue($validator->isReserved('100.64.0.0'));
$this->assertTrue($validator->isReserved('100.127.255.255'));
// 172.16.0.0/12
$this->assertTrue($validator->isReserved('172.16.0.0'));
$this->assertTrue($validator->isReserved('172.31.255.255'));
// 198.18.0.0./15
$this->assertTrue($validator->isReserved('198.18.0.0'));
$this->assertTrue($validator->isReserved('198.19.255.255'));
// 169.254.0.0/16
$this->assertTrue($validator->isReserved('169.254.0.0'));
$this->assertTrue($validator->isReserved('169.254.255.255'));
// 192.168.0.0/16
$this->assertTrue($validator->isReserved('192.168.0.0'));
$this->assertTrue($validator->isReserved('192.168.255.25'));
// 192.0.2.0/24
$this->assertTrue($validator->isReserved('192.0.2.0'));
$this->assertTrue($validator->isReserved('192.0.2.255'));
// 192.88.99.0/24
$this->assertTrue($validator->isReserved('192.88.99.0'));
$this->assertTrue($validator->isReserved('192.88.99.255'));
// 198.51.100.0/24
$this->assertTrue($validator->isReserved('198.51.100.0'));
$this->assertTrue($validator->isReserved('198.51.100.255'));
// 203.0.113.0/24
$this->assertTrue($validator->isReserved('203.0.113.0'));
$this->assertTrue($validator->isReserved('203.0.113.255'));
// 224.0.0.0/4
$this->assertTrue($validator->isReserved('224.0.0.0'));
$this->assertTrue($validator->isReserved('239.255.255.255'));
// 240.0.0.0/4
$this->assertTrue($validator->isReserved('240.0.0.0'));
$this->assertTrue($validator->isReserved('255.255.255.254'));
// 255.255.255.255/32
$this->assertTrue($validator->isReserved('255.255.55.255'));
}

/**
* @group ZF-12349
*/
public function testIpRangeValidationOnRangesNoLongerMarkedAsReserved()
{
$validator = new TestAsset\EmailValidatorWithExposedIsReserved();
// 128.0.0.0/16
$this->assertFalse($validator->isReserved('128.0.0.0'));
$this->assertFalse($validator->isReserved('128.0.255.255'));
// 191.255.0.0/16
$this->assertFalse($validator->isReserved('191.255.0.0'));
$this->assertFalse($validator->isReserved('191.255.255.255'));
// 223.255.255.0/24
$this->assertFalse($validator->isReserved('223.255.255.0'));
$this->assertFalse($validator->isReserved('223.255.255.255'));
}
}
12 changes: 12 additions & 0 deletions test/TestAsset/EmailValidatorWithExposedIsReserved.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php
namespace ZendTest\Validator\TestAsset;

use Zend\Validator\EmailAddress;

class EmailValidatorWithExposedIsReserved extends EmailAddress
{
public function isReserved($host)
{
return parent::isReserved($host);
}
}

0 comments on commit 51c70ed

Please sign in to comment.