2007-11-27 (火) 01:49:49
「PukiWiki/1.4/ちょっと便利に/任意のページごとの閲覧・編集制限/編集認証実装方法案」から変更。
PukiWiki/1.4/ちょっと便利に/任意のページごとの閲覧・編集制限にあるように、get_sourceやfileでgrepして、認証対応が必要と思われるプラグインが多数あるが、未だに対応出来ていない。PukiWikiユーザーは、上記ページやdevサイトを注意深く見ていなければ、未対応のプラグインがあることに気づかないため、pukiwiki.ini.phpで認証設定をして、保護されていると誤解してしまうおそれがある。
pukiwiki.ini.phpのauth関連の設定箇所に、「未対応のpluginがある。PukiWiki/1.4/ちょっと便利に/任意のページごとの閲覧・編集制限参照のこと」との注意書きコメントを追加する。(これは最低限必要では)
現状について、で書いたように、get_sourceやfileを使用しているプラグインが認証対応を求められる。それならget_sourceやfile(file_write)関数で制限をしてしまえば良いのでは。
基本的には各プラグインで対応するが、万一漏れていたら、get_sourceやfile_write関数で認証を行い、情報が漏れたり編集権限が漏れたりすることを防ぐ。
lib/file.phpのfunction file_write()で編集認証チェックをする。
function file_write($dir, $page, $str, $notimestamp = FALSE) { global $_msg_invalidiwn, $notify, $notify_diff_only, $notify_subject; global $whatsdeleted, $maxshow_deleted; + global $editable_flag; if (PKWK_READONLY) return; // Do nothing + if (defined('PKWK_SECURITY_READONLY')) return; // Do nothing + if (!$editable_flag && !check_editable($page, FALSE, FALSE)) { + die('file_write(): not editable'); + } if ($dir != DATA_DIR && $dir != DIFF_DIR) die('file_write(): Invalid directory');
とする。(注 $editable_flagのチェックはcheck_editableより先に行わなければならない。明示的にif文2つに分けた方がよいかな。)
明示的に編集認証を無視する場合には、
global $editable_flag; $editable_flag = TRUE;
を記載する。プラグイン「rename.inc.php」や「unfreeze.inc.php」の様に直接file_write()やpage_write()を呼び出しているプラグインではその前に記載必要。
#commentのように、(一部の人は)書き込み認証に関係なく書き込み可としているプラグインにはreturnの前に記載する。
die()の代わりにreturnとするのでも良いだろう。ただ、本来pluginで編集制限をかけるべきところが、処理が漏れている状態であるので、それが分かるようにdie()という案をあげた。
lib/file.phpのfunction get_source()で閲覧権限認証チェックする。
function get_source($page = NULL, $lock = TRUE, $join = FALSE) { + global $readable_flag; $result = $join ? '' : array(); if (is_page($page)) { + if (!$readable_flag && !check_readable($page, FALSE, FALSE)) { + die('get_source(): not readable'); + } $path = get_filename($page);
ないとは思うが、プラグイン等で閲覧認証を回避したい場合には
global $redable_flag; $redable_flag = TRUE;
とする。
die()部分については編集認証と同様でreturnとする案もある。
function convert_html($lines) { global $vars, $digest; static $contents_id = 0; --- // Set digest --- $digest = md5(join('', get_source($vars['page'])));