PKWK_SAFE_MODE (セーフモード)†
- ページ: BugTrack
- 投稿者: henoheno
- 優先順位: 普通
- 状態: 着手
- カテゴリー: 本体新機能
- 投稿日: 2005-01-28 (金) 21:55:33
- バージョン:
メッセージ†
もはや利用されていない機能、常時有効にする必要がない機能、その他安全ではないと思われる機能などをまとめて無効にする設定を用意します。
逆に言えば、この設定が施されている箇所は潜在的な問題を抱えているとみなされており、将来的に停止・禁止・削除される可能性があります。
有効・無効の切り替え†
定数 PKWK_SAFE_MODE の値を 1 (またはTRUEと解釈できる値) と定義する事により、それ以降のコードが振る舞いを変えます。
define('PKWK_SAFE_MODE', 1);
管理者の便宜を図るため、index.php には以下の行が用意されており、コメントを外すだけで有効になります。
//define('PKWK_SAFE_MODE', 1);
この機構の安全性は、PHP言語における定数の性質(※後から変更する事ができない)、およびファイルシステムの権限(※管理者にしか編集できないファイルを用意できる)によって実現されています。少なくとも第三者からの入力を受けつける前に実施すべきです。
影響を受けるもの: 1.4.5†
(今後も適宜追加されます)
backプラグイン†
- PKWK_SAFE_MODE will prohibit relative / site abusolute 'back' link
もはや利用されていないInterWiki関係の機能†
- cvs:plugin/interwiki.inc.php (1.10)
- PKWK_SAFE_MODE prohibits interwiki redirection plugin
- interwiki (action) プラグインはもはやページ表示に組み込まれておらず、潜在的な危険性を持っているため、現状は設定により無効にできる様にしました。近い将来に削除するでしょう。
- readプラグイン: InterWiki を評価しない
意図しないソースの漏洩†
... といってもbackupからソースが得られますけどね。
意図しないシグネチャなどの漏洩†
- cvs:plugin/versionlist.inc.php (1.14)
- $Id キーワードを含んでいるファイルのリビジョン番号が一覧されるため、最新でないファイルを使い続けている可能性があるかどうかを調べることができる
- ($Id キーワードを含んでいるかどうかにかかわらず) 条件に合うファイルが一覧されるため、スキャンするディレクトリに、別の目的のファイルがあった場合にそれが解る
- 危険な例1: phpinfo() 関数が仕掛けられているphpプログラム (削除し忘れたか無用心なために残されているもの)
- 危険な例2: 何らかの制限を解除した index.php のコピー (ただし無用心なことにアクセス制限をかけていない)
- 危険な例3: どのような追加pluginやcssやJavaScriptが用意されているかを調べた上で、それを悪用できないか調査する
常時稼動させておく必要がないものの無効化†
- cvs:plugin/md5.inc.php (1.7): PKWK_SAFE_MODE || PKWK_READONLY prohibit this
- 通信経路が保護されていることが保証できない以上、PukiWikiを「安定して利用できるMD5計算機」として使わせるのは脆弱すぎます。そのような利用も許すべきではありません。
影響を受けるもの: 1.4.6†
backupプラグイン†
- cvs:plugin/backup.inc.php (1.21): Added a define PLUGIN_BACKUP_DISABLE_BACKUP_RENDERING. Default: PKWK_SAFE_MODE || PKWK_OPTIMISE
- バックアップデータ(過去のテキスト)をレンダリングする機能を無効にします。
- 過去のWiki SPAM、その他の攻撃要素を容易に再生する事ができます。また、そのページに記述されていたプラグインによっては副作用をもたらします。
- 無作法なWebスパイダーがこのリンクを辿るだけでもこの機能が実行されてしまいます。レンダリング処理は比較的重たいものであり、データ量も多いため、負荷および転送量を増大させる原因になります。バックアップされた世代数が多ければ多いほど、この負担は増大します。また、そのページ(の、それぞれのバージョン)に記述されていたプラグインによっては副作用をもたらします。
- 特に前者の理由により PKWK_SAFE_MODE の影響下に、後者の理由により PKWK_OPTIMISE の影響下に置きます。
コメント†
- md5はofficial:自作プラグイン/config.inc.phpでやっているような、JavaScriptで計算するものに置き換えてはどうでしょうか? -- teanan
- お疲れ様です。そこまで用意するなら、JavaScript版md5計算機を仕込んだ静的なHTMLファイルでも同梱して、md5プラグインを抹殺できるじゃないですか ;) ネットワークを経由させる危険を冒させる必要ないですから。でも JavaScriptをOnにすること自体を推奨する必要もないので、結局単独の機能としては向いていないと思います。-- henoheno
コメント: 有効か無効かを判別できるか†
- 定数PKWK_SAFE_MODEをデフォルトで有効にしたほうが良いのではないでしょうか?
実際自分はpukiwiki.ini.phpの設定箇所に0/1どちらが有効化の記述がなかったので、全く気にしていませんでした。デフォルト有効だと思ってました。(hirokasaさんが自分のサイトにご訪問下さって、指摘してくれたので気づきました^^;)
その前後の定数も、0/1どちらが有効か漏れてるのがありますね。別でBugTrackおこしましょうか?起こさなくても何かのついでにでも治しておいて頂けるならやめときますが。 -- ぃぉぃぉ
- コメントありがとうございます。全て '0' で定義されており「有効かどうか解らない」という事は無いと思うので、どう誤解されたかを教えて下さい。 -- henoheno
- デフォルトで有効だろうと思いました。怪しいなとはおもいつつも、有効になったかどうかを確認する方法も知らず、特に調べませんでした。情報がコメントの
-PKWK_SAFE_MODE - Prohibits some unsafe(but compatible) functions
だけでしたので。 -- ぃぉぃぉ
- 相応しいページが他にあるかもしれませんが: 有効ないし無効の二択を尋ねている設定項目はいずれも、0 = OFF(無効), 1 = ON(有効) です。PKWK_SAFE_MODE の値が1ならば(PHPにとってTRUEと見なせる値ならば)、意図している仕掛けが働く事が期待できます。 -- henoheno
- 「有効/無効」を 「1/0」 と書かせるべきか、それとも 「TRUE/FALSE」 と書かせるかべきか: 全て 1/0 で統一させてもらっています。TRUE/FALSEに統一してしまうと、
シフトキーを含めた余計なタイプの手間と、スペリング*1を間違える余地を与えてしまいます。また論理的な意味を度々反転させたくなった時にとても面倒です。後者で統一するシステムは洗練されていないでしょうデザインは実用面で余計なコストを与えてしまうでしょう。 -- henoheno
- phpにおいてTRUE/FALSEはcase-insensitiveなキーワードのため、シフトキー云々は関係ないようですね。また、タイプミスで「FALSE」のつもりで「FASLE」と書くと論理の意味が反転するのが危険であれば、「0」のつもりで「O」や「0」と書いても論理が反転するのであまり説得力はないような気がします。洗練と書くと逆の主張する人も多いので危険では。単に「全て 1/0 で統一させてもらっています」というルールだけで十分な説得力があるかと思います --
- コメントありがとうございます。TRUE/FALSEが大文字でなければならないかのような主張についてはご指摘の通り私の思い込みでした。訂正させて下さい。しかし「0/1で統一する」点に根拠が不要だとは思いません。なお全角文字についてはTRUE/FALSEを含めどの場合でも問題になりますから、今回の話題の中には入らない様です。 -- henoheno
- いくつかの設定で _DISABLE_ という語句の入ったものがあります。この設定は言葉の通り _無効にするかどうか_ を尋ねているので、 1ならば(TRUEと見なせるならば) 意図している仕掛けが働く事が期待できます。つまり別の仕掛けが無効になります。 -- henoheno
- どのような基準で _DISABLE_ とすべきか: PHPは、"未定義の定数" を "クォートが忘れられている、そのような文字列" であると解釈します*2。その場合、"その文字列" は中身があるので、TRUEなのかFALSEなのかという文脈では必ずTRUEと解釈されます。危険な機能については意味を逆転させて _DISABLE_ としておかないと、管理者がうっかりその定数を定義し忘れたり、設定行を消してしまった時に、被害を助長する結果をもたらします。 -- henoheno
コメント: デフォルトの状態†
- 同梱されているINSTALL.txt*3には「インターネットに公開するPukiWikiであるならば、PKWK_SAFE_MODE を有効にすることをお薦めします。」との記述があります。しかしユーザー側ではあまり周知されていないようですね。
私はdefine('PKWK_SAFE_MODE', 1);がデフォルトの方が良いと思います。 -- hirokasa
コメント†
- 同梱されているINSTALL.txtには「インターネットに公開するPukiWikiであるならば、PKWK_SAFE_MODE を有効にすることをお薦めします。(詳細:BugTrack/787)」との記述があります。しかしPKWK_SAFE_MODEを有効にするためにはどうしたらいいのかついての説明はこのページのどこにあるのでしょうか。INSTALL.txtから誘導しているにしてはあまりにわかりにくいと思います。またこのBugTrackのページはPukiWikiのofficialページからはDeveloperのリンクをたどった先にあるということ自体、知っている人にしかわかりません。 --
- コメントありがとうございます。上の方に簡単に書いてみましたが、このようなイメージでよろしいのでしょうか。未完ですが、今後のバージョン向けの詳細な説明は cvs:doc にあります。 -- henoheno