在 PHP 中验证 URL 的最安全方法是什么?
What is the most secure way to validate URLs in PHP?
我正在处理一个片段,我需要验证 URLs,所以我知道我正在将数据发送到正确的 URL,为此我使用 filter_var()
函数。
我开始测试时就遇到了问题,这是我的代码;
<?php
function post($webLink){
$url = filter_var($webLink, FILTER_SANITIZE_URL);
if (filter_var($url, FILTER_VALIDATE_URL)) {
echo 'Correct';
}
else {
echo 'Please check your url.';
}
}
post('h://www.google.com');
?>
许多无效链接被验证为正确的网址,包括当前链接。
经过验证的链接是;
ht1tp://www.google.com
h://ww.google.com
http://www.google.
http://www.google.343
我不相信它是验证这些链接是否正确的函数,我认为我的 if (filter_var($url, FILTER_VALIDATE_URL))
行有问题。
我需要澄清如何正确使用它。谢谢
首先,只验证输入。永远不要清理输入。在它准备好成为输出之前不要消毒。这是全面处理数据的一般规则,对于安全显示 URL 与防止 XSS 攻击、SQL 注入等同样重要。
其次,FILTER_VALIDATE_URL 根据 RFC 2396 验证 URL。该 RFC 未指定任何特定方案,但它确实提供了几个示例(即 HTTP:、GOPHER:、MAILTO: 等) . validate filters 上的 PHP 手册明确指出:
Beware a valid URL may not specify the HTTP protocol http:// so further validation may be required to determine the URL uses an expected protocol, e.g. ssh:// or mailto:.
另外,RFC 没有定义域名的结构,也不期望任何特定的顶级域。因此,验证过滤器不检查那些。域名由注册服务商按照 ICANN 规则正式分配,但您可以自由配置自己的本地 DNS 服务器以创建您想要的任何条目,包括创建仅限 TLD 的条目,因此 任何域名是有效的,无论是否通过验证过滤器。
验证某些明确定义的数据的最安全方法是将其列入白名单。如果你真的想确保没有人超过你 "ht tp:com.google.xssHackHere" 那么你需要自己做进一步的检查。请注意,现在有数百个有效的 TLD,如果您想验证域名和方案,并不是所有的 TLD 都可以轻松地用 ASCII 字符表示。
我正在处理一个片段,我需要验证 URLs,所以我知道我正在将数据发送到正确的 URL,为此我使用 filter_var()
函数。
我开始测试时就遇到了问题,这是我的代码;
<?php
function post($webLink){
$url = filter_var($webLink, FILTER_SANITIZE_URL);
if (filter_var($url, FILTER_VALIDATE_URL)) {
echo 'Correct';
}
else {
echo 'Please check your url.';
}
}
post('h://www.google.com');
?>
许多无效链接被验证为正确的网址,包括当前链接。
经过验证的链接是;
ht1tp://www.google.com
h://ww.google.com
http://www.google.
http://www.google.343
我不相信它是验证这些链接是否正确的函数,我认为我的 if (filter_var($url, FILTER_VALIDATE_URL))
行有问题。
我需要澄清如何正确使用它。谢谢
首先,只验证输入。永远不要清理输入。在它准备好成为输出之前不要消毒。这是全面处理数据的一般规则,对于安全显示 URL 与防止 XSS 攻击、SQL 注入等同样重要。
其次,FILTER_VALIDATE_URL 根据 RFC 2396 验证 URL。该 RFC 未指定任何特定方案,但它确实提供了几个示例(即 HTTP:、GOPHER:、MAILTO: 等) . validate filters 上的 PHP 手册明确指出:
Beware a valid URL may not specify the HTTP protocol http:// so further validation may be required to determine the URL uses an expected protocol, e.g. ssh:// or mailto:.
另外,RFC 没有定义域名的结构,也不期望任何特定的顶级域。因此,验证过滤器不检查那些。域名由注册服务商按照 ICANN 规则正式分配,但您可以自由配置自己的本地 DNS 服务器以创建您想要的任何条目,包括创建仅限 TLD 的条目,因此 任何域名是有效的,无论是否通过验证过滤器。
验证某些明确定义的数据的最安全方法是将其列入白名单。如果你真的想确保没有人超过你 "ht tp:com.google.xssHackHere" 那么你需要自己做进一步的检查。请注意,现在有数百个有效的 TLD,如果您想验证域名和方案,并不是所有的 TLD 都可以轻松地用 ASCII 字符表示。