我正在处理一个代码段,我需要验证网址,因此我知道我正在将数据发送到正确的网址,因此我使用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))
行中有问题。
我需要澄清如何正确使用这个。感谢
答案 0 :(得分:4)
首先,只验证输入。永远不要消毒输入。在准备好输出之前不要进行消毒。这是一个全面处理数据的一般规则,对于安全地显示URL同样重要,因为它可以防止XSS攻击,SQL注入等。
其次,FILTER_VALIDATE_URL根据RFC 2396验证URL。该RFC没有指定任何特定的方案,尽管它确实给出了几个例子(即HTTP:,GOPHER:,MAILTO:等)。 validate filters上的PHP手册明确指出:
请注意,有效的URL可能未指定HTTP协议http://因此可能需要进一步验证以确定URL使用预期协议,例如ssh://或mailto:。
此外,RFC没有定义域名的结构,也不期望任何特定的顶级域名。因此,验证过滤器不会检查这些。域名由注册商根据ICANN规则正式分配,但您可以自由配置您自己的本地DNS服务器以创建您想要的任何条目,包括创建仅限TLD的条目,因此任何域名 无效,无论是否通过验证过滤器。
验证某些定义良好的数据的最安全方法是将其列入白名单。如果你真的想确保没有人通过你“tt:com.google.xssHackHere”,那么你需要自己进一步检查。请注意,如果您要验证域名以及方案,现在有数百个有效的TLD,并且并非所有TLD都能以ASCII字符轻松表示。