0

ディレクトリ区切り文字 (スラッシュ) を使用せずに、文字列を安全で有効なファイル名にサニタイズする PHP 関数を探しています。

理想的には、リバーシブルであるべきであり、必要以上に名前をごちゃ混ぜにすべきではありません。

もちろん、意図的なディレクトリ トラバーサル攻撃を防ぎたいと思っています。しかし、サブフォルダーが作成されないようにしたいです。

私はそれurlencode()がうまくいくと考えましたが、これで十分かどうか、および/またはより良い、またはより人気のあるものがあるかどうか疑問に思います.

また、Windows でも同じように機能するもの (ディレクトリ セパレータとしてのバックスラッシュ) がある場合、そのソリューションは移植可能です。

ユースケース / シナリオ:

データ インポートの一環として、リモート URL からローカル ファイル システムにファイルをダウンロードしたいと考えています。URL は csv ファイルからのものです。それらのほとんどは問題ありませんが、予想よりも多くのスラッシュが含まれている可能性があります。

たとえば、それらのほとんどは次のようなものです。
https://files.example.com/pdf/12345.pdf

ただし、個々のファイルは次のようになります。
https://files.example.com/pdf/1/2345.pdf

ファイルはすべて同じディレクトリに配置する必要があります。例: https://files.example.com/pdf/12345.pdf->/destination/dir/12345.pdf

次のようなファイル1/2345.pdfは、サブディレクトリにはなりません。代わりに、/何らかの (可逆的な) 方法でエスケープする必要があります。たとえば、urlencode() の場合、これは1%2F2345.pdf.

4

3 に答える 3

2

これはあなたを助けるはずです。

入力: https://files.example.com/pdf/1/2345.pdf

出力: pdf_1_2345.pdf

$url = 'https://files.example.com/pdf/1/2345.pdf';
$parse = parse_url($url);

//get path, remove first slash
//$path: pdf/1/2345.pdf
$path = substr($parse['path'],1);

//result becomes: pdf_1_2345.pdf
$result = str_replace('/','_',$path);

EDIT:リモートファイルのURLをデータベースに保存し、その値を(md5などを使用して)ハッシュし、その名前でファイルをローカルに保存し、そのハッシュ値をデータベースにも保存するのが最善の策です。

これが最善の策です。この方法では、どのリモート ファイルがローカル ファイルに対応しているか、またその逆も常に知ることができます。ファイル名はローカルで処理する必要がありません。それらは一意性をチェックしています)

Database Table:
--------------------
| id | remote_url                  | local_name     |
-----------------------------------------------------
| 1  | http://example/.../123.pdf  | sdflkfd..dl.pdf|

あなたはアイデアを得る。

于 2016-02-28T21:57:28.090 に答える
2

交換用のセットを作成できます。たとえば、ファイル名に表示される / 文字を「(スラッシュ)」などの別のもので表すことができます。str_replace を使用して、ファイル名の検索とファイル名の URL へのエンコードを切り替えるだけです。これはほんの一例です。

于 2016-02-28T21:47:41.733 に答える