4
$filename = "Sara & I.mp3";
if (file_exists($filename)) {
 ...
}

ファイル名に " &" が含まれている場合、PHP は true を返しません。file_exists

&$filename で" " をエスケープして動作させるにはどうすればよいfile_existsですか?

、、、および「&」をバックスラッシュ (\&) でエスケープしようとしましたが、うまくいきurlecode()ませurlrawencode()htmlentities()

ps。これはRedHat5を実行しているLinuxシステム上にあります

前もって感謝します

4

5 に答える 5

3

これらのファイルはユーザーによってアップロードされていますか? 私は通常、アップロードされたファイルの名前を、特殊文字による問題を避けるために、A ~ Z、数字 0 ~ 9、および _ または - と .pdf などのファイル拡張子のみを使用するように名前を変更します。スペースは _ に変換されます。

たとえば、大規模なPHPベースのCMSであるTYPO3は、ファイル名をきれいにするためにこれらの正規表現を使用します。

$fileName = preg_replace('/[^.[:alnum:]_-]/','_',trim($fileName));  // converting all on alphanumeric chars to _
$fileName = preg_replace('/\.*$/','',$fileName); // removing dot . after file extension

したがって、の入力は次のfoo&.pdf.ように変換されますfoo.pdf

于 2009-10-17T19:26:35.323 に答える
2

スクリプトは私にとってはうまくいくようです。

チェックしているファイルが、スクリプトを実行するディレクトリにあることを確認してください。

getcwd() を使用して、スクリプトが実行されている場所を確認します。

たとえば、スクリプトが my/scripts/script.php にあるが、それが含まれていて my/other/scripts/index.php の別のスクリプトによって呼び出されている場合、スクリプトは実際には my/other/scripts ディレクトリではなく、my/other/scripts ディレクトリで実行されます。ご想像のとおり、 my/scripts ディレクトリ

于 2009-10-20T23:59:17.730 に答える
1

それがファイルの場合、ファイルシステムが期待するようにエスケープするべきではありませんか? \& の行に沿ったものではないか、またはおそらくユニコードベースのエスケープシーケンス (現時点ではエスケープします;-) ですか?

于 2009-10-17T19:26:37.407 に答える
1

次のようなGETリクエストとしてパラメーターを渡していると思いますscript.php?file=this & that.mp3

まず、ユーザーが任意のファイルを削除できないように、入力内容を十分に確認してください。urlencode2番目:リンクを作成するときにファイル名をエンコードします。のエンコードされた文字は&です%26

あなたのスクリプトは次のように呼び出されます:(script.php?file=this%20%26%20that.mp3空白%20です)

そうしないと、別の GET 変数、つまりthat.mp3が割り当てられないことになります。&GETリクエストで単一のパラメータを区切るために使用されます

私の側からの質問を編集
します: ファイルを削除するにはどうすればよいですか? phpのunlink機能を使用していますか?またはあなたのシステムで使用execして呼び出しrmていますか?(これは一般的に非常に安全ではありません)。2 番目の方法で実行している場合は、 を使用できますescapeshellarg。シェル入力をエスケープしないと、シェルはコマンドを 2 つのコマンドとして解釈します (私の言葉を鵜呑みにしないでください)。

于 2009-10-17T20:33:54.120 に答える
0

アンパサンドはどこから来ているのですか - ユーザー入力ですか、それとも実際にスクリプト内にありますか? エンコーディングが混同されている可能性があります。

また、ディレクトリに対して glob() を実行すると、どのような結果が得られますか? アンパサンドを含むファイルはありますか?glob() の出力をコピー & ペーストして file_exists() を実行するとどうなりますか?

于 2009-10-21T10:34:05.383 に答える