2012-02-03 50 views
5

我有一個登錄表單:如何在PHP中將頁面重定向到https?

<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版本。 – 2012-02-03 20:53:49

+0

'但我沒有'當然,當你連接普通的'HTTP'時你不會擁有它。端口80也是如此。 '$ _SERVER [「HTTPS」] ='on';'當你通過HTTPS連接時,你的端口就是'443'。你的腳本正在做正確的事情,它檢查當前連接是否是HTTP,如果不是,它會重定向到HTTPS版本。 – Cheery 2012-02-03 20:54:45

+0

我可以,但用戶有可能將鏈接更改爲HTTP。我需要檢查HTTPS的login.php頁面 – Patrioticcow 2012-02-03 20:55:16

回答

6

如果你讓他們張貼到/login.php通過純HTTP,然後重定向到HTTPS,你打敗使用HTTPS的目的,因爲登錄信息已經在純文本通過Internet發送。

你可以做什麼來阻止用戶更改URL,是否使登錄頁面拒絕登錄,如果登錄頁面沒有通過HTTPS。

我用它來查看是否在使用HTTPS的是以下幾點:

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

如果你是443的默認端口上運行安全服務器,那麼你也可以檢查,看看是否是端口,但如果使用SSL,PHP會將$_SERVER['HTTPS']的值設置爲非空,所以我會檢查是否存在最佳實踐。

編輯:

如果這樣包括在用戶手動更改HTTPS HTTP和希望通過純文本發送他們的信息,有沒有什麼可以做,以阻止他們,但是如果你不允許登錄通過HTTP,所以即使正確的信息也不會登錄它們,您可以強制它們使用https,使其成爲唯一有效的工具。

+0

是的,將該檢查添加到腳本開頭附近的login.php。你可以做幾件事情,從拒絕登錄時出現一個說明https的錯誤,或者使用301頭重定向到https。 – drew010 2012-02-03 21:01:19

5

無論您使用的頁面的表單填寫完畢前,顯示您的登錄表單應該已經使用https://,然後將其應提交到另一個https://地址。否則,你會留下表格來攻擊。

您可以查看mod_rewrite,使用http://https://自動重定向任何請求,至少對於您的登錄頁面。

+0

只要表單發佈到https,表單本身是否位於非https頁面上並不重要。 – drew010 2012-02-03 21:05:48

+0

@ drew010:http://security.stackexchange.com/questions/1692/is-posting-from-http-to-https-a-bad-practice – Crontab 2012-02-03 21:17:46

+0

確實登陸頁面的html可以通過man-in-中間,但是如果數據發佈到HTTPS頁面,數據仍然會被加密。爲了獲得最佳實踐,我通常會強制整個站點使用SSL而不僅僅是特定頁面。遵循該指南,您應該在https上製作登錄表單。 – drew010 2012-02-03 21:21:42

3

假設登錄表單你的頁面是由index.php產生,你需要把對HTTP示例代碼到HTTPS重定向在index.php。這將確保當用戶填寫並提交表單時,它將通過HTTPS而不是HTTP提交給/login.php

把這張支票裏login.php是徒勞的,因爲時間login.php獲得請求,並試圖重定向到相應的HTTPS URL,那麼,該證書已經提交給它明文這是你應該要避免什麼。

,你看到$_SERVER['SERVER_PORT']觀察是80$_SERVER["HTTPS"],當你把裏面login.php檢查是該登錄憑據正在通過HTTP提交給它的,因此登錄憑據到達事實進一步證明可以不設置來自客戶端的服務器未加密。通過遵循我在本回復的第一段中提到的內容,必須避免這種情況。

順便說一句,我不會使用PHP來做這種重定向。這種重定向非常方便,由Apache HTTPD中的mod_rewrite處理。

一個例子,假設你的登錄頁面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(); 
} 
相關問題