fopenに渡された文字列がファイルパスか有効なラッパーかを示したいとします(例えば、"/home/user/example.txt"
と"php://input"
)。これはphp://input
にあるtmpfileを作成してPHP wrappersのfseek
制限を回避するためです。ラッパーのURIの下に示すように文字列がPHPで有効なファイルまたはラッパーを指しているかどうかを調べる方法は?
、file_exists
ファイルのための作品ではなく:
var_dump(file_exists("php://input"));
var_dump(file_exists("./exists.txt"));
var_dump(file_exists("./non_existent.txt"));
var_dump(file_exists("php://garbage"));
が
bool(false)
bool(true)
bool(false)
bool(false)
trueを返すだけを与えるファイルです。私はstream_get_wrappers()を見つけましたが、チェックをあまり複雑にしないようにしたい(ラッパーを検出しようとするために文字列比較を使用するなど)。
stream_get_meta_dataの使用もうまくいくようですが、最初にfopenを呼び出してエラーログを詰まらせる必要があります。
var_dump(stream_get_meta_data(fopen("php://input","r+")));
var_dump(stream_get_meta_data(fopen("./exists.txt","r+")));
var_dump(stream_get_meta_data(fopen("./non_existent.txt","r+")));
var_dump(stream_get_meta_data(fopen("php://garbage","r+")));
は
array(9) {
["timed_out"]=>
bool(false)
["blocked"]=>
bool(true)
["eof"]=>
bool(false)
["wrapper_type"]=>
string(3) "PHP"
["stream_type"]=>
string(5) "Input"
["mode"]=>
string(2) "rb"
["unread_bytes"]=>
int(0)
["seekable"]=>
bool(true)
["uri"]=>
string(11) "php://input"
}
array(9) {
["timed_out"]=>
bool(false)
["blocked"]=>
bool(true)
["eof"]=>
bool(false)
["wrapper_type"]=>
string(9) "plainfile"
["stream_type"]=>
string(5) "STDIO"
["mode"]=>
string(2) "r+"
["unread_bytes"]=>
int(0)
["seekable"]=>
bool(true)
["uri"]=>
string(10) "./exists.txt"
}
NULL
NULL
私がしたい、私はstream_get_meta_data
によって返される配列からwrapper_type
を使用することができますが、ファイルまたはラッパーURIが存在しない場合、それはまだログにゴミを吐き出すますが生成さ避ける。
何最善の方法は、私の入力文字列が(fopenの渡される)かどうかを検出するための既存のファイルまたは有効なPHPラッパー、またはどちらのためにどちらか有効なファイルパスが含まれていますか?
更新:追加のfopen
コールを犠牲にして問題を解決する回避策が見つかりました。私はこれを以下の答えに入れました。
は、少なくともではないPHP 7.0、また公式ドキュメントでは、ものではないようです。 'PHP -r 'のvar_dump(function_exists( "is_stream"));'' 'ブール値(偽) ' –
説明なしでdownvoteに感謝します:(以前の研究の証拠は、ここにどれくらい表示される必要がありますか? –