設定項目: safemodehack
この設定項目は、DokuWiki が作成したディレクトリに DokuWiki 自身が書き込めないというバグ 179 を解決するためのものです。サーバに FTP でログインしてディレクトリを作成することによってこの問題を解決します。サーバに PHP 拡張モジュールの FTP 関数がインストールされている必要があります。
- 型: 真偽値
- デフォルト値:
0
設定項目名からもわかるようにこの設定はハックであり、お勧めするものではありません。セーフモード自体は PHP の開発者でさえ嫌っており、将来の PHP バージョンから削除されることになっています。
もし可能であれば、このセーフモード対策を使用するのではなく PHP の設定でセーフモードを無効にするようにしてください。ホスティング業者やプロバイダなどにきちんとお願いすれば、あなたのサイトのセーフモード設定を無効にしてくれる場合があります。
この対策を使うケース
このセーフモード対策は、サーバで PHP のファイルシステム関数 (例えば mkdir など) の使用が制限されるような厳しめの設定がされている場合に使用します。具体的には以下のような設定になっている場合です。
- safe_mode = On
- safe_mode_gid = Off
セーフモード対策の必要性をはかる一番の目安は、以下のようなエラーメッセージが出力されるかどうかを見ることです。
Writing ....../data/cache/9/9243162ecf6295fc6a1c487ca46c20fe.i failed
上記のメッセージが出る場合、この …./data/cache/9/
というディレクトリはおそらく存在しますが1)、DokuWiki からはこのディレクトリに書き込めない状態だと思います。これはセーフモードの制限に引っ掛かった場合の典型的な症状です。セーフモード下では、DokuWiki は DokuWiki 自身が作成したディレクトリに書き込めないのです。
設定方法
セーフモード対策を有効にするには、設定ファイルで safemodehack
に 1
を設定し、さらに FTP の認証情報を設定します (すなわち conf/local.php
ファイルを直接編集、もしくは DokuWiki の設定を変更するためのインタフェースを提供するサイト設定用プラグインを使用して設定を行います)。
すべてがうまく動作するよう、もし safemodehack
を有効にしていない状態の DokuWiki に対して事前にアクセスしていた場合は、ディレクトリを正しい UID で再作成させるために data/cache
以下のファイルとディレクトリを削除しなければなりません。
以下に設定例を示します。
$conf['safemodehack'] = 1; $conf['ftp']['host'] = 'localhost'; $conf['ftp']['port'] = '21'; $conf['ftp']['user'] = 'user'; $conf['ftp']['pass'] = 'password'; // プレーンテキスト (※下記「セキュリティ警告」を参照) $conf['ftp']['root'] = '/home/user';
また、新規作成したディレクトリ内に Web サーバソフトウェアから書き込めるよう、ディレクトリのパーミッションを緩和させる必要があるかもしれません。FTP でログインしたユーザの UID は Web サーバソフトウェアとは異なるため、safemodehack
の設定だけではこの問題を解決できません。おそらく設定項目の dmode を 0755
から 0777
へと変更する必要があります。
セキュリティ警告
このセーフモード対策を使用する場合は、FTP のパスワードが DokuWiki の設定ファイルにプレーンテキストで保存されている必要があります。この設定ファイルは、おそらくサーバ上の誰からでも読めてしまいます。
rc2009-01-26 からはパスワードが難読化2)されるようになりました。サイト設定用プラグインでパスワードを設定すると自動的に難読化されます。
root オプションの設定
セーフモード対策を行っている DokuWiki でディレクトリを作成する際は、作成するディレクトリの絶対パスの先頭から root オプションで指定された文字列を除去したパスを FTP 経由で作成します。この動作のため、FTP サーバの情報が必要となります。
DokuWiki を /home/user/htdocs/dokuwiki
にインストールしてデータディレクトリが /home/user/htdocs/dokuwiki/data
である場合を考えましょう。FTP でログインすると chroot によってルートディレクトリの変更が行われ、/home/user
が FTP 上のルートディレクトリとなります。これはつまり FTP 経由で /foo
というディレクトリを作成すると、実際にはサーバ上に /home/user/foo
というディレクトリが作成されるということです。このことを DokuWiki に伝えるため、$conf['ftp']['root']
には /home/user
を設定する必要があります。
このように、もし DokuWiki が /home/user/htdocs/dokuwiki/data/mynamespace
というディレクトリを作成をする場合は、セーフモード対策によってルート部分が取り除かれた htdos/dokuwiki/data/mynamespace
というディレクトリが FTP 経由で作成されることになります。
もし FTP サーバが chroot を使用していない場合 (FTP 経由でサーバ自身のルートディレクトリまで cd できてしまう場合) は、root オプションを空のままにしておいてください。
FTP でアクセスした際のルートディレクトリが Web サーバ上のどこに変更されているのかを調べるには、まず DokuWiki がインストールされているディレクトリの絶対パスを調べなければなりません。たいていは /srv/www/htdocs/your-ftp-username/html/dokuwiki
のような場所ですが、絶対パスは以下のスクリプトで PHP の環境変数を確認することでわかります。
<?php phpinfo(); ?>
Web サーバの PHP の設定がブラウザに表示されますので、絶対パスの情報もわかることと思います。絶対パスが確認できたら FTP アカウントでサーバにログインして、ディレクトリ内のファイルとこのパスの内容を比較します。これ以上行けなくなるまで上のディレクトリに移動してから、見えているのが絶対パスのどの部分に当たるのかを確認してください。もし chroot によってルートディレクトリが変更されている場合は、おそらく html
ディレクトリしか見えないものと思います。
このように、もし仮に Web サーバ上でのユーザ名が web123
でルートディレクトリが chroot によって /srv/www/htdocs/web123
に変更されている場合は、root オプションの値を以下のように設定しなければなりません。
$conf['ftp']['root'] = '/srv/www/htdocs/web123';
メモ
(訳注: 汎用性がありそうな部分しか訳出していません)
- セーフモードが有効であっても、CGI モードで動作している場合はこのセーフモード対策が不要の場合があります。
data/cache
ディレクトリで"mkdir 1 2 3 4 5 6 7 8 9 0 a b c d e f"
コマンドでディレクトリを作成してそれぞれパーミッションをchmod
コマンドで777
に変更してみました。これでも対処になっているように見えますが、どうなのでしょうか。- これは完全な対処にはなっていません。DokuWiki は名前空間を作成する際にもディレクトリを作成するからです。上記の対処だけでは、新規の名前空間を作成することができません。
- もし新規に名前空間を作成する必要が無いのであれば、これは対処になります。
- セーフモード対策は、そのサーバで FTP サービスが提供されている場合しか動作しません。