.htaccessでのログアウト
- perl cgiプログラムを作るうえで、.htaccessでユーザ制限をしています。ログアウト処理を作ろうと思い、ググったところ以下の記事を見つけました。
- 記事では、ApacheのようなWebサーバではnph-logout.cgiというプログラムを作成することでログアウトが可能になると紹介されています。
- ただし、Realmの部分は環境に合わせて書き換える必要があります。また、ログアウトメッセージを変更することも可能です。
- ベストアンサー
.htaccess でのログアウト
いつもありがとうございます。 perl cgiプログラムを作るうえで、.htaccess でユーザ制限をしています。 ログアウト処理を作ろうと思い、ググったところ以下のような記事がありました。 http://shorindo.com/research/1307411586 (詳細は下記にペースト) この方法だと、「Realmの部分を設置する環境に合わせて書きかえる必要はある」ということですが、どう書き換えればよいでしょうか? また、「認証に失敗しました」というのが印象がわるいので、「ログアウトしました」というようなメッセージにしたいのですが、可能でしょうか? ********************************************************************************** 「ApacheのようなCERNやNCSAの流れを汲むWebサーバでは、「nph-」で始まる名前のCGIではそれができるようになっている。これを利用してnph-logout.cgiというプログラムを作る。内容は #!/usr/bin/perl print <<EOF; HTTP/1.0 401 Unauthorized WWW-Authenticate: Basic Realm="valid users only" Content-Type: text/html <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <HTML><HEAD><TITLE>401 Authorization Required</TITLE></HEAD> <BODY> <H1>Authorization Required</H1> </BODY> </HTML> EOF これだけである。Realmの部分を設置する環境に合わせて書きかえる必要はあるが、ログインした状態でこのプログラムにアクセスすると、「認証に失敗しました」というダイアログボックスに続き、ログイン情報の入力ダイアログボックスが表示される。 ここでキャンセルすると、以降はこのURL領域に対しては認証を求められるので、「ログアウト」された状態になっていることがわかる。 」
- nagaon
- お礼率68% (293/427)
- CGI
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
> 「Realmの部分を設置する環境に合わせて書きかえる必要はある」ということですが、どう書き換えればよいでしょうか? 自身の .htaccessで指定したBASIC認証の設定中の AuthName で指定した文字列と同じにすればよいです。 > 「ログアウトしました」というようなメッセージにしたいのですが、可能でしょうか? 通常のログイン処理でのログイン失敗と同じ状態をわざと作っているのですから、 この擬似ログアウト処理のときだけ、メッセージを変更することはできないはずです。 もし、ログアウト処理やそのメッセージを綺麗に作りたければ、ログアウト処理ができる認証方法 (CGI上でセッションを使った認証等でHTMLを毎回動的に生成)を使うしかないでしょう。 ただし、これに変更した場合は、 CGI経由で生成されない静的コンテンツ(画像ファイルや固定ファイルのjsやcssファイル)は 認証なしでアクセスできるようになってしまうという弊害が発生してしまいますが。
関連するQ&A
- phpを用いたダイジェスト(digest)認証後のログアウト処理方法
いつもお世話になっています. 早速ですが,タイトルの件について質問します. 現在作成しているサイトでダイジェスト認証を行いたく,以下のプログラム digest_auth() を利用して認証を行っています. URL: http://techblog.ecstudio.jp/tech-tips/digestauth.html ※説明のため,"[1],[2],[3]"を追記しています. ----------------------------------------------------------------------- function digest_auth($auth_list,$realm="Restricted Area",$failed_text="認証に失敗しました"){ // [1] if (!$_SERVER['PHP_AUTH_DIGEST']){ $headers = getallheaders(); if ($headers['Authorization']){ $_SERVER['PHP_AUTH_DIGEST'] = $headers['Authorization']; } } // [2] if ($_SERVER['PHP_AUTH_DIGEST']){ // PHP_AUTH_DIGEST 変数を精査する // データが失われている場合への対応 ※ 文字数制限のため中略. (暗号化のための準備.) if ($auth_list[$data['username']]){ // 有効なレスポンスを生成する $A1 = md5($data['username'].':'.$realm.':'.$auth_list[$data['username']]); $A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']); $valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2); if ($data['response'] != $valid_response){ unset($_SERVER['PHP_AUTH_DIGEST']); }else{ return $data['username']; } } } // [3] //認証データが送信されているか header('WWW-Authenticate: Digest realm="'.$realm.'", nonce="'.uniqid(rand(),true).'", algorithm=MD5, qop="auth"'); header('HTTP/1.1 401 Authorization Required'); header('Content-type: text/html; charset='.CHARSET ); die($failed_text); } ----------------------------------------------------------------------- index.php より 上記関数 digest_auth() を含む degest.php へリンクさせ,ログイン及び認証させています. degest.php では”ログアウト”を index.php へリンクさせ,戻る仕様としています. ここで,一度ログアウトした際に,認証データがクライアント側にあるため,再度 index.php よりログインする際,プログラム中の[1] や [2] により処理され,入力ダイアログ[3]は出てきません. ブラウザを閉じることで,認証データ(セッション?)が消え,ログアウトしたことになるということは見つけましたが,今回は認証データを任意に消したいというものです. ログアウトした際に,クライアント側のセッション情報を消せばよいのかとおもい,ログアウト先の index.php 内で以下の処理を行ってみました. URL: http://www.php.net/manual/ja/function.session-destroy.php ----------------------------------------------------------------------- (文字数制限のため省略) リンク先 "例1" ---------------------------------------------------------------------- しかし,うまくログアウトすることができませんでした.つまり,入力ダイアログ[3]が表示されませんでした. また,$_SERVER['PHP_AUTH_DIGEST']の値がセッション情報から得られいて,セッション情報を消しても,[1]によりヘッダー情報から$_SERVER['PHP_AUTH_DIGEST']の情報を補っているためかとおもい,[1]を消してから再度トライしてみましたが,やはりダメでした. 確認だけで当たり前の現象ですが,[1]を消して,さらにunset($_SERVER['PHP_AUTH_DIGEST'])を最初に行うことで認証情報を消し,再度入力ダイアログが現れる現象を確認しました. (もちろん,正しい値を入力してもまた聞かれる状態です..) 現時点では,なんらかの方法により,クライアント側の認証データ(セッション?)を消すことで,ログアウトができると考えています. 以上より,今回用いているダイジェスト認証処理を行った後のログアウト処理方法についてどなたか御教授ください. よろしくお願いします.
- ベストアンサー
- ネットワーク
- 初心者 CGIがうまく表示できない hello worldが表示されない
よろしくお願いします。 アパッチとアクティブパールはインストール済みです。(vistaです) C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\index.html で「It works!」は問題なく表示されます。 中身: <html><body><h1>It works!</h1></body></html> です。 次にCGIを表示する練習をしようと C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\perlbook というフォルダに ********************************* ファイル名:hello.cgi 中身: #!/Perl/bin/perl print << "eof"; content-type: test/html <html> <head> <title>cgi</title> </head> <body> hello world </body> </html> eof ********************************* を作り、ダブルクリックで開きましたが ブラウザには 「#!/Perl/bin/perl print << "eof"; content-type: test/html hello world eof」 が表示されます。 hello worldだけ表示されるはずだと思うのですが なぜ全てのタグが表示されてしまうのでしょうか? どこが間違っているのかご指摘よろしくお願いします。
- ベストアンサー
- Perl
- wing2での .htaccessの設置
wing2で .htaccessの設置可を設置しようとしたら うまくいきません。 .htaccess .htpasswdを /~○○○/cgi-bin/ に入れた ホームページで見ると3回認証の画面が出て id passを3回入れたら Authorization Required が出てしまう。 なお htaccessファイルは http://www.shtml.jp/htaccess/basic.html .htpasswdは http://www.shtml.jp/htaccess/make_htpasswd.html を見て作りました
- ベストアンサー
- その他(プログラミング・開発)
- 画像ファイルが崩れる
Perlで、CGIを作成しています。 GIF画像をCGI経由で表示させようと思っているのですが、なぜか、画像が崩れてしまいます。GIFだけではなく、Jpegでも同じです。しかし、HTMLファイルの <img>タグでそのまま表示させようとすると、きちんと表示します。 どのようにすれば、崩れを抑えられますか? CGIソース---------------------- #!/usr/local/bin/perl $imgsrc="number/0.gif"; print "Content-type:image/gif\n\n"; open(IMG,$imgsrc); binmode(IMG); print <IMG>; close(IMG); -----------------------------EOF HTML---------------------------- <html> <head> </head> <body> <img src="cgi/image.cgi" width="28" hegiht="31"> </body> </html> ------------------------------EOF gif画像は、 http://www.akikobrand.com/icon/img/10/6/0.gif を使わせていただきました。(個人的な使用です)
- ベストアンサー
- CGI
- .htaccessで入力したIDをPERLのプログラムで使いたい
こんにちわ。perlに詳しい人に質問です。 タイトル通りの内容なのですが、 .htaccess認証でIDとパスワードをしてもらい、ログインする形式なのですが その後もそのIDとパスワードを使用していきたいんです。1度入力した内容を 再び入力するのは面倒でしょうし。 どうにか、.htaccess認証で入力したIDとパスワードを変数として perlのCGIプログラムに渡すことは可能でしょうか? 分かる方、ヒントだけでもくれたら嬉しいです。お願いします。
- ベストアンサー
- Perl
- If文について教えてください。
下記のようなプログラムで、結果を”間違っています。”にしたいのですが、 結果は”OK”となってしまいます。 どうすればいいのでしょうか? #!/usr/bin/perl $a="aaa"; $b="ccc"; if ( $a != $b ){ chigau(); } print<<"EOF"; Content-type: text/html <HTML> <BODY> OK </BODY> </HTML> EOF sub chigau { print<<"EOF"; Content-type: text/html <HTML> <BODY> 間違っています。 </BODY> </HTML> EOF exit; }
- ベストアンサー
- Perl
- ヒアドキュメントでHTMLを書いて次へをクリックするとサブルーチンが表示される方法は?
こんにちわ。perlでCGI学んでます。初心者です。 CGIの中にヒアドキュメントでHTMLを書きました。 そのページの最後に「次のページへ」というフォームボタンをつけました。ボタンをクリックするとサブルーチンの次ページが表示されるようにしたいのですが、うまくいきません。ボタンはinputタグのボタンにしたいので、テキストリンクにはしません。 「次のページへ」をクリックするとサブルーチンのpage1の中が表示されるようにするにはどうしたらいいですか?hiddenタグをボタンの下に書けばいいといわれたのですが、どうもうまくいきません。ご存知のかた、ご教授願います。 以下のようにソースを書きましたがうまくできません。。。。 #!/usr/bin/perl $script="test.cgi" print <<"EOF"; Content-type: text/html <html> <head> <meta content="text/html; charset=shift_jis"> <title></title> </head> <body> あなたの注文したものは●●です。 よろしかったら次のページへを押してください。 <form method="post" action="$script"> <input type="submit" value="次のページへ"> <input type="hidden" name="page1" value="page1"> </form> </body> </html> EOF ####サブルーチン###################### sub page1{ print <<"EOF"; Content-type: text/html <html> <head> <meta content="text/html; charset=shift_jis"> <title></title> </head> <body> お買い上げありがとうございました。 </body> </html> EOF }
- ベストアンサー
- CGI
- PERLでのヒアドキュメントの呼び出し
以下のようなCGIの改造を行いたいのですが、 sub abc{ ・ ここ1 ・ $check1=<<"EOF"; <HTML><HEAD><TITLE>test</TITLE></HEAD><BODY> ・ <img src="$directryname[0]" width = "80"> ・ </BODY></HTML> EOF ここ2 print $check1; exit; ここ1、もしくはここ2のところに $directryname[0] = "http://abc/aa/a.jpg"; を入れてもsub abc内のimgタグで..jpgが表示されません。 ヒアドキュメントでぐぐって見ましたが、適切な回答が得られませんでした。よろしくお願いします。
- ベストアンサー
- Perl
- htaccessでのアクセス制限
htaccessを使用したアクセス制限を勉強しています。IPアドレスでのアクセス制限はうまくいき、ユーザ毎パスワードでのアクセス制限の方も、ダイアログボックスが出る所までは上手くいったのですが、どんなIDとパスワードを入れても毎回401 Authorization Requiredとなってしまい、原因が分かりません。htaccessの中身は --------------------------------- AuthUserFile ~/.htpasswd AuthGroupFile /dev/null AuthName "ByPass" AuthType Basic <Limit GET POST PUT> require valid-user </Limit> --------------------------- です。 AuthUserFileには、Perlで print "Content-type: text/html;charset='x-euc-jp'\n\n"; $0 =~ /[^\\\/]*$/; print "\$` =$`"; というプログラムをかけてパスを出しました。 サーバはApacheです。原因の分かる方、宜しくお願いします。
- 締切済み
- CSS
- フォームからCGIを起動できない
こんばんは。 WebサーバApacheでCGIを作成しています。 DocumentRootが初期設定/var/www/html/で、その下にindex.htmlを作成しました。 次にcgiのディレクトリが初期設定の/var/www/cgi-bin/で、その下にtest.cgiを作成しました。 そして、test.cgiのパーミッションを-rwxr-xr-xにしてからApacheを起動しました。 別マシンのブラウザからhttp://xxx.xxx.xxx.xxx/index.htmlでアクセスし、フォームのテキストボックスに「abc」と入力して送信ボタンを押しましたが、404エラーになってしまいます。 (アドレスバーには「http://xxx.xxx.xxx.xxx/test.cgi?NAME=abc」と表示) ブラウザのアドレスバーに直接「http://xxx.xxx.xxx.xxx/cgi-bin/test.cgi?NAME=abc」とすると正常にアクセスできます。 ドキュメントルート配下にあるindex.htmlからドキュメントルート外にあるCGIのディレクトリ(ScriptAlias /cgi/bin/ "/var/www/cgi-bin/")を参照するにはどのようにしたらよいのでしょうか? ----------index.html---------------- <HTML> <HEAD><TITLE>フォーム</TITLE></HEAD> <BODY> <FORM ACTION="../cgi-bin/test.cgi" METHOD="GET">名前 <INPUT TYPE="TEXT" NAME="NAME"><BR> <INPUT TYPE="SUBMIT" VALUE="送信"> </FORM> </BODY> </HTML> ----------index.html---------------- ----------test.cgi------------------ #!/usr/bin/perl $str = $ENV{"QUERY_STRING"}; print << "EOF"; Content-type: text/html <HTML> <HEAD><TITLE>TESTCGI</TITLE></HEAD> <BODY>$str</BODY> </HTML> EOF ----------test.cgi------------------
- ベストアンサー
- CGI
補足
詳細なご回答ありがとうございます。 「認証に失敗しました」というのは、一般ユーザ向けには やはり見せたくないですね。 静的コンテンツは、ウェブからアクセスできないディクトリに入れてあるので問題ないです。http://www.dab.hi-ho.ne.jp/sasa/biboroku/perl/session.html なんかを参考に見ていますが、「セッションを使った認証」というのが難しいです。もっと古典的で簡単な、認証・ログアウト方法というのはないでしょうか?