0

ショートストーリー:

PHPスクリプトでopen_basedir制限が発生します。これは、単純な「新しいファイルをディスクに書き込むテスト」スクリプトです。open_basedirの設定が正しく、ファイルが正しい場所にあることがわかりましたが、運が悪かったので、毎回同じエラーが発生しました。このサイトで同様のopen_basedirの問題を検索しましたが、この問題については何も見ていません。ディレクトリは正しく見えますが、それでもエラーが発生します。

問題が何であるかについての私の推測:
1)open_basedirが思ったように機能しない
2)設定が間違っていて、表示されない
3)IISの読み取り/書き込みアクセス許可など、実際には別のものです。など
4)???

長い話:

PHPを使用してIISサーバーで作業しており、次のコードスニペットを機能させようとしています(単純な書き込みファイルテスト)。

date_default_timezone_set('America/Chicago');
$myFile = 'testfile.txt';
$fh = fopen($myFile, 'w') or die("can't open file");
$stringData = "Some Text\n";
fwrite($fh, $stringData);
$stringData = "Some More Text\n";
fwrite($fh, $stringData);
fclose($fh);

このphpスクリプトは、サーバーのC:\ inetpub \ wwwroot \ WEBDIRECTORY\test_write.phpにあります。

open_basedirのphp.ini設定は次のとおりです
。open_basedir=c:\ inetpub \ wwwroot; c:\ inetpub \ wwwroot \ WEBDIRECTORY

スクリプトのページを開くと、出力が表示されないことを期待しています。確認すると、サーバーに新しいファイルが書き込まれているはずです。これは私が代わりに得るものです:

警告:fopen():open_basedir制限が有効です。File(testfile.txt)が許可されたパス内にありません:(c:\ inetpub \ wwwroot)in C:\ inetpub \ wwwroot \ WEBDIRECTORY \ test_write.php on line 5警告:fopen(testfile.txt):failedストリームを開くには:5行目のC:\ inetpub \ wwwroot \ WEBDIRECTORY\test_write.phpで操作が許可されていませんファイルを開くことができません

私は多くの順列を試しました:元々open_basedir行は
open_basedir = c:\ inetpub\wwwrootでした

...しかし、それもうまくいきませんでした。

また、ファイル自体の名前だけでなく、testfile.txtの絶対パス(c:\ inetpub \ wwwroot \ WEBDIRECTORY \ testfile.txtなど)を入力しようとしましたが、同じエラーメッセージが表示され続けます。

何か案は?どうもありがとうございました。

4

2 に答える 2

1

さて、みんなの時間を無駄にしてすみません-それは私のシステム管理者が私のために設定したサーバー設定だったことがわかりました。(私はこれに慣れていないので、私が理解している一般的な用語で説明します)

彼は、.htm、.html、.php、.jpgなど、Webサイトで見つかると予想される特定のタイプを除いて、サーバーがWebディレクトリ内のファイルのアドレスを解決しないように設定しました。私が読み込もうとしたファイルは.txtでした。

それで、私はいくつかのテストコードを書きました:

$test = realpath('c:\inetpub\wwwroot\WEBDIRECTORY\testfile.php');
echo ("test = $test\n");
if($test == FALSE){
 echo ("... is FALSE\n");
}

$test = realpath('c:\inetpub\wwwroot\WEBDIRECTORY\testfile.txt');
echo ("test = $test\n");
if($test == FALSE){
 echo ("... is FALSE\n");
}

これはすぐにこれを返しました:

test = C:\ inetpub \ wwwroot \ WEBDIRECTORY \ testfile.php
test=...はFALSEです

したがって、realpathは、.txtで終わるもののアドレスを返すことを拒否していますが、.phpファイルの場合はそれを喜んで行います。これは、不正な拡張子で終わる他の正当な(basedir内の)ファイル名を入力すると、サーバーはそのアドレスを「C:\ inetpub \ wwwroot \ WEBDIRECTORY\testfile.txt」ではなく「」として解決することを意味します。そしてもちろん、空の文字列はbasedirに含まれず、open_basedir制限エラーが返されます。

BIZARRE!しかし、私がついにそれをそのソースにさかのぼったので、今では理にかなっています。すべてのヒントをありがとう!それは私が排除のプロセスを経てこれを理解するのを助けました。

于 2010-10-27T14:48:45.267 に答える
-1

権限の問題のようです。C:\ inetpub \ wwwroot \ WEBDIRECTORY \のアクセス許可を確認します。特別なアクセス許可が必要な場合は、書き込みを行う.PHPスクリプトのアクセス許可を変更する必要があります。通常、どちらか一方だけでなく、ディレクトリとスクリプトセットの両方が必要です。

これは、書き込み用にファイルを開くためのPHPマニュアルの優れたスクリプトです。

$ filename ='test.txt'; $ somecontent="これをファイルに追加\n";

//ファイルが存在し、最初に書き込み可能であることを確認しましょう。if(is_writable($ filename)){

// In our example we're opening $filename in append mode.
// The file pointer is at the bottom of the file hence
// that's where $somecontent will go when we fwrite() it.
if (!$handle = fopen($filename, 'a')) {
     echo "Cannot open file ($filename)";
     exit;
}

// Write $somecontent to our opened file.
if (fwrite($handle, $somecontent) === FALSE) {
    echo "Cannot write to file ($filename)";
    exit;
}

echo "Success, wrote ($somecontent) to file ($filename)";

fclose($handle);

} else{echo"ファイル$filenameは書き込み可能ではありません"; }

于 2010-10-25T20:41:12.517 に答える