Есть ли большая дыра в безопасности, за которой мне нужно следить?
да!idk, если он большой, но, например: вы, вероятно, не хотите принимать file://
url (например, хотите ли вы принять file:///etc/passwd
? вероятно, нет.), также вы, вероятно, не хотите принимать протоколы электронной почтыкак imap
/ ldap
/ pop3
/ rtmp
/ etc, не так ли?чтобы быть безопасным, я предлагаю сделать белый список протоколов и отклонить любой URL, который не содержит протокол из белого списка (и по умолчанию http для URL, где не указан протокол, потому что это то, что 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);
}
- таким образом, разрешены только протоколы из белого списка, и вы, вероятно, избежите некоторых проблем безопасности.
далее, выможет не захотеть позволять пользователям использовать ваш код curl для связи с серверами в той же локальной сети или той же VPN или даже на локальном хосте (что может помочь хакерам обходить межсетевые экраны / маршрутизаторы / VPN доступа?), поэтому я, вероятно, также отрицаю эти URL,например,
$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-локальные сервисычернила, с верхней части моей шляпы ..