用于 IDN 域的 Zend 2 主机名验证器
Zend 2 Hostname Validator for IDN Domains
我可以将 töst.tv
注册为域,换句话说,它是一个有效的域名。
在以下示例中,Zend 2 主机名验证器将 return 为假:
// create hostname validator
$oHostnameValidator = new \Zend\Validator\Hostname(array(
'allow' => \Zend\Validator\Hostname::ALLOW_DNS,
'useIdnCheck' => true,
'useTldCheck' => false,
));
if(!$oHostnameValidator->isValid('töst.tv')) // isValid returns false
{
print_r($oHostnameValidator->getMessages());
}
getMessages
将 return:
Array
(
[hostnameInvalidHostnameSchema] => Die Eingabe scheint ein DNS Hostname zu sein, passt aber ...
[hostnameInvalidLocalName] => Die Eingabe scheint kein gültiger lokaler Netzerkname zu...
)
我看到 protected $validIdns
不包括顶级域名 tv
(在 class Zend\Validator\Hostname
中)
有没有办法(更新安全)将当前有效的 idn 检查注入到 zend 主机名验证器中的某些 tld 中?
或者这是一个应该报告的错误?
编辑
我刚刚扩展了主机名验证器(感谢 Wilt)
<?php
namespace yourNamespace;
class Hostname extends \Zend\Validator\Hostname
{
/**
* Sets validator options.
*
* @param int $allow OPTIONAL Set what types of hostname to allow (default ALLOW_DNS)
* @param bool $useIdnCheck OPTIONAL Set whether IDN domains are validated (default true)
* @param bool $useTldCheck Set whether the TLD element of a hostname is validated (default true)
* @param Ip $ipValidator OPTIONAL
* @see http://www.iana.org/cctld/specifications-policies-cctlds-01apr02.htm Technical Specifications for ccTLDs
*/
public function __construct($options = array())
{
// call parent construct
parent::__construct($options);
// inject valid idns
$this->_injectValidIDNs();
}
/**
* inject new valid idns - use first DE validation as default (until we get the specified correct ones ...)
*/
protected function _injectValidIDNs()
{
// inject TV validation
if(!isset($this->validIdns['TV']))
{
$this->validIdns['TV'] = array(
1 => array_values($this->validIdns['DE'])[0],
);
}
}
}
您可以在 GitHub 上提出问题并为 Zend\Validator\Hostname
class 提出拉取请求,您可以在其中添加根据您认为应该也在 [= 内的值15=]数组。
否则,您也可以扩展项目中现有的 class 并用您的自定义值覆盖现有的 $validIdns
值:
<?php
namespace My\Validator;
class HostName extends \Zend\Validator\Hostname
{
protected $validIdns = [
//...your custom value for TV + existing ones...
]
}
现在你可以这样使用了:
$oHostnameValidator = new \My\Validator\Hostname(array(
'allow' => \My\Validator\Hostname::ALLOW_DNS,
'useIdnCheck' => true,
'useTldCheck' => false,
));
我可以将 töst.tv
注册为域,换句话说,它是一个有效的域名。
在以下示例中,Zend 2 主机名验证器将 return 为假:
// create hostname validator
$oHostnameValidator = new \Zend\Validator\Hostname(array(
'allow' => \Zend\Validator\Hostname::ALLOW_DNS,
'useIdnCheck' => true,
'useTldCheck' => false,
));
if(!$oHostnameValidator->isValid('töst.tv')) // isValid returns false
{
print_r($oHostnameValidator->getMessages());
}
getMessages
将 return:
Array
(
[hostnameInvalidHostnameSchema] => Die Eingabe scheint ein DNS Hostname zu sein, passt aber ...
[hostnameInvalidLocalName] => Die Eingabe scheint kein gültiger lokaler Netzerkname zu...
)
我看到 protected $validIdns
不包括顶级域名 tv
(在 class Zend\Validator\Hostname
中)
有没有办法(更新安全)将当前有效的 idn 检查注入到 zend 主机名验证器中的某些 tld 中?
或者这是一个应该报告的错误?
编辑
我刚刚扩展了主机名验证器(感谢 Wilt)
<?php
namespace yourNamespace;
class Hostname extends \Zend\Validator\Hostname
{
/**
* Sets validator options.
*
* @param int $allow OPTIONAL Set what types of hostname to allow (default ALLOW_DNS)
* @param bool $useIdnCheck OPTIONAL Set whether IDN domains are validated (default true)
* @param bool $useTldCheck Set whether the TLD element of a hostname is validated (default true)
* @param Ip $ipValidator OPTIONAL
* @see http://www.iana.org/cctld/specifications-policies-cctlds-01apr02.htm Technical Specifications for ccTLDs
*/
public function __construct($options = array())
{
// call parent construct
parent::__construct($options);
// inject valid idns
$this->_injectValidIDNs();
}
/**
* inject new valid idns - use first DE validation as default (until we get the specified correct ones ...)
*/
protected function _injectValidIDNs()
{
// inject TV validation
if(!isset($this->validIdns['TV']))
{
$this->validIdns['TV'] = array(
1 => array_values($this->validIdns['DE'])[0],
);
}
}
}
您可以在 GitHub 上提出问题并为 Zend\Validator\Hostname
class 提出拉取请求,您可以在其中添加根据您认为应该也在 [= 内的值15=]数组。
否则,您也可以扩展项目中现有的 class 并用您的自定义值覆盖现有的 $validIdns
值:
<?php
namespace My\Validator;
class HostName extends \Zend\Validator\Hostname
{
protected $validIdns = [
//...your custom value for TV + existing ones...
]
}
现在你可以这样使用了:
$oHostnameValidator = new \My\Validator\Hostname(array(
'allow' => \My\Validator\Hostname::ALLOW_DNS,
'useIdnCheck' => true,
'useTldCheck' => false,
));