2012-02-03 2 views
5

У меня есть регистрационная форма:Как перенаправить страницу на https в php?

<form method =POST action="/login.php"> 
... 
</form> 

Я хотел бы login.php страницы для перенаправления с помощью https.

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

я нашел и пример:.

if($_SERVER["HTTPS"] != "on") { 
    header("HTTP/1.1 301 Moved Permanently"); 
    header("Location: "https://" . $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"]); 
    exit(); 
} 

, но я не $_SERVER["HTTPS"] если я var_dump($_SERVER);

я есть $_SERVER['SERVER_PORT'] ведьма 80.

какие-либо идеи?

Благодаря

+0

«я не хочу, чтобы отправить пользователю ...» «Я хочу, чтобы сделать редирект «Эти два взаимно несовместимы. Вы хотите заставить пользователя использовать SSL? Если это так, вам необходимо перенаправить (отправить) пользователя в версию HTTPS формы входа. –

+0

'но у меня нет' конечно, у вас его не будет, когда вы подключитесь к регулярному 'HTTP'. И порт 80 говорит то же самое. '$ _SERVER [" HTTPS "] = 'on';' когда вы подключены через HTTPS, и ваш порт в этом случае будет '443'. Вы правильно выполняете скрипт, проверяете, является ли текущее соединение HTTP, а если нет - оно перенаправляется на версию HTTPS. – Cheery

+0

Я мог бы, но есть возможность для пользователя изменить ссылку на HTTP. Мне нужно сделать проверку на странице login.php для HTTPS – Patrioticcow

ответ

6

Если вы позволяете им отправлять сообщения /login.php через обычный HTTP, а затем перенаправить на HTTPS, вы победите цель использования HTTPS, поскольку информация Логин уже отправлена ​​в текстовом формате через Интернет ,

Что вы можете сделать, чтобы пользователь не мог изменить URL-адрес, делает так, чтобы страница входа в систему отклонила логин, если он не превышает HTTPS.

Что я использую для проверки использования HTTPS заключается в следующем:

if (!isset($_SERVER['HTTPS']) || !$_SERVER['HTTPS']) { 
    // request is not using SSL, redirect to https, or fail 
} 

Если вы используете свой защищенный сервер на порту по умолчанию 443, то вы можете также проверить, чтобы убедиться, что это порт, но PHP устанавливает значение $_SERVER['HTTPS'] непустым, если используется SSL, поэтому я бы проверял наличие этого для лучшей практики.

EDIT:

Если пользователь так включен вручную изменить протокол HTTPS на HTTP и хочет отправить их информацию по открытому тексту, нет, что вы можете сделать, чтобы остановить их, но если вы запретить вход через HTTP, поэтому даже правильная информация не будет регистрировать их, вы можете заставить их использовать https, делая это единственное, что работает.

+0

Да, добавьте эту проверку в login.php рядом с началом скрипта. Вы могли бы сделать несколько вещей, просто отказавшись от входа с ошибкой, заявив, что требуется https, или используя 301 заголовок для перенаправления на https. – drew010

5

Независимо от страницы, которую вы используете для отображения вашей формы Войти уже должны использовать https://перед тем форма заполнена, а затем он должен быть представлен в другой https:// адрес. В противном случае вы оставите форму открытой для атаки.

Вы можете посмотреть в mod_rewrite, чтобы автоматически перенаправить любой запрос, используя http:// в https://, по крайней мере, для вашей страницы входа.

+0

Пока форма отправляется на https, не имеет значения, находится ли сама форма на странице, отличной от https. – drew010

+0

@ drew010: http://security.stackexchange.com/questions/1692/is-posting-from-http-to-https-a-bad-practice – Crontab

+0

Истинный html целевой страницы может быть изменен человеком, the-middle, но данные все равно будут зашифрованы, если они будут отправлены на страницу HTTPS. Для лучшей практики я обычно заставляю весь сайт использовать SSL, а не только определенные страницы. Следуя этому руководству, вы должны сделать свою форму для входа на https. – drew010

3

Предполагая, что ваша страница с формой входа в систему генерируется index.php, вам необходимо указать пример кода для перенаправления HTTP на HTTPS в index.php. Это гарантирует, что когда пользователь заполнит форму и отправит ее, она будет отправлена ​​в /login.php через HTTPS, а не HTTP.

Положив эту проверку внутри login.php бесполезно, потому что к тому времени login.php получает запрос и пытается перенаправить на соответствующий HTTPS URL, а учетные данные уже были представлены в нем в качестве открытого текста, который является то, что вы должны хотеть, чтобы избежать.

Наблюдение, что вы видите $_SERVER['SERVER_PORT'] быть 80 и $_SERVER["HTTPS"] быть не установлен, когда вы положили чек внутри login.php является еще одним доказательством того, что учетные данные для входа в настоящее время представляются ему через HTTP и, таким образом, учетные данные для входа достигают ваш сервер от клиента незашифрован. Этого следует избегать, следуя тому, что я сказал в первом абзаце этого ответа.

BTW, я бы не использовал PHP для такого перенаправления. Такие перенаправления очень удобно обрабатываются mod_rewrite в Apache HTTPD.

Пример, при условии, что ваша страница Логин доступен на URL, http://example.com/foo/:

RewriteEngine On 
RewriteCond %{HTTPS} off 
RewriteRule ^foo/$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L] 
5
if($requireSSL && $_SERVER['SERVER_PORT'] != 443) { 
    header("HTTP/1.1 301 Moved Permanently"); 
    header("Location: https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']); 
    exit(); 
} 
Смежные вопросы