2011-12-27 6 views
9

私はここで本当の頭を悩ませる人がいます。PHPはそれ自身のアップロードされたテンポラリファイルを承認しません。

これは私のシステム構成である:

:FastCGIモジュールとしてインストール

  • のWindows Server 2008 R2
  • PHP 5.3.8
  • は7.5

これは私の問題ですが、IIS

私は単純なファイルアップロードフォームを持っています。わかっているように、PHPがファイルのアップロードを受け付けると、そのファイルは一時的な名前が付けられ、処理される前に一時ディレクトリに置かれます。私の場合、PHPはファイルを一時ディレクトリ(E:\ Inetpub_IIS \ wwwrootの横にあるE:\ Inetpub_IIS \ tmp)に配置しますが、ガベージコレクタが表示されるまでファイルが存在することをすぐに「忘れてしまいます。一時ファイルを削除します。具体的には、一時ファイルはサーバーの一時ディレクトリに作成されますが、そのファイルのsha1_file()を呼び出すと、この関数は何も返しません。 file_exists()も失敗します。これはPHPがファイルを見つけることができないと私に思い出させます。以下のProcMonログは、PHPが適切な場所にあることを示しています。ここで

は私procmonのログです:

2:43:14.9175650 PM php-cgi.exe 5020 CreateFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Desired Access: Generic Read, Disposition: Create, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: None, AllocationSize: 0, Impersonating: NT AUTHORITY\IUSR, OpenResult: Created 
2:43:14.9182596 PM php-cgi.exe 5020 CloseFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS 
2:43:14.9184424 PM php-cgi.exe 5020 QueryOpen E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS CreationTime: 12/27/2011 2:43:14 PM, LastAccessTime: 12/27/2011 2:43:14 PM, LastWriteTime: 12/27/2011 2:43:14 PM, ChangeTime: 12/27/2011 2:43:14 PM, AllocationSize: 0, EndOfFile: 0, FileAttributes: A 
2:43:14.9185907 PM php-cgi.exe 5020 CreateFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Desired Access: Write Attributes, Synchronize, Disposition: Open, Options: Synchronous IO Non-Alert, Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, Impersonating: NT AUTHORITY\IUSR, OpenResult: Opened 
2:43:14.9187896 PM php-cgi.exe 5020 SetBasicInformationFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS CreationTime: 0, LastAccessTime: 0, LastWriteTime: 0, ChangeTime: 0, FileAttributes: AN 
2:43:14.9188368 PM php-cgi.exe 5020 CloseFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS 
2:43:14.9190234 PM php-cgi.exe 5020 CreateFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Desired Access: Generic Read/Write, Disposition: OverwriteIf, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: Read, Write, AllocationSize: 0, Impersonating: NT AUTHORITY\IUSR, OpenResult: Overwritten 
2:43:14.9193771 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 0, Length: 5,119, Priority: Normal 
2:43:14.9489663 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 5,119, Length: 5,119, Priority: Normal 
2:43:14.9730524 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 10,238, Length: 5,119 
2:43:15.0054693 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 15,357, Length: 5,119, Priority: Normal 
2:43:15.0309328 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 20,476, Length: 5,119 
2:43:15.0633978 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 25,595, Length: 5,119 
2:43:15.0879028 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 30,714, Length: 5,119, Priority: Normal 
... 
2:43:17.1849721 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 383,925, Length: 5,119 
2:43:17.1851664 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 389,044, Length: 2,343 
2:43:17.1852283 PM php-cgi.exe 5020 CloseFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS 
2:43:17.5070914 PM php-cgi.exe 5020 QueryDirectory E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Filter: php3F86.tmp, 1: php3F86.tmp 
2:43:17.5083973 PM php-cgi.exe 5020 QueryDirectory E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Filter: php3F86.tmp, 1: php3F86.tmp 
2:43:17.5112593 PM php-cgi.exe 5020 QueryDirectory E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Filter: php3F86.tmp, 1: php3F86.tmp 
2:43:17.5120519 PM php-cgi.exe 5020 QueryDirectory E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Filter: php3F86.tmp, 1: php3F86.tmp 
2:43:27.5512956 PM php-cgi.exe 5020 CreateFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Desired Access: Read Attributes, Delete, Disposition: Open, Options: Non-Directory File, Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened 
2:43:27.5515084 PM php-cgi.exe 5020 QueryAttributeTagFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Attributes: A, ReparseTag: 0x0 
2:43:27.5515406 PM php-cgi.exe 5020 SetDispositionInformationFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Delete: True 
2:43:27.5515879 PM php-cgi.exe 5020 CloseFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS 

あなたが見ることができるように、procmonのは明確に書かれ、その後閉じ、作成される一時ファイルを示しています。最後には、 "QueryDirectory"呼び出しを見ることができます。これはスクリプトコールと一致し、他のものの中でファイルのSHA1ハッシュを取得しようとします。

これは私のスクリプトです:

ファイルアップロードフォームがFlashオブジェクトや形、より多くの何を構築するためのFlashオブジェクトのためのいくつかのdivを持っています。一時的なアップロードファイルがサーバー上に完全に作成されているので、私のフォームが問題であることを真剣に疑うことはありません。 「logfile.txtという」の

<?php 
// ******************************************************************* 
// exhibit-upload.php 
// 
// ******************************************************************* 

// Reset same session ID because Adobe Flash is a flaming pile 
session_id($_POST['sessionid']); 

ob_start("ob_gzhandler"); 
require_once('inc-common.php'); 

$logFile = "logfile.txt"; 
$logHandle = fopen($logFile, 'w'); 

fwrite($logHandle, '$_FILES error: ' . $_FILES['error'] . "\n"); 

if(!empty($_FILES)) 
{ 
    // Get temp file 
    $sFileTemp = $_FILES['Filedata']['tmp_name']; 
    $sFileName = $objMySQL->sanitize($_FILES['Filedata']['name']); 

    fwrite($logHandle, "Permanent Filename: " . $sFileName . "\n"); 

    $aFileBits = explode('.', $_FILES['Filedata']['name']); 
    $sFileExt = $aFileBits[count($aFileBits) - 1]; 

    // Get SHA1 hash 
    $sFileHash = sha1_file($sFileTemp); 

    fwrite($logHandle, "Temp File Exists: " . file_exists($sFileTemp) . "\n"); 
    fwrite($logHandle, "Temp File Name: " . $sFileTemp . "\n"); 
    fwrite($logHandle, "File Hash: " . $sFileHash . "\n"); 
    sleep(10); 
    exit(); 
} 
?> 

内容:

$_FILES error: 
Permanent Filename: picture.jpg 
Temp File Exists: 
Temp File Name: E:\Inetpub_IIS\tmp\php3F86.tmp 
File Hash: 

「スリープ」コールは私にそれが消える前に、ファイルのための一時ディレクトリをチェックする時間を与えるために存在します。

何十ものGoogle検索が、権限に関するものや、何もアップロードできない壊れたアップロードフォームを含むソリューションにつながっています。ファイルがサーバー上に作成されているので、フォームは明らかに機能します。また、IUSR、IIS_ISURS、DefaultAppPoolに一時ディレクトリとE:\ Inetpub_IISのすべてのアクセス権を与えて、これが関連するアクセス許可と何か関係があるかどうかを確認しようとしましたが、何も変更されませんでした。誰がここで何が起こっているかについてのアドバイスを提供できますか?

編集:私はそれを理解しました。

DaveRandomと私は両方とも、それが本当の、ある種のパーミッションの問題だと思っていました。しかし、問題は実際にPHPの許可/設定の問題であったときに、私たちは両方ともWindows権限について考えていました。 Daveの "backwards"という言い回しは、ディレクトリツリーを逆向きに移動し、最終的に以下の解決策を作成する権限をテストすることを考えました。私が何をしたか

私は非常に短いスクリプトを書いた:

<?php 
    //phpinfo(); 
    echo "Readable: " . is_readable('E:\Inetpub_IIS\tmp'); 
?> 

これはFALSEが返さ。明らかに、Daveが示唆したように、ディレクトリは読めませんでした。

私はE:\ Inetpub_IIS \ wwwrootディレクトリを試しましたが、これはTRUEを返しました。うーん。私は、php_error.logを終日チェックすることを怠ったことに気付きました。ここに私が見つけたものがあります:

[27-Dec-2011 16:51:43] PHP Warning: is_readable(): open_basedir restriction in effect. File(E:\Inetpub_IIS\tmp) is not within the allowed path(s): (E:\Inetpub_IIS\wwwroot) in E:\Inetpub_IIS\wwwroot\ipl\info.php on line 3 

私はグーグルで "open_basedir restriction in effect"と私の答えを持っていました。 php.iniファイルでは、open_basedirのに設定された:意図したとおりにアプリが働き始め、サーバーを再起動した後

open_basedir = "E:\Inetpub_IIS\wwwroot;E:\Inetpub_IIS\tmp" 

open_basedir = E:\Inetpub_IIS\wwwroot 

私はこれを変更しました。

これは、同じ問題を抱えている可能性がある他の人のための十分なドキュメントです。物語の

道徳(S):

  • は、あなたのopen_basedirの設定を確認してください。
  • 有効にし、設定し、あなたのPHPエラーログをチェックすることを忘れないでください。
  • 同じ問題を7時間まっすぐに凝視しないでください。私はほとんどストロークがあったと思う。
+0

[php man](http://www.php.net/manual/en/features.file-upload.php)デバッグに役立つエラーコードのセクションを参照してください。[print_r](http: //www.php.net/print_r)()関数を使用して、print_r($ _ FILES)を実行します。 – goat

+0

UPLOAD_ERR_OKが返されます。ここにprint_rの出力があります: 'Array([the_uploaded_file] => Array([name] => picture.jpg [type] => image/jpeg [tmp_name] => E:\ Inetpub_IIS \ tmp \ php34DD.tmp [error] = > 0 [size] => 391387)) ' – TPC

+0

私はあなたがこの道を歩いていることを知っていますが、これはアクセス許可に関連しているようです - 具体的には(奇妙なことですが)作成されているファイルとそれを読み取ることができないファイル'Everyone'グループに完全な制御権を割り当てて、そこから後方に働くなら、それが問題を解決するかどうかを調べてみてください。 – DaveRandom

答えて

4

約束どおり、ここに私の答えがあります。これは、OP編集からコピー/ペーストされました。

私はそれを理解しました。

DaveRandomと私は両方とも、それが真である何らかのタイプのパーミッションの問題だと思っていました。しかし、問題は実際にPHPの許可/設定の問題であったときに、私たちは両方ともWindows権限について考えていました。 Daveの "backwards"という言い回しは、ディレクトリツリーを逆向きに移動し、最終的に以下の解決策を作成する権限をテストすることを考えました。私が何をしたか

私は非常に短いスクリプトを書いた:

<?php 
    //phpinfo(); 
    echo "Readable: " . is_readable('E:\Inetpub_IIS\tmp'); 
?> 

これはFALSEが返さ。明らかに、Daveが示唆したように、ディレクトリは読めませんでした。

私はE:\ Inetpub_IIS \ wwwrootディレクトリを試しましたが、これはTRUEを返しました。うーん。私は、php_error.logを終日チェックすることを怠ったことに気付きました。ここに私が見つけたものがあります:

[27-Dec-2011 16:51:43] PHP Warning: is_readable(): open_basedir restriction in effect. File(E:\Inetpub_IIS\tmp) is not within the allowed path(s): (E:\Inetpub_IIS\wwwroot) in E:\Inetpub_IIS\wwwroot\ipl\info.php on line 3 

私はグーグルで "open_basedir restriction in effect"と私の答えを持っていました。 PHPで。iniファイルは、open_basedirのに設定された:意図したとおりにアプリが働き始め、サーバーを再起動した後

open_basedir = "E:\Inetpub_IIS\wwwroot;E:\Inetpub_IIS\tmp" 

open_basedir = E:\Inetpub_IIS\wwwroot 

私はこれを変更しました。

これは、同じ問題を抱えている可能性がある他の人のための十分なドキュメントです。物語の

道徳(S):

  • は、あなたのopen_basedirの設定を確認してください。
  • 有効にし、設定し、あなたのPHPエラーログをチェックすることを忘れないでください。
  • 同じ問題を7時間まっすぐに凝視しないでください。私はほとんどストロークがあったと思う。
+0

これはすぐに問題を解決しましたが、PHPがディレクトリに書き込むことができた理由を説明しませんでしたが、読み込めなかったことを指摘したいと思います。私は、それが偶然、正当なバグか設定問題かどうかはわかりません。しかし、何でも、それは今働く。 – TPC

+0

よく書かれた答え。 – xbonez

関連する問題