公式アカウントからの投稿が始まります

情報漏えい防止のため、PCからのアクセスをSSLに限定したいのですが、SSLかどうかを判別する方法で困っています。
あるサーバでは以下のスクリプトでうまく稼動しています。
しかし、別のサーバでは「サーバが見つかりません」となってしまいます。

// SSLかチェック(SETTLEMENT_SCRIPTにはSSLのアドレス)
//if( !$_SERVSER["SSL_SERVER_DN"] && !$_SESSION["user_mobile"] ) header("Location: " . SETTLEMENT_SCRIPT );

$_SERVSERの値を調べてみたら通常のページでもSSLのページでも値が変わる変数はなく、$_SERVSER["SSL_SERVER_DN"]という変数もないためでした。

レンタルサーバに問い合わせると、「SSLはもっと前の段階で振り分けているため機能しない」というようなことを言われました。(聞いてもよく分からなかった)

こういう場合、どう処理してよいのかわかりません。
携帯でアクセスしてきたユーザーがアドレスを見て、同じURLでPCでアクセスしてきてしまったらお手上げです。

携帯もSSLで接続できればいいのですが、携帯で接続しようとすると「このサイトは安全でない可能性があるため接続できません(発行者エラー)」と表示され、接続できません。

どうしたらよいのでしょう?

環境:
PHP Version 4.3.0
SSLはレンタルサーバの共有SSL

A 回答 (6件)

PHPは解らないのですが、perlで行った事があります。


同様のSERVER_PORT=80のサーバでSSLかどうか確認するために、他の環境変数でチェックしました。
プロキシサーバを経由するためなのか、HTTP_VIA(phpにあるかどうかはわからないけれど)と言う環境変数ができていたので、それでチェックしました。
httpと、httpsで環境変数一覧を出して比較してみると常時違う環境変数があれば、それでチェックできるかもしれません。
    • good
    • 0

SERVER_PORT => 80


ということは、SSLがかかってないということだと思いますが・・・。
HTTPと違うポートでリスニングするというのは大前提ではないのかいな?
apache(レンタルサーバ)の設定がちがうんじゃないでしょうか?
DOCUMENT_ROOTが違うとか・・・
スクリプトで悩む前に レンタルサーバー側をよく調べたほうがいいと思います。

この回答への補足

レンタルサーバーに問い合わせてみました。
以下、回答です。

-----------------------------------------------------
■SSL通信につきまして
弊社で提供しておりますの共有SSLの仕組みにつきまして説明させていただきます。
SSLアクセラレーターを通じてSSL通信を実現しております。
SSL通信を行う際、閲覧者とSSLアクセラレーター間はSSL通信を行いますが、
SSLアクセラレーターからお客様サーバー間は通常のHTTP通信となります。

従いまして、お客様のご指摘通り、SSL通信であるか否かの判定が行えない環境で
ございます。

■独自SSLでは
共有SSLのほかにベリサインなどの独自SSLの場合につきましても、同様の仕組みを
採っていますが、こちらに関しましてはお客様のご要望に応じてSSLアクセラレーター
経由ではなく、サイトに直接、証明書をインストールする対応をさせていただいて
おります。
この場合にはSSL通信の判定が可能になります。

大変恐縮ではございますが、結果としまして共有SSLの場合には、お客様のご要望に
ございます、SSL通信の判定が行えない環境でございます。
-----------------------------------------------------

ということは、あきらめるしかないということですね。。。

補足日時:2005/06/01 18:23
    • good
    • 0

>>$_SERVSERの値を調べてみたら通常のページでもSSLのページでも値が変わる変数はなく、$_SERVSER


を見落としてました。
$_SERVSER ?? $_SERVER とは違うもの?

↓も使えるかもです。
.htaccess
<Files *>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} !^DoCoMo/ [NC]
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ([^/]*)$ https://%{HTTP_HOST}/$0
</Files>
(DoCoMoじゃないやつが、80でアクセスしてきたら、httpsにとばす)

この回答への補足

回答ありがとうございます。
すいません$_SERVSER → $_SERVER の間違いです。

SERVER_PORT も調べてみましたが、両方とも80なので不可です(;;

補足日時:2005/05/30 19:11
    • good
    • 0

Apacheのhttpd.confに下記3行を○の部分を書き換えて追加する



<Directory /home/○○○/public_html/○○○>
SSLRequireSSL
</Directory>

又は.htaccessが利用できるならば、SSL用のディレクトリに下記1行を書いた.htaccessをUPする

SSLRequireSSL

これでSSL以外ではエラーになり接続できない。

参考URL:http://blog.livedoor.jp/hanazu/archives/cat_1184 …

この回答への補足

.htaccessで設定してみましたが、SSL、通常、どちらでアクセスしてもInternal Server Errorとなってしまいました。(;;

補足日時:2005/05/30 19:19
    • good
    • 0

$_SERVER['SERVER_PORT']


が 80 か 443

ちなみに
while(list($key,$val) = each($_SERVER)){
 echo $key.'---'.$val.'<BR>';
}
で変数確認してみればいいんじゃないでしょうか

この回答への補足

SSLで接続した時の$_SERVERの一覧です

SERVER
DOCUMENT_ROOT => /var/www/html
HTTP_ACCEPT => */*
HTTP_ACCEPT_ENCODING => gzip, deflate
HTTP_ACCEPT_LANGUAGE => ja
HTTP_CONNECTION => Keep-Alive
HTTP_HOST => **********.jp
HTTP_USER_AGENT => Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
PATH => /sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
REMOTE_ADDR => ***.***.**.**
REMOTE_PORT => 4012
SCRIPT_FILENAME => /var/www/html/*****/ini.php
SERVER_ADDR => ***.***.*.**
SERVER_ADMIN => ******@*******.jp
SERVER_NAME => www.*******.jp
SERVER_PORT => 80
SERVER_SIGNATURE =>
Apache/1.3.27 Server at www.********.jp Port 80

SERVER_SOFTWARE => Apache/1.3.27 (Unix) (Red-Hat/Linux) FrontPage/5.0.2.2626 PHP/4.3.0 mod_perl/1.27
GATEWAY_INTERFACE => CGI/1.1
SERVER_PROTOCOL => HTTP/1.1
REQUEST_METHOD => GET
QUERY_STRING =>
REQUEST_URI => /******/ini.php
SCRIPT_NAME => /******/ini.php
PATH_TRANSLATED => /var/www/html/******/ini.php
PHP_SELF => /*****/ini.php
argv => Array
argc => 0

補足日時:2005/05/30 19:24
    • good
    • 0

正確かどうかは分からないが(Apacheの設定によっても変わるのかも)、HTTPSという環境変数が設定されないかなぁ?



if(isset($_SERVER['HTTPS']))
print "SSLです";
else
print "SSLじゃないあるね";

この回答への補足

回答ありがとうございます。
$_SERVER['HTTPS']という変数はSSLでも設定されていませんでした。(;;

補足日時:2005/05/30 19:14
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!