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

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

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

Как это могло быть сделано?

Спасибо.

10
задан Annika Backstrom 3 June 2010 в 10:21
поделиться

5 ответов

$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>";
}
26
ответ дан 3 December 2019 в 14:10
поделиться

Я не понимаю вашего вопроса. У вас есть массив с 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';
}
-2
ответ дан 3 December 2019 в 14:10
поделиться

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

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

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

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

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

1
ответ дан 3 December 2019 в 14:10
поделиться

Хотите проверить код 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
      }
    }
1
ответ дан 3 December 2019 в 14:10
поделиться

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

0
ответ дан 3 December 2019 в 14:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: