2013-02-27 65 views
0

目前我的服務器上已包含SSL。希望強制我的用戶通過https登錄頁面進行登錄。如何使用PHP檢測安全連接(https)?

<?php 

    if (empty($_SERVER['https']) || $_SERVER['https'] != 'on') { 
    header('location: https://my_login_page'); 
    exit(); 
    } 

    # rest of code 
    ... 

但是這是沒有SSL的問題。

現在我有情況。以下網址

http://domain.com/login.php 

這裏的用戶請求,我無法訪問$_SERVER['https'],並要確保有可能用戶重定向到

https://domain.com/login.php 

例如,SSL證書一段時間後到期,並希望保持用戶使用登錄w/out安全連接。

我的目標是這樣的例子:

if (ssl_installed() && (empty($_SERVER['https']) || $_SERVER[] != 'on')) { 
    header('location: https://domain.com/login.php'); 
    exit(); 
    } 

# when there's no SSL it continues using HTTP 

是的,想寫的功能(例如:ssl_installed())返回true當使用安全連接是可能的,否則false

我試過使用get_headers(),並意識到它始終返回false對https://鏈接。

可能的解決辦法:

我已經有工作的解決方案。我的數據庫中的配置表包含行ssl=1(或0),並且在數據庫連接建立後,我使用此值來決定是否有可能使用SSL,並且上述函數使用此值返回結果。

我的問題是:有沒有簡單的解決方案?

要清除:我在尋找PHP-ONLY SOLUTION(自動檢測)!

任何幫助,將不勝感激。

+0

你有使用所有php文件中的通用配置文件嗎?比如config.php? – sjdaws 2013-02-27 09:21:46

+0

@sjdaws課程是的,我保存了與PDO一起使用的數據庫帳戶信息。 – Wh1T3h4Ck5 2013-02-27 09:23:49

+0

是否存在'$ _SERVER [「HTTPS」](大寫字母)? [PHP文檔](http://www.php.net/manual/en/reserved.variables.server.php) – Passerby 2013-02-27 09:25:06

回答

5

你可以在你的配置文件中做這樣的事情,而不是編輯每個腳本。如果您的證書到期

<?php 

// will match /login.php and /checkout.php as examples 
$force_ssl = preg_match('/\/(login|checkout)\.php(.+)?/', $_SERVER['REQUEST_URI']); 
$using_ssl = (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) ? true : false; 

$url = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 

if ($force_ssl && !$using_ssl) { 

    // redirect to SSL 
    header('Location: https://' . $url); 

} elseif (!$force_ssl && $using_ssl) { 

    // redirect back to normal 
    header('Location: http://' . $url); 

} 

然後,只需在您的配置文件中設置$force_sslfalse,它會採取所有這在以前重定向腳本的照顧。


現在的問題已經得到澄清,你可以創建一個這樣的PHP腳本(代碼https://stackoverflow.com/a/4741196/654678拍攝)

<?php 

// get and check certificate 
$get = stream_context_create(array("ssl" => array("capture_peer_cert" => TRUE))); 
$read = stream_socket_client("ssl://www.google.com:443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $get); 
$cert = stream_context_get_params($read); 

$valid = ($cert["options"]["ssl"]["peer_certificate"] != NULL) ? true : false; 

// save validity in database or somewhere else accessible 

然後設置一個crontab,或每日任務或什麼打的是PHP腳本每日。如果沒有證書,它將返回NULL並被標記爲無效。檢查你的腳本的有效性,你很好去。

+1

爲你的努力。我現在已經有了類似的解決方案。我只是在尋找一種方法來自動確定服務器上的SSL,無需手動設置SSL狀態(在配置,數據庫等)。順便說一句,你的$ using_ssl賦值是不正確的,因爲在IIS服務器上$ _SERVER ['HTTPS']總是被設置爲非空值('on'或'off'),如果設置它不能爲空。 – Wh1T3h4Ck5 2013-02-27 10:13:45

+0

所以你想要PHP來檢測服務器級別上安裝的證書是否? – sjdaws 2013-02-27 10:15:20

+0

(如果可能)! – Wh1T3h4Ck5 2013-02-27 10:16:00

1

我想你可能與htaccess的解決這一點,這兩個條件可能有助於

  • 的RewriteCond%{HTTP:X-轉發-SSL}上
  • 的RewriteCond%{HTTPS}上

欲瞭解更多信息,看到這個答案:https://stackoverflow.com/a/1128624/1712686

+0

+1與你同意。已經看到這個頁面。如果可能的話,我只是在尋找純PHP的解決方案。 – Wh1T3h4Ck5 2013-02-27 09:26:12

+0

http://stackoverflow.com/questions/14760493/d​​etect-ssl-when-proxy-always-claims-a-secure-connection在這裏你有客戶端重定向 – Prabu 2013-02-27 09:37:16

相關問題