Intereting Posts
Как разобрать текст с ключом по столбцу с возможными многострочными строками Замените слова, найденные в строке, выделенным словом, сохраняя их случай как найденный Запустить php-скрипт, хранящийся на сервере? Что это значит, когда var_dump сообщает о неправильной длине строки? Xpath выбирает несколько тегов Как добавить поддержку класса DateTime в php 5.1.6 «Доступ запрещен для пользователя» после перемещения базы данных MySQL на удаленный сервер Определить сервер разработки и производства в PHP Почему двойной символ подчеркивания (__) в php? Загрузите сайт + базу данных в Dropbox с помощью PHP Можно ли использовать JQuery для вставки закрывающего тега </ tr> и тэга открытия <tr> внутри динамической таблицы? Ошибка Laravel 4 Illuminate \ Database \ Eloquent \ MassAssignmentException передать переменную javascript в php mysql select query Как заменить двойные кавычки одиночными кавычками w + режим в fopen?

PHP: Проверьте, перенаправляется ли URL?

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

Я хотел бы сделать функцию PHP, которая запускается с внешнего сервера и выполняет итерацию через множество заданных URL (массив с URL-адресами, который предназначен для каждого защищенного сайта), чтобы увидеть, перенаправлены ли они или нет. Таким образом, я мог бы легко убедиться, что защита включена и запущена на каждой странице.

Как это можно сделать?

Благодарю.

Solutions Collecting From Web of "PHP: Проверьте, перенаправляется ли URL?"

$urls = array( 'http://www.apple.com/imac', 'http://www.google.com/' ); $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); foreach($urls as $url) { curl_setopt($ch, CURLOPT_URL, $url); $out = curl_exec($ch); // line endings is the wonkiest piece of this whole thing $out = str_replace("\r", "", $out); // only look at the headers $headers_end = strpos($out, "\n\n"); if( $headers_end !== false ) { $out = substr($out, 0, $headers_end); } $headers = explode("\n", $out); foreach($headers as $header) { if( substr($header, 0, 10) == "Location: " ) { $target = substr($header, 10); echo "[$url] redirects to [$target]<br>"; continue 2; } } echo "[$url] does not redirect<br>"; } 

Я использую завиток и беру заголовки, после того, как сравниваю url и url с заголовком заголовка:

  $url="http://google.com"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_TIMEOUT, '60'); // in seconds curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_NOBODY, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $res = curl_exec($ch); if(curl_getinfo($ch)['url'] == $url){ $status = "not redirect"; }else { $status = "redirect"; } 

Вы всегда можете попробовать добавить:

 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 

поскольку 302 означает, что он перемещен, разрешите вызову curl следовать за ним и вернуть все, что возвратил URL.

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

Если вы беспокоитесь о том, что файлы, вызываемые напрямую, без вашего участия, является ли пользователь зарегистрирован? проверки выполняются, вы можете сделать то, что делают многие большие проекты PHP: в центральном файле include (где выполняется проверка безопасности) определите константу BOOTSTRAP_LOADED или что-то еще, и в каждом файле проверьте, установлена ​​ли эта константа.

Тестирование отличное, а тестирование безопасности еще лучше, но я не уверен, какой недостаток вы ищете, чтобы раскрыть это? Для меня эта идея кажется пустой тратой времени, которая не принесет никакой реальной дополнительной безопасности.

Просто убедитесь, что ваш скрипт die() s после header("Location:...") перенаправляется. Это важно, чтобы остановить добавление дополнительного содержимого после команды заголовка (отсутствующий die () не был бы пойман вашей идеей, кстати, поскольку заголовок перенаправления все равно будет выпущен …)

Если вы действительно хотите это сделать, вы также можете использовать такой инструмент, как wget и передать ему список URL-адресов. Получите результаты в каталог и проверьте (например, просмотрев размеры файлов, которые должны быть идентичны), независимо от того, содержит ли каждая страница диалог входа в систему. Просто добавьте еще один вариант …

Вы хотите проверить код HTTP, чтобы узнать, является ли это перенаправление?

  $params = array('http' => array( 'method' => 'HEAD', 'ignore_errors' => true )); $context = stream_context_create($params); foreach(array('http://google.com', 'http://stackoverflow.com') as $url) { $fp = fopen($url, 'rb', false, $context); $result = stream_get_contents($fp); if ($result === false) { throw new Exception("Could not read data from {$url}"); } else if (! strstr($http_response_header[0], '301')) { // Do something here } } 

Вы можете использовать сеанс, если массив сеансов не установлен, URL перенаправляется на страницу входа. ,

Я изменил ответ Адама Backstrom и предложил chiborg предложение. (Только для загрузки HEAD). У него есть еще одно: он проверяет, перенаправлено ли на страницу того же сервера или нет. Пример: terra.com.br перенаправляет на terra.com.br/portal. PHP будет рассматривать его как перенаправление, и это правильно. Но я только хотел перечислить этот URL-адрес, который перенаправляется на другой URL-адрес. Мой английский не очень хорош, поэтому, если кто-то нашел что-то действительно трудное для понимания и может отредактировать это, пожалуйста.

 function RedirectURL() { $urls = array('http://www.terra.com.br/','http://www.areiaebrita.com.br/'); foreach ($urls as $url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // chiborg suggestion curl_setopt($ch, CURLOPT_NOBODY, true); // ================================ // READ URL // ================================ curl_setopt($ch, CURLOPT_URL, $url); $out = curl_exec($ch); // line endings is the wonkiest piece of this whole thing $out = str_replace("\r", "", $out); echo $out; $headers = explode("\n", $out); foreach($headers as $header) { if(substr(strtolower($header), 0, 9) == "location:") { // read URL to check if redirect to somepage on the server or another one. // terra.com.br redirect to terra.com.br/portal. it is valid. // but areiaebrita.com.br redirect to bwnet.com.br, and this is invalid. // what we want is to check if the address continues being terra.com.br or changes. if changes, prints on page. // if contains http, we will check if changes url or not. // some servers, to redirect to a folder available on it, redirect only citting the folder. Example: net11.com.br redirect only to /heiden // only execute if have http on location if ( strpos(strtolower($header), "http") !== false) { $address = explode("/", $header); print_r($address); // $address['0'] = http // $address['1'] = // $address['2'] = www.terra.com.br // $address['3'] = portal echo "url (address from array) = " . $url . "<br>"; echo "address[2] = " . $address['2'] . "<br><br>"; // url: terra.com.br // address['2'] = www.terra.com.br // check if string terra.com.br is still available in www.terra.com.br. It indicates that server did not redirect to some page away from here. if(strpos(strtolower($address['2']), strtolower($url)) !== false) { echo "URL NOT REDIRECT"; } else { // not the same. (areiaebrita) echo "SORRY, URL REDIRECT WAS FOUND: " . $url; } } } } } } на function RedirectURL() { $urls = array('http://www.terra.com.br/','http://www.areiaebrita.com.br/'); foreach ($urls as $url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // chiborg suggestion curl_setopt($ch, CURLOPT_NOBODY, true); // ================================ // READ URL // ================================ curl_setopt($ch, CURLOPT_URL, $url); $out = curl_exec($ch); // line endings is the wonkiest piece of this whole thing $out = str_replace("\r", "", $out); echo $out; $headers = explode("\n", $out); foreach($headers as $header) { if(substr(strtolower($header), 0, 9) == "location:") { // read URL to check if redirect to somepage on the server or another one. // terra.com.br redirect to terra.com.br/portal. it is valid. // but areiaebrita.com.br redirect to bwnet.com.br, and this is invalid. // what we want is to check if the address continues being terra.com.br or changes. if changes, prints on page. // if contains http, we will check if changes url or not. // some servers, to redirect to a folder available on it, redirect only citting the folder. Example: net11.com.br redirect only to /heiden // only execute if have http on location if ( strpos(strtolower($header), "http") !== false) { $address = explode("/", $header); print_r($address); // $address['0'] = http // $address['1'] = // $address['2'] = www.terra.com.br // $address['3'] = portal echo "url (address from array) = " . $url . "<br>"; echo "address[2] = " . $address['2'] . "<br><br>"; // url: terra.com.br // address['2'] = www.terra.com.br // check if string terra.com.br is still available in www.terra.com.br. It indicates that server did not redirect to some page away from here. if(strpos(strtolower($address['2']), strtolower($url)) !== false) { echo "URL NOT REDIRECT"; } else { // not the same. (areiaebrita) echo "SORRY, URL REDIRECT WAS FOUND: " . $url; } } } } } } 
 function unshorten_url($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_URL, $url); $out = curl_exec($ch); $real_url = $url;//default.. (if no redirect) if (preg_match("/location: (.*)/i", $out, $redirect)) $real_url = $redirect[1]; if (strstr($real_url, "bit.ly"))//the redirect is another shortened url $real_url = unshorten_url($real_url); return $real_url; } 

Я не могу понять ваш вопрос. У вас есть массив с URL-адресами, и вы хотите знать, является ли пользователь одним из перечисленных URL-адресов? Если я правильно понимаю ваш квест:

 $urls = array('http://url1.com','http://url2.ru','http://url3.org'); if(in_array($_SERVER['HTTP_REFERER'],$urls)) { echo 'FROM ARRAY'; } else { echo 'NOT FROM ARR'; }