Как найти последний (конечный) URL-адрес после серии перенаправлений по сокращенному URL-адресу от PHP - PullRequest
1 голос
/ 16 июня 2020

Я создал специальный плагин для WordPress, который люди могут публиковать без регистрации / входа в систему, а просто дважды подтверждая пароль. Он работает хорошо, без спама, но кто-то начал публиковать спам-ссылки.

Я написал плагин для определения шаблона на основе IP-адреса, затем заблокировал IP и удалил все сообщения для тех, кто был заблокирован. Однако я думаю, что этот спамер использует инструмент, который подделывает или переключает IP-адрес и начинает публиковать сообщения с другого IP-адреса. Я обнаружил одну общую черту: ссылки go на один и тот же URL-адрес после серии перенаправлений.

Я пробовал следующие функции для отслеживания пункта назначения, но безуспешно.

myfunction( $url ){
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  curl_setopt($ch, CURLOPT_HEADER, false);
  curl_setopt($ch, CURLOPT_NOBODY, true);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
  curl_exec($ch);
  $lastUrl = curl_getinfo($ch);
  curl_close($ch);
  return $lastUrl;
}
• 1007 *

Служба сокращения URL-адресов, которую использует этот спамер: http://urnic.com/

Я не думаю, что он выполняет перенаправление JavaScript, поскольку он работал с JS, отключенным из мой Chrome.

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Можно сделать с preg_match и поймать url местоположения. он работает для меня отлично.

    $curlhandle = curl_init();
    curl_setopt($curlhandle, CURLOPT_URL, $url);
    curl_setopt($curlhandle, CURLOPT_HEADER, 1);
    curl_setopt($curlhandle, CURLOPT_USERAGENT, 'googlebot');
    curl_setopt($curlhandle, CURLOPT_FOLLOWLOCATION, 0);
    curl_setopt($curlhandle, CURLOPT_RETURNTRANSFER, 1);
    $final = curl_exec($curlhandle);
    if (preg_match('~Location: (.*)~i', $final, $lasturl)) {
       $loc = trim($lasturl[1]);
       echo $loc;
    } else {
       echo "Dont have redirect url...";
    }

Это будет вести себя как googlebot и покажет вам перенаправленный URL.

добавьте только curl_setopt($curlhandle, CURLOPT_USERAGENT, 'googlebot'); этот код.

0 голосов
/ 17 июня 2020

вы можете использовать curl CURLOPT_FOLLOWLOCATION + CURLINFO_EFFECTIVE_URL, чтобы найти окончательный адрес, при условии, что перенаправления, о которых вы говорите, являются HTTP-редиректами (например, HTTP 3xx 300 Multiple Choices или 301 Moved Permanently или 302 Found или 307 Temporary Redirect или что-то подобное) ,

function get_final_url(string $redirect_url):string{
$ch=curl_init($redirect_url);
curl_setopt_array($ch,array(
    CURLOPT_FOLLOWLOCATION=>1,
    CURLOPT_ENCODING=>'',
    CURLOPT_USERAGENT=>'many_websites_block_UAless_requests',
    CURLOPT_RETURNTRANSFER=>1, // ideally we should use CURLOPT_NOBODY but some websites respond differently to HEAD requests, so using GET requests is the safest option =/ (also if you're worried about ram usage, you should set CURLOPT_OUTFILE to /dev/null or enable CURLOPT_WRITEFUNCTION)
));
curl_exec($ch);
$ret=curl_getinfo($ch,CURLINFO_EFFECTIVE_URL);
curl_close($ch);
return $ret;
}

( ps! Непроверено, может быть опечатка или что-то в этом роде, но теоретически это должно работать. )

, как я уже упоминал в комментарии к коду , функция может быть оптимизирована для использования меньшего количества оперативной памяти, если вас беспокоят огромные ответы (CURLOPT_RETURNTRANSFER помещает весь ответ в оперативную память, может быть исправлен с помощью пустого CURLOPT_WRITEFUNCTION)

в любом случае, это должно вернуть окончательный URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...