3

私は Mac サーバーを持っており、ユーザーが画像、ドキュメント、さらにはビデオ ファイルをアップロードできるように PHP コードを作成しています。これを調査することは間違いなく私を緊張させました。アップロードされたコンテンツがウイルスに感染していないことを望んでいます.

自分で何かを構築することは大きな挑戦になるのでしょうか? それを実行しますか、それとも OS または OTS 製品を見つけますか? (そして、あなたが推薦できるものを知っていますか)?

4

8 に答える 8

22

概念的には、あなたが話していることは非常に簡単です。アップロードの受け入れと処理は非常に簡単です。事前に構築されたソリューションの購入について心配する必要はありません。

一般に、画像やビデオのようなものは実際には「ウイルス」を持つことができません(ビューアアプリケーションが本当に貧弱で、何らかの方法でコードを実行できる場合を除きます-「InternetExplorer」としても知られています)が、とにかくそれらをウイルススキャンすることはそれほど難しくありませんあなたがしたいです。サーバー上で実行できるコマンドラインスキャナー(Clam AVなど)を見つけるだけで、ファイルがアップロードされるたびにスキャナーを実行し、スキャンに失敗した場合はアップロードを拒否します(イベントをログに記録します)。

于 2009-03-16T19:54:44.833 に答える
5

非常に大きなファイルをアップロードする場合は、アップロードされたファイルの量をユーザーが確認できるように、Flash アップロード/ステータス バーを検討することもできます。SWFUploadはそのための良い選択です。

PHP で次のようにすると、ClamAV でファイルをスキャンできます。


$out = '';
$int = -1;
exec('/usr/local/bin/clamscan --stdout /path/to/file.ext', $out, $int);

if ($int == 0)
{
  print('No virus!');
}

/*
Return codes from clamscan:
 0 : No virus found.

       1 : Virus(es) found.

       40: Unknown option passed.

       50: Database initialization error.

       52: Not supported file type.

       53: Can't open directory.

       54: Can't open file. (ofm)

       55: Error reading file. (ofm)

       56: Can't stat input file / directory.

       57: Can't get absolute path name of current working directory.

       58: I/O error, please check your file system.

       59: Can't get information about current user from /etc/passwd.

       60: Can't get information about user '' from /etc/passwd.

       61: Can't fork.

       62: Can't initialize logger.

       63: Can't create temporary files/directories (check permissions).

       64: Can't write to temporary directory (please specify another one).

       70: Can't allocate memory (calloc).

       71: Can't allocate memory (malloc).

*/

于 2009-03-16T20:15:40.383 に答える
4

短い答え: 何も買わないでください。これを自分でコーディングすることで得られる経験と達成感は、はるかに価値があります。

長い答え: あらゆる形式のユーザー入力を信頼することは、一般的に悪い考えです。ただし、ユーザー データをどう扱うかについて賢明であることは、常に最良の方法です。愚かなこと*をしなければ大丈夫ですし、その経験から得られるものは大きいでしょう。



( * 少しあいまいなのはわかっていますが、間違える前に間違いを特定してみてください。めったにできないことはわかっています。;)

于 2009-03-17T05:11:50.487 に答える
1

「自分で何かを作るのは大きな挑戦になるのでしょうか?」はい、そうです。サードパーティのソリューションにアウトソーシングするほど大きくはありませんが、ここでコーディングしたいのは、php Webスクリプトでコーディングできる最も危険なことです。つまり、ユーザーがサーバーにファイルをアップロードできるようにすることです。ユーザーがphpスクリプトをサーバーにアップロードできないように、受け入れるファイルのフィルタリングには細心の注意を払う必要があります。フィルタリング中によくある間違いは次のとおりです。

  1. まったくフィルタリングしません。
  2. 誤った正規表現に基づいてフィルタリングすると、簡単にバイパスできます。
  3. is_uploaded_fileおよびmove_uploaded_file関数を使用しないと、LFIの脆弱性が発生する可能性があります。
  4. $ _FILES配列を使用しない(代わりにグローバル変数を使用する)と、RFIの脆弱性が発生する可能性があります。
  5. $ _FILES配列のタイプに基づいてフィルタリングします。これは、ブラウザから取得されたものであるため、偽造可能です。
  6. サーバー側でチェックされたmime-typeに基づいてフィルタリングし、マジックファイルに含まれるものをシミュレートすることでだまされます(つまり、このコンテンツGIF8を含むファイルはimage / gifファイルとして識別されますが、phpスクリプトとして完全に実行されます)
  7. 明示的に許可されているファイルや拡張子をホワイトリストに登録するのではなく、危険なファイルや拡張子をブラックリストに登録してください。
  8. php実行可能ファイル拡張子(つまりtxt)を再定義する.htaccessファイルをアップロードできるようにするApache設定が正しくありません。

私は続けることができました、しかし私はあなたが尋ねる前にすでに怖がっていたと思います:)

ウイルスのことによると、ええ、AVを実行するだけです。

于 2009-05-12T01:55:31.793 に答える
1

Mootools 1.2.1 の digitarald の FancyUpload を使用して、現在同じようなものを構築しています。

この例をチェックしてください: http://localhost/fancyupload/showcase/photoqueue/がいかに素晴らしいかを確認してください。

セッションを Flash に渡す方法 (GET / POST パラメータを使用!! セッション Cookie は機能しません) をよく読んで、ファイルタイプを確認してください。

個人的には、ユーザーに動画をアップロードさせたくありません。YouTubeを使用して、そのものを埋め込むだけです。

そうそう、アップロードされたもののサムネイルが必要な場合は、Ghostscript と一緒にサーバーにインストールされている ImageMagick を使用してください。Imagemagick は、PDF からサムネイルを生成することもできます。

于 2009-03-17T08:09:32.853 に答える
0

アップロードされたファイルを処理するためのコードは次のとおりです。

foreach ($_FILES as $file) {
  if (!$file['error']) {
    move_uploaded_file ($file['tmp_name'], 'uploads/'. $file['name']);
  } elseif (4 != $file['error']) {
    $error_is = $file['error'];
    // do something with the error :-)
  }
}

header ('Location: ...'); // go to the updated page, like, with the new files
die;
于 2009-03-16T20:00:08.800 に答える
0

アップロードがウイルスに感染していないことを確認するには、サードパーティのウイルス スキャナーを使用することをお勧めします。(ウイルスをチェックする独自のコードを書くのは大変な作業のように思えます)

例: Gmail は Norton を使用していると思いますが、Yahoo!Mail は McAfee を使用していると思います。

于 2009-03-17T09:51:40.283 に答える
0

Keith Palmer は小さなスクリプトを提案しています。

clamscanの代わりに clamdscan を使用します。clamdscan は setup clamd (clamav デーモン) と通信しますが、clamscan はスタンドアロン アプリケーションであるため、呼び出すたびにウイルス シグネチャが読み込まれ、サーバーに大きな負荷がかかる可能性があります。

また、clamuko を試すこともできます (これにより、オンアクセス スキャンが可能になります)。そのため、clamuko が監視するディレクトリにファイルをドロップするだけです。

モジュールをカーネルに挿入できない場合、おそらくより良い解決策となるFUSEベースのClamFSもあります。

于 2009-04-29T10:19:45.257 に答える