- 締切済み
SSLのページかどうか判別する方法
情報漏えい防止のため、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
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- fumufumu_2006
- ベストアンサー率66% (163/245)
PHPは解らないのですが、perlで行った事があります。 同様のSERVER_PORT=80のサーバでSSLかどうか確認するために、他の環境変数でチェックしました。 プロキシサーバを経由するためなのか、HTTP_VIA(phpにあるかどうかはわからないけれど)と言う環境変数ができていたので、それでチェックしました。 httpと、httpsで環境変数一覧を出して比較してみると常時違う環境変数があれば、それでチェックできるかもしれません。
- bioche
- ベストアンサー率50% (4/8)
SERVER_PORT => 80 ということは、SSLがかかってないということだと思いますが・・・。 HTTPと違うポートでリスニングするというのは大前提ではないのかいな? apache(レンタルサーバ)の設定がちがうんじゃないでしょうか? DOCUMENT_ROOTが違うとか・・・ スクリプトで悩む前に レンタルサーバー側をよく調べたほうがいいと思います。
- bioche
- ベストアンサー率50% (4/8)
>>$_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なので不可です(;;
- webcom
- ベストアンサー率67% (19/28)
Apacheのhttpd.confに下記3行を○の部分を書き換えて追加する <Directory /home/○○○/public_html/○○○> SSLRequireSSL </Directory> 又は.htaccessが利用できるならば、SSL用のディレクトリに下記1行を書いた.htaccessをUPする SSLRequireSSL これでSSL以外ではエラーになり接続できない。
補足
.htaccessで設定してみましたが、SSL、通常、どちらでアクセスしてもInternal Server Errorとなってしまいました。(;;
- bioche
- ベストアンサー率50% (4/8)
$_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
- anmochi
- ベストアンサー率65% (1332/2045)
正確かどうかは分からないが(Apacheの設定によっても変わるのかも)、HTTPSという環境変数が設定されないかなぁ? if(isset($_SERVER['HTTPS'])) print "SSLです"; else print "SSLじゃないあるね";
補足
回答ありがとうございます。 $_SERVER['HTTPS']という変数はSSLでも設定されていませんでした。(;;
補足
レンタルサーバーに問い合わせてみました。 以下、回答です。 ----------------------------------------------------- ■SSL通信につきまして 弊社で提供しておりますの共有SSLの仕組みにつきまして説明させていただきます。 SSLアクセラレーターを通じてSSL通信を実現しております。 SSL通信を行う際、閲覧者とSSLアクセラレーター間はSSL通信を行いますが、 SSLアクセラレーターからお客様サーバー間は通常のHTTP通信となります。 従いまして、お客様のご指摘通り、SSL通信であるか否かの判定が行えない環境で ございます。 ■独自SSLでは 共有SSLのほかにベリサインなどの独自SSLの場合につきましても、同様の仕組みを 採っていますが、こちらに関しましてはお客様のご要望に応じてSSLアクセラレーター 経由ではなく、サイトに直接、証明書をインストールする対応をさせていただいて おります。 この場合にはSSL通信の判定が可能になります。 大変恐縮ではございますが、結果としまして共有SSLの場合には、お客様のご要望に ございます、SSL通信の判定が行えない環境でございます。 ----------------------------------------------------- ということは、あきらめるしかないということですね。。。