最善のオプションは、ユーザーがファイルシステムにアップロードできるようにするのではなく、データをBLOBとしてデータベースに直接アップロードすることです。
ファイルシステムは複雑であり、ユーザーがファイルシステムに直接アップロードできるようにすると、潜在的なセキュリティホールが多数発生します。たとえば、誰かが「foo.php \ 0.jpg」という名前のファイルをアップロードした場合(\ 0はバイト値ゼロ、ヌル文字)、PHPはおそらく文字列がテキスト「.jpg」で終わっていることに気付くでしょう。したがって、「安全」です。
ただし、文字列 "foo.php \ 0.jpg"がPHPの下のfopenに入ると、nullで終了する文字列 "foo.php"として扱われ、ユーザーが任意のPHPをWebサイトにアップロードできるようになります。
同様に、悪意のあるユーザーが/ dev / hd0 /、htt *://1.2.3.4/、\?\ WEBDAV \ 1.2.3.4 \、CON.txt、またはその他の厄介なファイルシステムのエッジケースにアップロードするのを阻止することは困難です。あなたがほぼ確実に考えていないこと。
安全を確保するための最善の方法は、ユーザーデータがDATAbaseにのみ保存されるようにすることです(そのため、彼らはそれをそう呼んでいます)。さらに、SQLをパラメータ化することを忘れないでください。そうすれば、敵対的な攻撃からかなり安全になります。
いつでもPHPスクリプトを使用して、後で他の訪問者に提供するためにデータベースからデータを引き出すことができるため、そうすることでセキュリティが大幅に向上し、大きな欠点はほとんどありません。