** 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}; - さくらインターネットを使ってるので入れてみました。 pukiwikiにアクセスをすると以下のようなエラーがでます。Headers already sent at /home/サイトのパス/lib/auth.php line 2 1.4.7_notbでIE6.0でこのようになりました。助言をお願いします>< -- &new{2008-01-13 (日) 05:55:58}; - まだここに書き込んでも大丈夫かな?&br;userauthと併用(閲覧制限無し、編集制限ありで運用)しているんですが、複数画像ファイルを添付するとそのページを表示後必ず勝手にログアウトします。(refで表示する回数を2箇所以上にすると発生するようです。同じ画像を2回表示しても現象起きずです。)&br;その後に編集ボタンをおしても認証を求めるので二度とそのページは編集できない状態になります。&br;単純に2つの画像をref使って連続で表示させその直後にloginと表示させるとユーザー名を表示できます。その後ページをリロードすると認証が外れている。ますます??です。&br;画像をURL直に指定する場合は何個でもOK。refプラグインの限界でしょうか? -- [[boo]] &new{2008-03-07 (金) 14:16:24}; - 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}; - 私もbooさんと同じ現象です。#ref()を2個以上使用すると2度と編集できなくなります。refプラグインをざっと見渡すと特に認証に関係ありそうな部分は見つからないようなのですが・・・・ -- [[ai]] &new{2008-04-26 (土) 14:54:35}; #comment