提取用户提供的网址时,我该如何负责任地表现?

时间:2018-12-29 15:11:08

标签: php security curl

我可能会遇到什么问题/应该考虑什么?我从每个用户(也许是整体)或每个域的速率限制的角度出发。我想我将解析parse_url(),确保设置了合理的超时时间,等等。我需要注意一类安全漏洞吗?

1 个答案:

答案 0 :(得分:4)

  

我需要注意一类安全漏洞吗?

是的! idk,如果它很大,但是例如:您可能不想接受file://的url(例如,您是否想接受file:///etc/passwd?可能不是。),您也可能不想接受电子邮件协议,例如imap / ldap / pop3 / rtmp /等,对吗?为了安全起见,我建议您将协议列入白名单,并拒绝不包含列入白名单的协议的所有网址(对于未指定协议的网址,默认为http,因为libcurl会默认这样做,否则请拒绝它们)例如:

$protocolWhiteList=array('http','https','gopher','ftp','ftps');
$info=parse_url($url);
if(!in_array(strtolower($info["scheme"]??'http'),$protocolWhiteList)){
    $errors[]="illegal protocol. legal protocols: ".implode(", ",$protocolWhiteList);
}
  • 那样,只允许列入白名单的协议,这样就可以避免一些安全问题。

此外,您可能不希望允许用户使用卷曲代码与同一LAN或同一VPN甚至本地主机上的服务器通信(这可能会帮助黑客绕过防火墙/路由器/访问VPN?),所以我想可能还会拒绝这些网址,例如

$host=strtolower($info["host"]);
if ($host === "localhost" || ((false !== filter_var ( $host, FILTER_VALIDATE_IP )) && (false === filter_var ( $host, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE )))) {
    $errors [] = "localhost and LAN IP URLs are not allowed.";
}
  • 通过这种方式,黑客将很难使用curl系统绕过防火墙/ NAT /以其他方式访问系统本地(仅侦听127.0.0.1)或LAN本地或VPN本地服务。

..而且您应该考虑的更多内容,但这就是我能想到的所有东西。