0

ユーザーはほとんどすべての種類のファイルをアップロードできるようにする必要がありますが、明らかに私は悪意のあるものをアップロードしたくありません。ただし、アップロードフォームでは、たとえば.jsスクリプトや.phpスクリプトなどを許可する必要があります。

ホワイトリストは無限である可能性があり、ブラックリストは正当なファイルのアップロードを妨げる可能性があり、それらのオプションが実際にどの程度のセキュリティを提供するかはわかりません。

フロントコントローラーでCakePHPを使用しているため、アップロードされたファイルにブラウザーから直接アクセスすることはできません。ファイルはとしてアップロードされ-rw-r--r--ます。

私の最良の選択肢は何ですか?サーバーはどの程度保護されていますか?

4

3 に答える 3

1

「CakePHPを介してルーティングされ、ファイルを提供する」とはどういう意味かは明確ではありませんが、質問を考えると、アップロードされたファイルはwebroot元の拡張子のままでパブリックディレクトリにドロップされ、 FTP経由でアップロードする他のファイルと同じようにWebサーバー。

その場合は、セキュリティの問題が膨らんでいるため、弱い回避策でその影響を緩和しようとするのではなく、根本的な問題を修正する必要があります。

ユーザーがアップロードしたファイルを処理するときは、それらがスクリプトとしてではなく、常にデータとして処理されるようにする必要があります。ファイル拡張子に関係なく、すべてのファイルがデータとして処理される特別なディレクトリを作成できますが、Webサーバーの構成を微調整する必要があり、将来何も壊れないことを期待する必要があります。または、アップロードディレクトリをドキュメントルートの(または少なくともWebサーバーからアクセスできない場所)に配置し、ファイルを読み取ってそのまま提供するPHPラッパー(ダウンロードスクリプトなど)を作成することをお勧めします。 。

于 2012-12-05T15:54:49.097 に答える
1

最善のオプションは、ユーザーがファイルシステムにアップロードできるようにするのではなく、データを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スクリプトを使用して、後で他の訪問者に提供するためにデータベースからデータを引き出すことができるため、そうすることでセキュリティが大幅に向上し、大きな欠点はほとんどありません。

于 2012-12-05T22:08:29.173 に答える
0
  1. 拡張機能のリストを確認します(拡張機能を確認するためにexplodeを使用しないでください。代わりにpathinfo()を使用してください)。
  2. また、ファイルのMIMEタイプも確認してください。
  3. ブラックリストが非常に大きい場合でも、ブラックリストの代わりにホワイトリストを使用する方が常に安全なソリューションです。
于 2012-12-05T15:26:18.383 に答える