- 締切済み
PHPがセーフモードの時のセッションについて
PHPがセーフモードであるレンタルサーバーに、自作したPHPスクリプトをアップロード後実行してみました。 そのスクリプトはセッションでログイン管理をしているのですが Warning: session_start() [function.session-start]: SAFE MODE Restriction in effect.The script whose uid is 1046 is not allowed to access /var/tmp/ owned by uid 0... Fatal error: session_start() [<a href='function.session-start'>function.session-start</a>]: Failed to initialize storage module: files (path: )... というエラーが出てしまいます。 マニュアルのセーフモードで制限される関数の説明に “デフォルトの files session.save_handler を使う場合は、スクリプトのオーナーが session.save_path ディレクトリのオーナーと同じでなければなりません。” という説明があったので、session.save_pathをスクリプト内のディレクトリ(FTPから新しく作成)に変更してみたところ上記エラーは消え、 CookieにPHPSESSIDが保存されていました。が、ログインが出来ません。 試しにセッションでログイン管理をしている自作ではないスクリプトを設置してみたのですが、これもログインが出来ませんでした。 細かいところは違うんですが、どちらもセッションに保存されたパスワードをチェックしてログイン状態を判別しています。 なので、セッションに値が保存されない(書き込みできない?)という状態なのだと思うんですが、よくわかりません。 session.save_pathを変更するだけではダメなんでしょうか? 原因・解決策のほかに、セーフモードにひっかからない組み方というか、セーフモード対策のようなものがあれば教えて頂きたいです。よろしくお願いします。 ※そのサーバーはphp5スクリプトはcgiモードとして扱われます。 ※.htaccessは次のようになっています(コントロールパネルで作成されたもの) Options +ExecCGI AddHandler cgi-script .cgi .pl AddHandler x-httpd-php5 .php SuPHP_ConfigPath /usr/home/hogehoge/scriptname
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- hogehoge78
- ベストアンサー率80% (433/539)
一度、認証関連をとっぱらった、素のセッション遷移を作ってみて、実際に動作するか否かをチェックしてみてはいかがでしょうか。 PHPのデフォルトの動作は、session.save_pathに指定したディレクトリに、「sess_{セッションID}」というようなファイルを作成し、そこに配列をシリアライズした値を挿入する、という動作なので、 session_startして、アクセスしている最中に、FTPで接続し、そのディレクトリに上記のようなファイルが作成されているか確認してみてはいかがでしょうか。 COOKIEにセッションIDが送信されているのであれば、sessionはスタートできていると思います。単純にサーバ側に残す必要のあるファイルが作成されていないような感じでしょうか。
- hogehoge78
- ベストアンサー率80% (433/539)
セーフモードですと、ファイルの作成が行えないために、session_set_save_handlerで設定した、ディレクトリにファイルが生成できていないのではないでしょうか。 PHPをCGIモードで動かしてみたら対処できませんか? AddHandler application/x-httpd-phpcgi .php とかで。ご利用のサーバによっては使用できないし、CGIモードで動かすので動作も遅くなりますが。 後は、いっそのこと、session_set_save_handlerでセッションの読み書きをデータベースに任せるというのも良いのではないでしょうか。
補足
御回答有難うございます。 phpinfoを見ると、Server API:CGI/FastCGIとなっているので CGIモードであることは確かです。 セッションからクッキーにして、簡略化したものを作って試してみたところ、 クッキー版でもログインが出来ませんでした。 パーミッションも色々試したんですが全滅…。 以下がそのテストソースです。 ○test1.php <?php define("PASSWORD", "pass"); //POSTされた文字列を確認 function checkPass($str) { if(md5(PASSWORD) === md5($str)){ return true; }else{ return false; } } //セッション function setAdminSession() { setcookie("TEST_A", md5(PASSWORD)); } if(isset($_POST["action"])&&$_POST["action"]==="login"){ if(checkPass($_POST["password"])===true){ setAdminSession(); header("Location:test2.php"); }else{ message(); } } ?> <?php if ( ! get_cfg_var('safe_mode') ) { print "セーフモード OFF"; print " (".PHP_VERSION.")"; }else{ print "セーフモード ON"; print " (".PHP_VERSION.")"; } function message(){ print "パスワードが違います"; } ?> <form action="" method="post"><input name="password" type="text" value="pass" /><input name="action" type="submit" value="login" /></form> ○test2.php <?php define("PASSWORD", "pass"); if(isLogin()){ print "Login success<br>"; var_dump($_COOKIE["TEST_B"]); }else{ print "Login false"; } //ログイン状態確認 function isLogin() { if(isset($_COOKIE["TEST_A"]) && $_COOKIE["TEST_A"] != null && md5(PASSWORD) === $_COOKIE["TEST_A"]){ return true; } } ?> ローカル(xampp)とセーフモードではないサーバーでは動いています。 ファイルアップロードでも躓きそうなので、サーバー移る方が手っ取り早い気がしてきました…
お礼
その後色々と試してみたのですが、サーバー変更という形で解決させる事になりました。 セッションファイルは作成されているのを確認できた事もあれば出来なかったこともあったりして、結局具体的な原因はよくわかりませんでした。 セーフモードの件はまた時間があるときに確認したいと思います。 ご回答ありがとうございました。