Обнаруживать SSL, когда прокси * всегда * утверждает, что безопасное соединение

Я хочу определить , просматривает ли пользователь безопасную страницу и перенаправляет, если нет (для входа в систему).

Тем не менее, мой сайт перемещается через прокси-сервер, прежде чем я вижу, что переменные сервера и прокси-сервер (прямо сейчас) говорят мне, что $_SERVER['HTTPS'] когда URI явно указывает на другое. Он также показывает 'on' когда пользователь безопасно перемещается.

Перемещение по http:// и https:// оба выводят, что $_SERVER['SERVER_PORT'] = 443 .

У меня нет возможности внести изменения в прокси-сервер, поэтому я хочу знать:

  • Есть ли у PHP какие-либо другие варианты для меня, чтобы обнаружить правду или …
  • Я придерживаюсь механизмов JavaScript для обнаружения и перенаправления.

Я задал этот вопрос для идей, но они в основном вращаются вокруг переменной $_SERVER['HTTPS'] , заслуживающей доверия. Ба!

Похоже, что этот вопрос испытывает хотя бы что-то подобное, но он / она смог его решить, адаптировав решение apache.

Существуют ли какие-либо другие переменные или трюки PHP SERVER для обнаружения того, с чего начинается URI пользователя? Единственная разница между переменными $ _SERVER при просмотре моего сайта http против https:

  • _FCGI_X_PIPE_ (появляется случайным образом)
  • HTTP_COOKIE (sto-id-47873 включен в незащищенную версию, но я не помещал его туда)
  • REMOTE_ADDR (Это и следующие два меняются необъяснимо!)
  • УДАЛЕННЫЙ УЗЕЛ
  • REMOTE_PORT ('proxy people', почему вы постоянно меняете это?)

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

Вот мой план использования JavaScript для этой цели; это лучшее, что у меня есть?

 function confirmSSL() { if(location.protocol != "https:") { var locale = location.href; locale = locale.replace(/http:\/\//,"https://"); location.replace(locale); } } <body onLoad="confirmSSL()">... 

Я думаю, что если пользователь отключил JavaScript в моем сообществе, то они, надеюсь, знают, что они делают. Они должны иметь возможность вручную попасть в безопасную зону. Какие предложения <noscript> будут обычным явлением / хорошей практикой? Что-то вроде этого, возможно?

<noscript> Перейдите с помощью https: //blah.more.egg/fake, чтобы защитить вашу информацию. </noscript>

PHP-решения, которые работают (с хорошим объяснением), будут отдавать предпочтение правильному ответу. Не стесняйтесь представить лучшую реализацию JavaScript или ссылку на нее.

Большое спасибо!

Хотя это уже частично обсуждается в комментариях к вопросу, я подведу некоторые предложения относительно логики перенаправления в JavaScript:

  1. Как правило, использование window.location вместо location целесообразно, объяснение можно найти здесь .
  2. Regex кажется немного излишним для простой замены протокола.
  3. Логика перенаправления должна быть выполнена как можно скорее, поскольку в случае перенаправления каждая дополнительная обработка документа не нужна.
  4. Браузеры с отключенным JavaScript должны по крайней мере показывать уведомление, предлагающее пользователю перейти на https.

Я предлагаю использовать следующий код (принятый отсюда ), который является коротким и эффективным:

 <head> <script type="text/javascript"> if (window.location.protocol != "https:") { window.location.href = "https:" + window.location.href.substring(window.location.protocol.length); } </script> ... </head> <body> ... <noscript>Please click <a href="https://my-cool-secure-site.com">here</a> to use a secure connection!</noscript> ... 

Просто используйте подход на стороне клиента. Если ваш прокси-сервер не настраивается, этот параметр отсутствует. Обнаружение и перенаправление через js в порядке.

Существует также способ добиться перенаправления без javascript на стороне клиента. Этот метод может быть особенно полезен, если JavaScript отключен в браузере клиента.
Шаги – это чистый PHP и довольно простой:

  • Начало сеанса
  • Если это новый сеанс, перенаправление на место https
  • Если сеанс не является новым, можно предположить, что пользователь был перенаправлен

Пример кода:

 <?php session_start(); if( !isset($_SESSION['runningOnHttps']) ) { $_SESSION['runningOnHttps'] = true; header('Location: https://my-cool-secure-site.com'); } ?> 

Естественно, вы можете ограничить эту функциональность теми браузерами с отключенным JavaScript, чтобы создать своего рода «гибридный режим»: всякий раз, когда есть новый сеанс с не-JS-браузером, сделайте запрос на какой-то сценарий обратного вызова, который уведомляет сервер для отправки заголовка местоположения:

some_landingpage.php отправляет начальный <noscript> содержащий скрытый iframe, который будет загружать redirect.php:

 if( !isset($_SESSION['checkWasMade']) ) { $_SESSION['checkWasMade'] = true; echo '<noscript> <iframe src="redirect.php" style="visibility: hidden; position: absolute; left: -9000px;"></iframe> </noscript>'; } 

Запрос на redirect.php даст вам знать, что JavaScript отключен и дает вам возможность принудительно перенаправлять, отправив заголовок Location (см. Выше) со следующим фактическим запросом.

Разумеется, этот метод будет работать только надежно, если протокол не изменится (магически?) В течение одного сеанса.

ОБНОВИТЬ:
Весь вышеупомянутый метод обработки пользовательских агентов, не относящихся к JavaScript, может быть рассмотрен с помощью еще более аккуратного подхода:
Я только что узнал, что <noscript> также может быть включен внутри <head> , что позволяет просто перенаправлять через теги <meta> .

Следовательно, some_landingpage.php может отправить начальное метаобновление внутри <noscript> :

 // The following echo must appear inside the html head if( !isset($_SESSION['checkWasMade']) ) { $_SESSION['checkWasMade'] = true; echo '<noscript> <meta HTTP-EQUIV="REFRESH" content="0; url=https://my-cool-secure-site.com"> </noscript>'; }