DokuWiki

It's better when it's simple

ユーザ用ツール

サイト用ツール


ja:config:safemodehack

設定項目: safemodehack

この設定項目は、DokuWiki が作成したディレクトリに DokuWiki 自身が書き込めないというバグ 179 を解決するためのものです。サーバに FTP でログインしてディレクトリを作成することによってこの問題を解決します。サーバに PHP 拡張モジュールの FTP 関数がインストールされている必要があります。

  • 型: 真偽値
  • デフォルト値: 0

設定項目名からもわかるようにこの設定はハックであり、お勧めするものではありません。セーフモード自体は PHP の開発者でさえ嫌っており、将来の PHP バージョンから削除されることになっています。

もし可能であれば、このセーフモード対策を使用するのではなく PHP の設定でセーフモードを無効にするようにしてください。ホスティング業者やプロバイダなどにきちんとお願いすれば、あなたのサイトのセーフモード設定を無効にしてくれる場合があります。

この対策を使うケース

このセーフモード対策は、サーバで PHP のファイルシステム関数 (例えば mkdir など) の使用が制限されるような厳しめの設定がされている場合に使用します。具体的には以下のような設定になっている場合です。

  1. safe_mode = On
  2. safe_mode_gid = Off

セーフモード対策の必要性をはかる一番の目安は、以下のようなエラーメッセージが出力されるかどうかを見ることです。

Writing ....../data/cache/9/9243162ecf6295fc6a1c487ca46c20fe.i failed

上記のメッセージが出る場合、この …./data/cache/9/ というディレクトリはおそらく存在しますが1)、DokuWiki からはこのディレクトリに書き込めない状態だと思います。これはセーフモードの制限に引っ掛かった場合の典型的な症状です。セーフモード下では、DokuWiki は DokuWiki 自身が作成したディレクトリに書き込めないのです。

設定方法

セーフモード対策を有効にするには、設定ファイルで safemodehack1 を設定し、さらに 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 の設定だけではこの問題を解決できません。おそらく設定項目の dmode0755 から 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/userFTP 上のルートディレクトリとなります。これはつまり 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 は名前空間を作成する際にもディレクトリを作成するからです。上記の対処だけでは、新規の名前空間を作成することができません。
    • もし新規に名前空間を作成する必要が無いのであれば、これは対処になります。
  • このセーフモード対策を行っていても、PHP で関数の使用禁止が設定されていた場合3)、DokuWiki がうまく出力できない可能性があります。
  • セーフモード対策は、そのサーバで FTP サービスが提供されている場合しか動作しません。

関連項目

1)
念のため確認してください。もしこのディレクトリが存在しない場合は、別の問題を抱えているということです。
2)
生のパスワードの露出を単純に防ぐためのものであり、セキュリティを高めるためのものではありません。
3)
phpinfo の出力の disable_functionsで確認できます。
ja/config/safemodehack.txt · 最終更新: by kazmiya

特に明示されていない限り、本Wikiの内容は次のライセンスに従います: CC Attribution-Share Alike 4.0 International
CC Attribution-Share Alike 4.0 International Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki