** login.inc.php [#v31d901f] |RIGHT:100|LEFT:360|c |~サマリ|PHPセッションを使った認証プラグイン(CGI版PHPでも実行可)| |~リビジョン|0.1| |~対応バージョン|1.4.7| |~投稿者|[[pikky]]| |~投稿日|&new{2007-05-10 (木) 00:46:03};| **概要 [#t6644bd0] -pukiwiki1.4.7の標準認証にsession(cookie)を使って認証できる機能をつけました。 -CGI版PHPでも認証が機能します(さくらインターネットで使っています) -認証が必要なページにアクセスすると自動的にログイン画面が表示されます。 -login.inc.phpというプラグインとauth.phpを変更して実装しています。 ***注意 [#r3e5d736] phpのsessionでは、cookieを使います。また、cookieが使えない場合は、URLにセッション情報が表示されます。いずれの場合も、ユーザ・パスワードが一致しなくても、認証された状態になってしまう危険性が指摘されています。このプラグインでは、とりあえず[[session_regenerate_id(TRUE)>PHP関数:session-regenerate-id]]を入れています。詳しくは、「PHP session 注意」などで検索下さい。 ''本当にみられたくない場合は、別フォルダにpukiwikiをインストールし、それぞれ[[.htaccess]]で管理する方が確実です。お互いにInterWikiで連携して'' login.inc.phpは以下のような場合には便利かもしれません。 -編集を許可するユーザをとりあえず指定したい。 -「[[userauth.php>自作プラグイン/userauth.php]]」などを使って、許可するユーザ・パスワードを頻回に変更したい。(userauth.phpと併用できます) **デモサイト [#v870aef6] -http://pw1.atcms.jp/pikky/ **インストール方法 [#ybeee52e] ***自分でファイルを更新する場合 [#a0128d8c] -login.inc.phpをpluginディレクトリに入れてください。 --[[plugin/login.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); ***パッチを使う場合 [#e4f3a9f2] 以下のパッチを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]] --セキュリティ関係:rawurlencode, htmlspecialcharsを追加。 --その他:get_script_uri()の使用。変数の整理など。 -login-20070510.patch --sessionに綴り間違いがあったので修正。session_regenerate_id(TRUE)にする。 -login-20070509.patch 初期バージョン **使い方 [#g28bc377] -まず、%%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プラグインのおまけ [#d17d57c0] -&login(); --現在のログインユーザ名が表示され、ログイン画面へのリンクが表示されます。 --MenuBarに入れておくと、ログイン画面か、現在のユーザ名が表示されるので便利です。 -#login --現在のログインユーザ名が表示され、ログイン画面またはログアウト画面が表示されます。 **説明 [#h018642b] -%%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 --実際にログイン、ログアウト画面を表示し、認証します。 **ライセンス [#s9c79512] GPLです。 **経緯 [#ffa8fc02] さくらインターネットで、ユーザ認証を行わなければならなったものの、うまくいかず。さんざんサイトを探して、CGI版PHPではBASIC認証ができないことが判明。かなり落胆・・・。 諦めきれず、pukiwikiでセッション管理をしているサイトがあるはずだと探していたら、以下のサイトで、セッションの使い方とpluginの作り方をみる。ありがとうございました。 -[[teanan.homeip.net>teanan:自作プラグイン/session.inc.php]] それで、pukiwiki1.4.7のauth.phpをみてみたら、認証している部分はbasic_authだけということに気づく。これならいけるじゃん!と改造を決意。basic_authを全部消して実装する。 やってみたらあっさり動いた。 PHPのセッションには問題があるが、「そんなに頑固なセキュリティじゃないけど、編集できないページも作れますよ」と説明できればよいぐらいの立場の人もいるに違いないと思いはじめる。また、たったこれだけの改造で動くようになった、pukiwikiとauth.phpのすばらしさに感謝して、公開することを決意。 元のauth.phpを復活させ、auth_typeで切り替えられるようにし、いくつかのサーバでインストールテスト。公開してみた。 **コメント [#o6575709] - 「[[userauth.php>自作プラグイン/userauth.php]]」と併用して使用したいのですが、どのように%%pukiwiki.inc.php%% pukiwiki.ini.phpを設定したらいいのでしょうか? -- [[サイババ]] &new{2007-05-10 (木) 12:40:51}; -- 「userauth.php」を使っているのであれば、pukiwiki.ini.phpには、以下の1行を入れるだけで動くと思います(後は、一緒でlib/auth.phpを上書きし、plugin/login.php.incを追加)。今、確認できないのですみません。-- [[pikky]] &new{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が抜けてました。 -- [[サイババ]] &new{2007-05-10 (木) 14:12:55}; -- ご報告ありがとうございます。動いてホッとしてます^o^。つづり間違い、ご連絡ありがとうございました。修正しました。-- [[pikky]] &new{2007-05-10 (木) 16:52:40}; - sessionでユーザー管理ですか。いいですね。CGI版PHPユーザーは待ち望んでいた機能ではないでしょうか。実装お疲れ様です。&br;細かい突っ込みですが、$scriptはglobalで取得せずにget_script_uri()で取得するのが推奨されています。 -- [[dev:プラグイン/開発者向け]]の補足情報参照。 -- plugin_login_inline()の方は、global宣言がないので空になってますね^^; -- [[ぃぉぃぉ]] &new{2007-05-10 (木) 18:36:41}; - お疲れ様です。Locationヘッダーの部分に rawurlencode($page)、プラグインのところにhtmlspecialchars($script)が要るでしょう。plugin_login_action()で NULL を特別な値として使われていますが、$var['user'] には空文字列をセットできるので、考え方としてはですが $pass!=NULL のようなチェックは怖いです。また、例えば GET によるアクセスを明示的に無視したいなら $post['user'] が使えます。rawurlencode($s_referer) は直前に htmlspecialchars() している様ですね。 -- [[henoheno]] &new{2007-05-11 (金) 00:13:28}; - ソース確認いただいてありがとうございます。ご指摘のあった部分を修正しました。 -- [[pikky]] &new{2007-05-11 (金) 14:44:27}; - 「define('PKWK_READONLY', 1);」の時に、「&login();」と「#login」を出力しないような仕様、または、スイッチを要望します。どうぞ、よろしくお願いします。 -- &new{2007-05-19 (土) 22:15:10}; --「define(PLUGIN_LOGIN_HIDE_LOGIN, 1);」をlogin.inc.phpにつけたいと思います。--[[pikky]] &new{2007-05-23 (水) 13:08:10}; - 全ページ読みはOkで編集だけユーザ認証を必要にする場合、$read_auth = 0;$edit_auth = 1;にして、各pagesの指定($edit_auth_pages = array( 以下の部分)を '##'にすると全ページ対象になるようですが、これで問題は無いでしょうか? -- [[作者に感謝!感謝!]] &new{2007-05-21 (月) 16:45:33}; --ありがとうございます。'#*#'がいいと思いますが、結果は同じですね。 --[[pikky]] &new{2007-05-23 (水) 13:08:10}; - Operaの9.20ではログイン出来ないようです。何か設定が間違っているのかな? -- &new{2007-05-22 (火) 08:56:36}; --後でoperaで試してみますが、クッキーがonになっているかどうか確認してみてください--[[pikky]] &new{2007-05-23 (水) 13:08:10}; -- クッキーはonになっています。Safariも動作が怪しい(編集の途中でセッションが切れる?)ので、IE&Sleipnirでログインしています。こちらは全く問題ないです。 -- [[ブラウザ対応について]] &new{2007-05-23 (水) 23:04:41}; -- すみませんpagesの指定で、一度 ' ' にしてしまって、そのままにしていたようです。''##'にするとOperaでも認証が通って全頁が編集対象になりました。IEと他のブラウザの挙動が違うのは不思議ですが。#*#'も試しましたが、全ページ編集の対象にならないようで、認証画面が出てきませんでした。 pikky さん、どうもお騒がせしました。 -- &new{2007-05-23 (水) 23:43:50}; - さくらに設置した1.4.7_notbに対してFirefox2.0.0.4で問題なくログインできました。編集時全ページを認証対象にするのに'#^.*#'で指定しています。ところで上の方で pukiwiki.inc.php と書かれてあるのは pukiwiki.ini.php のことですよね。 -- [[x-person]] &new{2007-06-19 (火) 18:17:40}; -- それでいいと思います。(そもそもpukiwiki.inc.phpは無いでしょうし)&br;老婆心ながら、「pukiwiki.inc.php」を「pukiwiki.ini.php」に取り消し線付きで書き換えておきました。(まるっと書き換えた方がよかったでしょうか?) -- &new{2007-11-29 (木) 10:03:20}; - [[欲しいプラグイン/286]]のものです。使わさせて頂きます。 -- [[^^]] &new{2007-07-09 (月) 08:05:48}; - 単語検索の時、文字を入力して検索しようとするとなぜか認証画面にいってしまいます。原因とかわかりますでしょうか?認証設定では検索の部分は特に記入してないのですが・・・ -- &new{2007-12-18 (火) 12:03:10}; -- ログインしていないときに、$auth_flag を無視して必ずログインさせようとしているからじゃないですか?本来なら、$auth_flag がfalse の時は今の状態を維持して、対象ページかどうかのチェックのみを行うはずなんですが・・・ -- &new{2009-03-04 (水) 18:23:39}; -- こう変えたらどうですか? -- &new{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でこのようになりました。助言をお願いします>< -- &new{2008-01-13 (日) 05:55:58}; -- auth.phpがクラックされてませんか? 先頭にSPAMが入ってるみたいだけど、これで正常? -- [[eddy]] &new{2008-03-14 (金) 15:08:36}; -- クラックされているのではなく、作者のGoogleAdSenseが挿入されているのでは?動作自体はそこをごっそり削っても問題ありませんよ。 -- [[a.c.]] &new{2008-03-14 (金) 16:19:56}; -- 失礼。アフィリエイトだったんですね。その部分を削除したらエラーが出なくなりました…。 -- [[eddy]] &new{2008-03-14 (金) 19:58:43}; -- 2008/1/13の方と同じ症状でしたが、これは「自分でファイルを更新する場合」に、auth.phpとlogin.phpをこのページからダウンロードすると、Amazonのタグなどがついてしまうのが原因です。テキストエディタで一行目の空行と、最後の?>以降を削除すればOKでした。 -- [[hk]] &new{2008-05-18 (日) 01:10:24}; - まだここに書き込んでも大丈夫かな?&br;userauthと併用(閲覧制限無し、編集制限ありで運用)しているんですが、複数画像ファイルを添付するとそのページを表示後必ず勝手にログアウトします。(refで表示する回数を2箇所以上にすると発生するようです。同じ画像を2回表示しても現象起きずです。)&br;その後に編集ボタンをおしても認証を求めるので二度とそのページは編集できない状態になります。&br;単純に2つの画像をref使って連続で表示させその直後にloginと表示させるとユーザー名を表示できます。その後ページをリロードすると認証が外れている。ますます??です。&br;画像をURL直に指定する場合は何個でもOK。refプラグインの限界でしょうか? -- [[boo]] &new{2008-03-07 (金) 14:16:24}; -- 私もbooさんと同じ現象です。#ref()を2個以上使用すると2度と編集できなくなります。refプラグインをざっと見渡すと特に認証に関係ありそうな部分は見つからないようなのですが・・・・ -- [[ai]] &new{2008-04-26 (土) 14:54:35}; -- 私も同じ現象です。 ref.inc.php の PLUGIN_REF_DIRECT_ACCESS を TRUE にし、attach/.htaccess を削除すると回避できるみたいです。 -- &new{2008-06-25 (水) 08:30:33}; -- pukiwiki.ini.phpのsession_regenerate_idの行をコメントアウトにするか引数をFALSEにすればrefプラグインを連続で呼出してもセッション情報は引き継がれました。TRUEの場合refプラグインで連続的にリクエストがあった場合セッションファイルが空になっていました。但しコメントアウトにした場合セッションIDが引き継がれるしFALSEにした場合大量にセッションファイルが作成されます。ローカルな環境だとコメントアウトでも良いような気がします。 -- [[aki]] &new{2009-03-04 (水) 13:09:04}; --- それは[[自作プラグイン/login.inc.php#説明>自作プラグイン/login.inc.php#h018642b]]にある通り、標準のHTTP認証ではないですか? -- &new{2009-03-04 (水) 17:39:25}; --- あ、ここの説明だと1行で全部書かれていますね。私の使っているヴァージョンだと3行で記述されていたのでsession_regenerate_id(TRUE);のみって意味で$auth_type = 'session'; session_start();はそのまま残しています。 -- [[aki]] &new{2009-03-05 (木) 09:48:35}; -- [[自作プラグイン/imgfolder.inc.php]] を ref の代わりに使ってみたら、問題は回避できました。 -- &new{2009-11-02 (月) 04:27:08}; --- あと、編集できなくなったページは、ls2_1 などで使って表示される URL をコピーして、URLの read の部分を edit に変えると、とりあえず編集できるようにはなりました。 -- &new{2009-11-02 (月) 10:33:55}; - 動作環境:win2003srv,iis [編集の認証]ログイン画面でIDとPWを入力しログインすると編集の枠が現れません。間違ったIDとPWではログイン画面に戻ります。助言お願いします。。。 -- [[masaci]] &new{2008-08-14 (木) 18:28:38}; -- 私も上記の方と同じ症状で,編集を押してログイン画面が出てきてID/PWを入力してログインすると元のページに戻されます.新規ページの作成ではID/PWを入力後は編集ページに移り,ページの作成をすることができますが,その後編集できなくなります.助言をお願いしますorz -- [[ff]] &new{2008-10-05 (日) 18:45:59}; -- ログイン後は、閲覧用のURL にリダイレクトするようになっているから、改造しないと無理。 -- &new{2009-03-04 (水) 18:23:39}; - 久しぶりに書き込みます。&br;本プラグインでかなり楽をさせていただいてます。ありがとうございます。&br;本格運用に入って久しいのですが、閲覧ユーザーなども含め、「ID/PWを覚えてほしい」(クッキーのことか?)という声が多く聞こえてくるようになりました。&br;このプラグインでクッキーを利用してアクセスを簡便化することはできませんでしょうか? -- [[boo]] &new{2008-10-10 (金) 12:55:47}; -- Firefoxだと覚えるかどうかの選択肢が出たような。ブラウザ依存? -- &new{2008-10-10 (金) 13:11:10}; -- 自己レスです。&br;PHP初心者ですが、他のソースなど参考にクッキー書き込むようにしました。&br;何とか希望の動きになっているようです。当方はuser_authも使っているので「ここをこうすれば大丈夫」って話を的確にすることはできませんが、pukiwiki.ini.phpに数行、login本体にも数行の追加でなんとか動作しています。&br;お騒がせいたしました。 -- [[boo]] &new{2008-10-14 (火) 14:27:40}; - 編集ページ(アドレスにcmd=edit)があるページへのアクセス時のみログイン画面が出るようにしたいのですが。不可能でしょうか? -- [[taka]] &new{2008-11-29 (土) 01:44:15}; -- edit_authのみ有効にすればいけるんじゃないでしょうか? -- &new{2008-11-30 (日) 09:33:02}; -- edit_authのみ有効にしているのですが、なぜか編集制限のかかっているページの閲覧時にログイン画面が出てしまうんです。 -- [[taka]] &new{2008-11-30 (日) 18:56:42}; - 無事に設置できました。ところで、1度ログオンしてから画面操作をせずしばらく(1時間程度?)経過すると、認証済みのページに移動しても再度ログオンを要求されます。できればブラウザを閉じるまではログオン状態を保持したいのですが、これはプラグイン側の設定で回避できるのでしょうか。 -- &new{2008-12-19 (金) 02:07:19}; - 1.4.7_notb@さくら でFirefox3.0.6で問題なく動作しました。ありがとうございます! -- [[とかげ]] &new{2009-02-13 (金) 00:42:15}; - ありがとうございます。助かりました。 -- [[kuma]] &new{2009-05-09 (土) 19:48:23}; - 利用したいと考えているのですが、どこからダウンロードすればいいのでしょうか? -- [[SAKURA]] &new{2009-07-06 (月) 01:43:36}; -- 上の''[[インストール方法>#ybeee52e]]''からダウンロードできますよ。 -- &new{2009-07-06 (月) 08:56:34}; - ありがとうございます。パッチをダウンロードして設定しました。認証画面に行くのですが、pukiwiki.ini.phpで設定したパスワードを認証してくれないところでつまずいています -- [[SAKURA]] &new{2009-07-07 (火) 14:01:24}; #comment