login.inc.php

サマリPHPセッションを使った認証プラグイン(CGI版PHPでも実行可)
リビジョン0.1
対応バージョン1.4.7
投稿者pikky
投稿日2007-05-10 (木) 00:46:03

概要

  • pukiwiki1.4.7の標準認証にsession(cookie)を使って認証できる機能をつけました。
  • CGI版PHPでも認証が機能します(さくらインターネットで使っています)
  • 認証が必要なページにアクセスすると自動的にログイン画面が表示されます。
  • login.inc.phpというプラグインとauth.phpを変更して実装しています。

注意

phpのsessionでは、cookieを使います。また、cookieが使えない場合は、URLにセッション情報が表示されます。いずれの場合も、ユーザ・パスワードが一致しなくても、認証された状態になってしまう危険性が指摘されています。このプラグインでは、とりあえずsession_regenerate_id(TRUE)を入れています。詳しくは、「PHP session 注意」などで検索下さい。

本当にみられたくない場合は、別フォルダにpukiwikiをインストールし、それぞれ.htaccessで管理する方が確実です。お互いにInterWikiで連携して

login.inc.phpは以下のような場合には便利かもしれません。

  • 編集を許可するユーザをとりあえず指定したい。
  • userauth.php」などを使って、許可するユーザ・パスワードを頻回に変更したい。(userauth.phpと併用できます)

デモサイト

  • http://pw1.atcms.jp/pikky/

インストール方法

自分でファイルを更新する場合

  • login.inc.phpをpluginディレクトリに入れてください。
    • plugin/login.inc.php.txt http://pw1.atcms.jp/pikky/index.php?plugin=attach&pcmd=open&file=login.inc.php.txt&refer=FrontPage
  • lib/auth.phpを以下のファイルと置き換えてください。
    • lib/auth.php.txt http://pw1.atcms.jp/pikky/index.php?plugin=attach&pcmd=open&file=auth.php.txt&refer=FrontPage
  • pukiwiki.inc.php pukiwiki.ini.phpに以下の1行を入れてください。
    $auth_type = 'session'; session_start();session_regenerate_id(TRUE);

パッチを使う場合

以下のパッチをpukiwikiのインストールディレクトリからあててください。

% patch -p1 < login-20070511.patch
  • login-20070511.patch http://pw1.atcms.jp/pikky/index.php?plugin=attach&pcmd=open&file=login-20070511.patch&refer=FrontPage
  • login-20070511.patch ミラー(このページのコメント内)
    • セキュリティ関係:rawurlencode, htmlspecialcharsを追加。
    • その他:get_script_uri()の使用。変数の整理など。
  • login-20070510.patch
    • sessionに綴り間違いがあったので修正。session_regenerate_id(TRUE)にする。
  • login-20070509.patch 初期バージョン

使い方

  • まず、pukiwiki.inc.php pukiwiki.ini.php機能を有効にしてください(すでに使用している人は不要です。また、userauth.phpを使っている人も不要です)。

例えば、

  • secretという名前が入っているページ名に編集・参照両方の認証をつける。
  • ユーザ名は authority パスワードは、hirakedoor

には、pukiwiki.inc.php pukiwiki.ini.phpを以下のようにする。

$auth_users = array(
	'authority' => '{x-php-md5}' . md5('hirakedoor'),
);
$read_auth = 1;
$read_auth_pages = array(
	'#secret#'	=> 'authority',
);
$edit_auth = 1;
$edit_auth_pages = array(
	'#secret#'	=> 'authority',
);
  • 後は、認証が必要なページにアクセスすると、自動的にログイン画面が表示されます。正しくログインできると、そのページが開きます。ログインに失敗すると、成功するまでログイン画面が表示されます。
  • 一度ログインすると、cookieが有効である限り、認証は不要です。
  • 自分でログイン・ログアウトしたい場合は、?plugin=login ページにアクセスしてください。すでにログインしていた場合はログアウト画面が表示され、まだの場合はログイン画面が表示されます。

loginプラグインのおまけ

  • &login();
    • 現在のログインユーザ名が表示され、ログイン画面へのリンクが表示されます。
    • MenuBarに入れておくと、ログイン画面か、現在のユーザ名が表示されるので便利です。
  • #login
    • 現在のログインユーザ名が表示され、ログイン画面またはログアウト画面が表示されます。

説明

  • pukiwiki.inc.php pukiwiki.ini.php
    • $auth_typeという変数を追加しました。
      • $auth_type = 'session';session_start();session_regenerate_id(TRUE);
        を有効にするとsession認証になります。
      • 消すと、標準のHTTP認証に戻ります。
    • session_start()といった初期化を、最初、lib/auth.phpにまとめて書いたのですが、auth.phpは、pukiwiki.ini.phpより先に読み込まれてしまうので、$auth_type == 'session'かどうかで処理を分けられません。また、sessionを使わない人にとっては、session_startは余計な処理なので、仕方なく、pukiwiki.ini.phpにまとめて書きました。
    • index.phpに、define(PKWK_AUTH, 'session');などとすればよいのかもしれませんけど。プラグインの域を超えてますね。
  • lib/auth.php
    • $auth_type == sessionの場合の処理を加えています(function basic_authの部分だけです)
  • plugin/login.php
    • 実際にログイン、ログアウト画面を表示し、認証します。

ライセンス

GPLです。

経緯

さくらインターネットで、ユーザ認証を行わなければならなったものの、うまくいかず。さんざんサイトを探して、CGI版PHPではBASIC認証ができないことが判明。かなり落胆・・・。 諦めきれず、pukiwikiでセッション管理をしているサイトがあるはずだと探していたら、以下のサイトで、セッションの使い方とpluginの作り方をみる。ありがとうございました。

それで、pukiwiki1.4.7のauth.phpをみてみたら、認証している部分はbasic_authだけということに気づく。これならいけるじゃん!と改造を決意。basic_authを全部消して実装する。

やってみたらあっさり動いた。

PHPのセッションには問題があるが、「そんなに頑固なセキュリティじゃないけど、編集できないページも作れますよ」と説明できればよいぐらいの立場の人もいるに違いないと思いはじめる。また、たったこれだけの改造で動くようになった、pukiwikiとauth.phpのすばらしさに感謝して、公開することを決意。

元のauth.phpを復活させ、auth_typeで切り替えられるようにし、いくつかのサーバでインストールテスト。公開してみた。

コメント

  • userauth.php」と併用して使用したいのですが、どのようにpukiwiki.inc.php pukiwiki.ini.phpを設定したらいいのでしょうか? -- サイババ? 2007-05-10 (木) 12:40:51
    • 「userauth.php」を使っているのであれば、pukiwiki.ini.phpには、以下の1行を入れるだけで動くと思います(後は、一緒でlib/auth.phpを上書きし、plugin/login.php.incを追加)。今、確認できないのですみません。-- pikky 2007-05-10 (木) 13:57:54
      $auth_type = 'session'; session_start();session_regenerate_id();
  • 出来ました。どうもありがとうございました(^^) ところで、パッチを適用すると、
    $auth_type = 'session'; session_start();session_regenerate_id();
    ではなく、
    $auth_type = 'session'; session_start();sessio_regenerate_id();
    が、出力されました。sessionのnが抜けてました。 -- サイババ? 2007-05-10 (木) 14:12:55
    • ご報告ありがとうございます。動いてホッとしてます^o^。つづり間違い、ご連絡ありがとうございました。修正しました。-- pikky 2007-05-10 (木) 16:52:40
  • sessionでユーザー管理ですか。いいですね。CGI版PHPユーザーは待ち望んでいた機能ではないでしょうか。実装お疲れ様です。
    細かい突っ込みですが、$scriptはglobalで取得せずにget_script_uri()で取得するのが推奨されています。
  • お疲れ様です。Locationヘッダーの部分に rawurlencode($page)、プラグインのところにhtmlspecialchars($script)が要るでしょう。plugin_login_action()で NULL を特別な値として使われていますが、$var['user'] には空文字列をセットできるので、考え方としてはですが $pass!=NULL のようなチェックは怖いです。また、例えば GET によるアクセスを明示的に無視したいなら $post['user'] が使えます。rawurlencode($s_referer) は直前に htmlspecialchars() している様ですね。 -- henoheno 2007-05-11 (金) 00:13:28
  • ソース確認いただいてありがとうございます。ご指摘のあった部分を修正しました。 -- pikky 2007-05-11 (金) 14:44:27
  • 「define('PKWK_READONLY', 1);」の時に、「&login();」と「#login」を出力しないような仕様、または、スイッチを要望します。どうぞ、よろしくお願いします。 -- 2007-05-19 (土) 22:15:10
    • 「define(PLUGIN_LOGIN_HIDE_LOGIN, 1);」をlogin.inc.phpにつけたいと思います。--pikky 2007-05-23 (水) 13:08:10
  • 全ページ読みはOkで編集だけユーザ認証を必要にする場合、$read_auth = 0;$edit_auth = 1;にして、各pagesの指定($edit_auth_pages = array( 以下の部分)を '##'にすると全ページ対象になるようですが、これで問題は無いでしょうか? -- 作者に感謝!感謝!? 2007-05-21 (月) 16:45:33
    • ありがとうございます。'#*#'がいいと思いますが、結果は同じですね。 --pikky 2007-05-23 (水) 13:08:10
  • Operaの9.20ではログイン出来ないようです。何か設定が間違っているのかな? -- 2007-05-22 (火) 08:56:36
    • 後でoperaで試してみますが、クッキーがonになっているかどうか確認してみてください--pikky 2007-05-23 (水) 13:08:10
    • クッキーはonになっています。Safariも動作が怪しい(編集の途中でセッションが切れる?)ので、IE&Sleipnirでログインしています。こちらは全く問題ないです。 -- ブラウザ対応について? 2007-05-23 (水) 23:04:41
    • すみませんpagesの指定で、一度 ' ' にしてしまって、そのままにしていたようです。''##'にするとOperaでも認証が通って全頁が編集対象になりました。IEと他のブラウザの挙動が違うのは不思議ですが。#*#'も試しましたが、全ページ編集の対象にならないようで、認証画面が出てきませんでした。 pikky さん、どうもお騒がせしました。 -- 2007-05-23 (水) 23:43:50
  • さくらに設置した1.4.7_notbに対してFirefox2.0.0.4で問題なくログインできました。編集時全ページを認証対象にするのに'#^.*#'で指定しています。ところで上の方で pukiwiki.inc.php と書かれてあるのは pukiwiki.ini.php のことですよね。 -- x-person? 2007-06-19 (火) 18:17:40
    • それでいいと思います。(そもそもpukiwiki.inc.phpは無いでしょうし)
      老婆心ながら、「pukiwiki.inc.php」を「pukiwiki.ini.php」に取り消し線付きで書き換えておきました。(まるっと書き換えた方がよかったでしょうか?) -- 2007-11-29 (木) 10:03:20
  • 欲しいプラグイン/286のものです。使わさせて頂きます。 -- ^^? 2007-07-09 (月) 08:05:48
  • 単語検索の時、文字を入力して検索しようとするとなぜか認証画面にいってしまいます。原因とかわかりますでしょうか?認証設定では検索の部分は特に記入してないのですが・・・ -- 2007-12-18 (火) 12:03:10
    • ログインしていないときに、$auth_flag を無視して必ずログインさせようとしているからじゃないですか?本来なら、$auth_flag がfalse の時は今の状態を維持して、対象ページかどうかのチェックのみを行うはずなんですが・・・ -- 2009-03-04 (水) 18:23:39
    • こう変えたらどうですか? -- 2009-11-02 (月) 11:12:50
       	// require valid user
       	if ($auth_type == 'session'){
      -		if (!isset($_SESSION['login_user']) ) { // not login -> login page
      +		if ($auth_flag && !isset($_SESSION['login_user']) ) { // not login -> login page
       			header("Location: " . get_script_uri() . "?plugin=login&referer=" . rawurlencode($page));
       		}
      -		if ( !PKWK_READONLY && 
      +		if ( !PKWK_READONLY && isset($_SESSION['login_user']) &&
       			in_array($_SESSION['login_user'], $user_list))
       		{
       			return TRUE; // Auth success
       		}
  • さくらインターネットを使ってるので入れてみました。 pukiwikiにアクセスをすると以下のようなエラーがでます。Headers already sent at /home/サイトのパス/lib/auth.php line 2  1.4.7_notbでIE6.0でこのようになりました。助言をお願いします>< -- 2008-01-13 (日) 05:55:58
    • auth.phpがクラックされてませんか? 先頭にSPAMが入ってるみたいだけど、これで正常? -- eddy? 2008-03-14 (金) 15:08:36
    • クラックされているのではなく、作者のGoogleAdSenseが挿入されているのでは?動作自体はそこをごっそり削っても問題ありませんよ。 -- a.c.? 2008-03-14 (金) 16:19:56
    • 失礼。アフィリエイトだったんですね。その部分を削除したらエラーが出なくなりました…。 -- eddy? 2008-03-14 (金) 19:58:43
    • 2008/1/13の方と同じ症状でしたが、これは「自分でファイルを更新する場合」に、auth.phpとlogin.phpをこのページからダウンロードすると、Amazonのタグなどがついてしまうのが原因です。テキストエディタで一行目の空行と、最後の?>以降を削除すればOKでした。 -- hk? 2008-05-18 (日) 01:10:24
  • まだここに書き込んでも大丈夫かな?
    userauthと併用(閲覧制限無し、編集制限ありで運用)しているんですが、複数画像ファイルを添付するとそのページを表示後必ず勝手にログアウトします。(refで表示する回数を2箇所以上にすると発生するようです。同じ画像を2回表示しても現象起きずです。)
    その後に編集ボタンをおしても認証を求めるので二度とそのページは編集できない状態になります。
    単純に2つの画像をref使って連続で表示させその直後にloginと表示させるとユーザー名を表示できます。その後ページをリロードすると認証が外れている。ますます??です。
    画像をURL直に指定する場合は何個でもOK。refプラグインの限界でしょうか? -- boo? 2008-03-07 (金) 14:16:24
    • 私もbooさんと同じ現象です。#ref()を2個以上使用すると2度と編集できなくなります。refプラグインをざっと見渡すと特に認証に関係ありそうな部分は見つからないようなのですが・・・・ -- ai? 2008-04-26 (土) 14:54:35
    • 私も同じ現象です。 ref.inc.php の PLUGIN_REF_DIRECT_ACCESS を TRUE にし、attach/.htaccess を削除すると回避できるみたいです。 -- 2008-06-25 (水) 08:30:33
    • pukiwiki.ini.phpのsession_regenerate_idの行をコメントアウトにするか引数をFALSEにすればrefプラグインを連続で呼出してもセッション情報は引き継がれました。TRUEの場合refプラグインで連続的にリクエストがあった場合セッションファイルが空になっていました。但しコメントアウトにした場合セッションIDが引き継がれるしFALSEにした場合大量にセッションファイルが作成されます。ローカルな環境だとコメントアウトでも良いような気がします。 -- aki? 2009-03-04 (水) 13:09:04
      • それは自作プラグイン/login.inc.php#説明にある通り、標準のHTTP認証ではないですか? -- 2009-03-04 (水) 17:39:25
      • あ、ここの説明だと1行で全部書かれていますね。私の使っているヴァージョンだと3行で記述されていたのでsession_regenerate_id(TRUE);のみって意味で$auth_type = 'session'; session_start();はそのまま残しています。 -- aki? 2009-03-05 (木) 09:48:35
    • 自作プラグイン/imgfolder.inc.php を ref の代わりに使ってみたら、問題は回避できました。 -- 2009-11-02 (月) 04:27:08
      • あと、編集できなくなったページは、ls2_1 などで使って表示される URL をコピーして、URLの read の部分を edit に変えると、とりあえず編集できるようにはなりました。 -- 2009-11-02 (月) 10:33:55
  • 動作環境:win2003srv,iis [編集の認証]ログイン画面でIDとPWを入力しログインすると編集の枠が現れません。間違ったIDとPWではログイン画面に戻ります。助言お願いします。。。 -- masaci? 2008-08-14 (木) 18:28:38
    • 私も上記の方と同じ症状で,編集を押してログイン画面が出てきてID/PWを入力してログインすると元のページに戻されます.新規ページの作成ではID/PWを入力後は編集ページに移り,ページの作成をすることができますが,その後編集できなくなります.助言をお願いしますorz -- ff? 2008-10-05 (日) 18:45:59
    • ログイン後は、閲覧用のURL にリダイレクトするようになっているから、改造しないと無理。 -- 2009-03-04 (水) 18:23:39
  • 久しぶりに書き込みます。
    本プラグインでかなり楽をさせていただいてます。ありがとうございます。
    本格運用に入って久しいのですが、閲覧ユーザーなども含め、「ID/PWを覚えてほしい」(クッキーのことか?)という声が多く聞こえてくるようになりました。
    このプラグインでクッキーを利用してアクセスを簡便化することはできませんでしょうか? -- boo? 2008-10-10 (金) 12:55:47
    • Firefoxだと覚えるかどうかの選択肢が出たような。ブラウザ依存? -- 2008-10-10 (金) 13:11:10
    • 自己レスです。
      PHP初心者ですが、他のソースなど参考にクッキー書き込むようにしました。
      何とか希望の動きになっているようです。当方はuser_authも使っているので「ここをこうすれば大丈夫」って話を的確にすることはできませんが、pukiwiki.ini.phpに数行、login本体にも数行の追加でなんとか動作しています。
      お騒がせいたしました。 -- boo? 2008-10-14 (火) 14:27:40
  • 編集ページ(アドレスにcmd=edit)があるページへのアクセス時のみログイン画面が出るようにしたいのですが。不可能でしょうか? -- taka? 2008-11-29 (土) 01:44:15
    • edit_authのみ有効にすればいけるんじゃないでしょうか? -- 2008-11-30 (日) 09:33:02
    • edit_authのみ有効にしているのですが、なぜか編集制限のかかっているページの閲覧時にログイン画面が出てしまうんです。 -- taka? 2008-11-30 (日) 18:56:42
  • 無事に設置できました。ところで、1度ログオンしてから画面操作をせずしばらく(1時間程度?)経過すると、認証済みのページに移動しても再度ログオンを要求されます。できればブラウザを閉じるまではログオン状態を保持したいのですが、これはプラグイン側の設定で回避できるのでしょうか。 -- 2008-12-19 (金) 02:07:19
  • 1.4.7_notb@さくら でFirefox3.0.6で問題なく動作しました。ありがとうございます! -- とかげ? 2009-02-13 (金) 00:42:15
  • ありがとうございます。助かりました。 -- kuma? 2009-05-09 (土) 19:48:23
  • 利用したいと考えているのですが、どこからダウンロードすればいいのでしょうか? -- SAKURA? 2009-07-06 (月) 01:43:36
  • ありがとうございます。パッチをダウンロードして設定しました。認証画面に行くのですが、pukiwiki.ini.phpで設定したパスワードを認証してくれないところでつまずいています -- SAKURA? 2009-07-07 (火) 14:01:24
  • ロリポップ!レンタルサーバーで特に修正することなく動きました。ありがとうございます。 -- 2010-01-04 (月) 15:08:23
  • 動作報告です。さくらで去年の一時期からうまく認証できなくなっていたのですが、Firefoxのクッキー保存を「毎回確認>同様に処理しない」とすると動作することに気付きました。同様に処理するにチェックしてしまうと認証できなくなってしまうという謎動作ですが一応 -- 2010-02-06 (土) 12:06:47
  • 利用させていただいています。ロリポのCGIPHP5で動作確認。プラウザや使うプラグイン、ページによってはうまく動かない(何度認証しても入れない)ことがあり、挙動を確認したところ、認証ページのパラメータでcmdやpluginの情報をブッチしてしまっているので正常に動かなかったようです・・・今までまがいなりにもうごいていたほうが不思議なんですけそこを個別にきっちり保存するようにするとちゃんと動作しました。 -- GegegeMokeke? 2010-02-14 (日) 19:13:43
  • さくらのレンタルサーバーでやってみたんですが何度認証しても入れませんでした。上記と同じ原因なのでしょうかね? -- 2010-02-15 (月) 01:34:14
  • secedit.inc.phpと共存しなかったです。それぞれ単独では支障なし。secedit.inc.php 2008-11-19 rev.422, ロリポップ!レンタルサーバー(CGI版PHP),pukiwiki-1.4.7_notb_utf8。 -- 2010-06-23 (水) 12:46:33
  • >GegegeMokekeさん、実際のところ、どのように改造(?)すればいいのでしょうか? ロリポップですが、ページによってログインできたりできなかったりで困っています。 -- rekon? 2010-07-12 (月) 19:01:23
  • さくらインターネットに入れましたが、何度editをしようとしてもlogin画面に移ってしまいました。&login(); をMenuBarに入れてみるとページをリロードするたび勝手にログアウトしてしまってるようなので、session_regenerate_id(TRUE); をコメントアウトするとうまく動作するようになりました。セキュリティは下がりますが何度も認証画面が出る人は試してみるといいかも -- test 2010-09-01 (水) 21:14:07
  • ロリポップで問題なく動作しました。ありがとうございました。 -- kk 2010-12-08 (水) 07:24:49
  • 便利なプラグインありがとうございます。ところで添付ファイルを削除しようとするとログイン画面が必ずでて削除できません。何か対策はあるのでしょうか? -- oni? 2010-12-26 (日) 16:54:41
  • あれ、いまの時点でダウンロードできないのですけど・・・??? -- kakukaku? 2011-03-04 (金) 19:26:50
  • ダウンロードできなくなっています>< -- 2011-04-08 (金) 03:55:40
  • アーカイブもない・・・ http://replay.waybackmachine.org/20090530125841/http://pw1.atcms.jp/pikky/ 誰か再UPおねがいします -- 2011-04-09 (土) 13:10:44
  • 上げようにも管理者パスがいるのかしら -- 2011-04-09 (土) 15:09:24
  • 質問箱5/49 -- 2011-04-10 (日) 10:39:44
  • こうなってる? -- Logue 2011-04-17 (日) 13:05:30
    • file: login.inc.php.txt
      <?php
      /////////////////////////////////////////////////
      // login.inc.php
      // 
      // 2007/5/11	無駄な変数を除いて、分かりやすく変更. get_script_uri()を使用
      //		htmlspecialcharsをつけた。
      // 2007/5/9	オリジナル//
      /////////////////////////////////////////////////
      
      
      /* initialize 
      function plugin_login_init()
      {
      }
      */
      
      function plugin_login_inline()
      {
      	if(isset($_SESSION['login_user'])){
      		$msg = $_SESSION['login_user'];
      	        $msg .= ' <a href="' . get_script_uri() . '?plugin=login">Logout</a>';
      	} else {
      	        $msg = '<a href="' . get_script_uri() . '?plugin=login">Login</a>';
      	}
      	return $msg;
      }
      
      
      function plugin_login_convert()
      {
      	if(isset($_SESSION['login_user'])){
      		return _get_logout_form();
      	} 
      	return _get_login_form();
      }
      
      function plugin_login_action()
      {
      	global $vars, $auth_users;
      
      	if($vars['pcmd']=='login')
      	{
      		if( isset($vars['pass']) 
      			&& isset($vars['user'])
      			&& isset($auth_users[$vars['user']])
      			&& pkwk_hash_compute($vars['pass'], $auth_users[ $vars['user'] ]) == $auth_users[ $vars['user'] ])
      		{
      			// login success
      			$_SESSION['login_user'] = $vars['user'];
      	                header('Location: ' . get_script_uri() . '?' . rawurlencode( $vars['referer'] ) );
      			return;
      		}
      		// login fail
      		unset($_SESSION['login_user']);
      		$body = "!!! LOGIN FAILED !!!" . _get_login_form();
      	}
      	else if($vars['pcmd']=='logout')
      	{
      		$body = '';
      		if( isset($_SESSION['login_user'])) {
      			$body = htmlspecialchars($_SESSION['login_user']) . " Logout.";
      			unset($_SESSION['login_user']);
      		}
      		$body .= _get_login_form();
      	}
      	else
      	{
      		if (!isset($_SESSION['login_user']) ) {
      			$body = _get_login_form();
      		} else {
      			$body = _get_logout_form();
      		}
      	}
      	return array('msg' => 'login', 'body' => $body);
      }
      
      function _get_login_form(){
      	global $vars;
      	$script = htmlspecialchars(get_script_uri());
      	$s_referer= htmlspecialchars($vars['referer']);
      	
      	return <<<EOD
      <div>
      <form action="$script" method="post">
        <input type="hidden"   name="cmd"  value="login" />
        <input type="hidden"   name="pcmd" value="login" />
        <input type="hidden"   name="referer" value="$s_referer" />
         User Name<br /><input type="user"  name="user" size="12" /><br />
         Password<br /><input type="password" name="pass" size="12" /><br />
        <input type="submit" value="login" />
      
      </form>
      </div>
      EOD;
      }
      
      function _get_logout_form(){
      	global $vars;
      	$script = htmlspecialchars(get_script_uri());
      	$s_referer= htmlspecialchars($vars['referer']);
      	$user = $_SESSION['login_user'];
      	
      	return  <<<EOD
      <div>
      Current User : $user
      
      <form action="$script" method="post">
       <input type="hidden"   name="cmd"  value="login" />
       <input type="hidden"   name="pcmd" value="logout" />
       <input type="hidden"   name="referer" value="$s_referer" />
       <input type="submit"   value="logout" />
      </form>
      
      </div>
      EOD;
      }
      ?>
    • file: login-20070511.patch
      diff -urN pukiwiki-1.4.7_notb/lib/auth.php pukiwiki-1.4.7_notb_login/lib/auth.php
      --- pukiwiki-1.4.7_notb/lib/auth.php	2005-06-13 23:02:07.000000000 +0900
      +++ pukiwiki-1.4.7_notb_login/lib/auth.php	2007-05-11 16:02:18.000000000 +0900
      @@ -168,7 +168,7 @@
       // Basic authentication
       function basic_auth($page, $auth_flag, $exit_flag, $auth_pages, $title_cannot)
       {
      -	global $auth_method_type, $auth_users, $_msg_auth;
      +	global $auth_method_type, $auth_users, $_msg_auth, $auth_type;
       
       	// Checked by:
       	$target_str = '';
      @@ -185,43 +185,51 @@
       
       	if (empty($user_list)) return TRUE; // No limit
       
      -	$matches = array();
      -	if (! isset($_SERVER['PHP_AUTH_USER']) &&
      -		! isset($_SERVER ['PHP_AUTH_PW']) &&
      -		isset($_SERVER['HTTP_AUTHORIZATION']) &&
      -		preg_match('/^Basic (.*)$/', $_SERVER['HTTP_AUTHORIZATION'], $matches))
      -	{
      -
      -		// Basic-auth with $_SERVER['HTTP_AUTHORIZATION']
      +	// require valid user
      +	if ($auth_type == 'session'){
      +		if (!isset($_SESSION['login_user']) ) { // not login -> login page
      +			header("Location: " . get_script_uri() . "?plugin=login&referer=" . rawurlencode($page));
      +		}
      +		if ( !PKWK_READONLY && 
      +			in_array($_SESSION['login_user'], $user_list))
      +		{
      +			return TRUE; // Auth success
      +		}
      +	} else { // $auth_type == 'basic'
      +		$matches = array();
      +		if (! isset($_SERVER['PHP_AUTH_USER']) &&
      +			! isset($_SERVER ['PHP_AUTH_PW']) &&
      +			isset($_SERVER['HTTP_AUTHORIZATION']) &&
      +			preg_match('/^Basic (.*)$/', $_SERVER['HTTP_AUTHORIZATION'], $matches))
      +		{
      +       		// Basic-auth with $_SERVER['HTTP_AUTHORIZATION']
       		list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) =
       			explode(':', base64_decode($matches[1]));
      +		}
      +		if ( ! PKWK_READONLY &&
      +			isset($_SERVER['PHP_AUTH_USER']) &&
      +			in_array($_SERVER['PHP_AUTH_USER'], $user_list) &&
      +			isset($auth_users[$_SERVER['PHP_AUTH_USER']]) &&
      +			pkwk_hash_compute(
      +				$_SERVER['PHP_AUTH_PW'],
      +				$auth_users[$_SERVER['PHP_AUTH_USER']]
      +			) == $auth_users[$_SERVER['PHP_AUTH_USER']])
      +			return TRUE; // Auth success
       	}
       
      -	if (PKWK_READONLY ||
      -		! isset($_SERVER['PHP_AUTH_USER']) ||
      -		! in_array($_SERVER['PHP_AUTH_USER'], $user_list) ||
      -		! isset($auth_users[$_SERVER['PHP_AUTH_USER']]) ||
      -		pkwk_hash_compute(
      -			$_SERVER['PHP_AUTH_PW'],
      -			$auth_users[$_SERVER['PHP_AUTH_USER']]
      -			) !== $auth_users[$_SERVER['PHP_AUTH_USER']])
      -	{
      -		// Auth failed
      -		pkwk_common_headers();
      -		if ($auth_flag) {
      -			header('WWW-Authenticate: Basic realm="' . $_msg_auth . '"');
      -			header('HTTP/1.0 401 Unauthorized');
      -		}
      -		if ($exit_flag) {
      -			$body = $title = str_replace('$1',
      -				htmlspecialchars(strip_bracket($page)), $title_cannot);
      -			$page = str_replace('$1', make_search($page), $title_cannot);
      -			catbody($title, $page, $body);
      -			exit;
      -		}
      -		return FALSE;
      -	} else {
      -		return TRUE;
      +	// Auth failed
      +	pkwk_common_headers();
      +	if ($auth_flag && $auth_type !== 'session'){
      +		header('WWW-Authenticate: Basic realm="' . $_msg_auth . '"');
      +		header('HTTP/1.0 401 Unauthorized');
      +	}
      +	if ($exit_flag) {
      +		$body = $title = str_replace('$1',
      +			htmlspecialchars(strip_bracket($page)), $title_cannot);
      +		$page = str_replace('$1', make_search($page), $title_cannot);
      +		catbody($title, $page, $body . '....');
      +		exit;
       	}
      +	return FALSE;
       }
       ?>
      diff -urN pukiwiki-1.4.7_notb/plugin/login.inc.php pukiwiki-1.4.7_notb_login/plugin/login.inc.php
      --- pukiwiki-1.4.7_notb/plugin/login.inc.php	1970-01-01 09:00:00.000000000 +0900
      +++ pukiwiki-1.4.7_notb_login/plugin/login.inc.php	2007-05-11 16:02:18.000000000 +0900
      @@ -0,0 +1,117 @@
      +<?php
      +/////////////////////////////////////////////////
      +// login.inc.php
      +// 
      +// 2007/5/11	無駄な変数を除いて、分かりやすく変更. get_script_uri()を使用
      +//		htmlspecialcharsをつけた。
      +// 2007/5/9	オリジナル//
      +/////////////////////////////////////////////////
      +
      +
      +/* initialize 
      +function plugin_login_init()
      +{
      +}
      +*/
      +
      +function plugin_login_inline()
      +{
      +	if(isset($_SESSION['login_user'])){
      +		$msg = $_SESSION['login_user'];
      +	        $msg .= ' <a href="' . get_script_uri() . '?plugin=login">Logout</a>';
      +	} else {
      +	        $msg = '<a href="' . get_script_uri() . '?plugin=login">Login</a>';
      +	}
      +	return $msg;
      +}
      +
      +
      +function plugin_login_convert()
      +{
      +	if(isset($_SESSION['login_user'])){
      +		return _get_logout_form();
      +	} 
      +	return _get_login_form();
      +}
      +
      +function plugin_login_action()
      +{
      +	global $vars, $auth_users;
      +
      +	if($vars['pcmd']=='login')
      +	{
      +		if( isset($vars['pass']) 
      +			&& isset($vars['user'])
      +			&& isset($auth_users[$vars['user']])
      +			&& pkwk_hash_compute($vars['pass'], $auth_users[ $vars['user'] ]) == $auth_users[ $vars['user'] ])
      +		{
      +			// login success
      +			$_SESSION['login_user'] = $vars['user'];
      +	                header('Location: ' . get_script_uri() . '?' . rawurlencode( $vars['referer'] ) );
      +			return;
      +		}
      +		// login fail
      +		unset($_SESSION['login_user']);
      +		$body = "!!! LOGIN FAILED !!!" . _get_login_form();
      +	}
      +	else if($vars['pcmd']=='logout')
      +	{
      +		$body = '';
      +		if( isset($_SESSION['login_user'])) {
      +			$body = htmlspecialchars($_SESSION['login_user']) . " Logout.";
      +			unset($_SESSION['login_user']);
      +		}
      +		$body .= _get_login_form();
      +	}
      +	else
      +	{
      +		if (!isset($_SESSION['login_user']) ) {
      +			$body = _get_login_form();
      +		} else {
      +			$body = _get_logout_form();
      +		}
      +	}
      +	return array('msg' => 'login', 'body' => $body);
      +}
      +
      +function _get_login_form(){
      +	global $vars;
      +	$script = htmlspecialchars(get_script_uri());
      +	$s_referer= htmlspecialchars($vars['referer']);
      +	
      +	return <<<EOD
      +<div>
      +<form action="$script" method="post">
      +  <input type="hidden"   name="cmd"  value="login" />
      +  <input type="hidden"   name="pcmd" value="login" />
      +  <input type="hidden"   name="referer" value="$s_referer" />
      +   User Name<br /><input type="user"  name="user" size="12" /><br />
      +   Password<br /><input type="password" name="pass" size="12" /><br />
      +  <input type="submit" value="login" />
      +</form>
      +</div>
      +EOD;
      +}
      +
      +function _get_logout_form(){
      +	global $vars;
      +	$script = htmlspecialchars(get_script_uri());
      +	$s_referer= htmlspecialchars($vars['referer']);
      +	$user = $_SESSION['login_user'];
      +	
      +	return  <<<EOD
      +<div>
      +Current User : $user
      +
      +<form action="$script" method="post">
      +  <input type="hidden"   name="cmd"  value="login" />
      +  <input type="hidden"   name="pcmd" value="logout" />
      +  <input type="hidden"   name="referer" value="$s_referer" />
      +  <input type="submit"   value="logout" />
      +</form>
      +</div>
      +EOD;
      +}
      +
      +
      +?>
      diff -urN pukiwiki-1.4.7_notb/pukiwiki.ini.php pukiwiki-1.4.7_notb_login/pukiwiki.ini.php
      --- pukiwiki-1.4.7_notb/pukiwiki.ini.php	2006-06-11 23:35:39.000000000 +0900
      +++ pukiwiki-1.4.7_notb_login/pukiwiki.ini.php	2007-05-11 14:29:27.000000000 +0900
      @@ -241,6 +241,9 @@
       /////////////////////////////////////////////////
       // Authentication method
       
      +//$auth_type = 'basic'; // HTTP authentication (not available in PHP CGI version)
      +$auth_type = 'session';session_start();session_regenerate_id(TRUE); // PHP SESSION authentication (require login.inc.php plugin)
      +
       $auth_method_type	= 'pagename';	// By Page name
       //$auth_method_type	= 'contents';	// By Page contents
       
  • ↑のパッチの文字化けだけ、勝手に書き換えた -- 2011-04-17 (日) 16:49:37
  • ↑諦めておりました;; 大変有り難うございます。 いまから動作するのかインスコしてみたいとおもいます。 本当に感謝しますm(_ _)m ありがとうございます! -- 質問箱のものです? 2011-04-20 (水) 07:28:09
    • パッチを当てたんですが、File to patch: とでて指定するように出たんですが。わかりません;; 誰かわかる方いましたらご教授下さい・・。 -- 2011-04-20 (水) 09:36:45
    • パッチは勉強不足でさっぱりわかりませんでした。 上のソースコードのファイルを作成し、ソースの書き換えをしましたが、ページが真っ白になって動作しませんでした。 次のサイトで動作できましたので終了とさせて頂きます。 下記のサイト様ありがとうございます! 大変助かりました。 -- 2011-04-20 (水) 11:32:56
      • 俺の俺による俺のためのウィキ - http://wiki.wetcradle.com/index.php?pukiwiki%2F%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%2Flogin.inc.php

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-01-28 (水) 20:48:18
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u4. HTML convert time: 0.344 sec.

OSDN