私は Mac サーバーを持っており、ユーザーが画像、ドキュメント、さらにはビデオ ファイルをアップロードできるように PHP コードを作成しています。これを調査することは間違いなく私を緊張させました。アップロードされたコンテンツがウイルスに感染していないことを望んでいます.
自分で何かを構築することは大きな挑戦になるのでしょうか? それを実行しますか、それとも OS または OTS 製品を見つけますか? (そして、あなたが推薦できるものを知っていますか)?
概念的には、あなたが話していることは非常に簡単です。アップロードの受け入れと処理は非常に簡単です。事前に構築されたソリューションの購入について心配する必要はありません。
一般に、画像やビデオのようなものは実際には「ウイルス」を持つことができません(ビューアアプリケーションが本当に貧弱で、何らかの方法でコードを実行できる場合を除きます-「InternetExplorer」としても知られています)が、とにかくそれらをウイルススキャンすることはそれほど難しくありませんあなたがしたいです。サーバー上で実行できるコマンドラインスキャナー(Clam AVなど)を見つけるだけで、ファイルがアップロードされるたびにスキャナーを実行し、スキャンに失敗した場合はアップロードを拒否します(イベントをログに記録します)。
非常に大きなファイルをアップロードする場合は、アップロードされたファイルの量をユーザーが確認できるように、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).
*/
短い答え: 何も買わないでください。これを自分でコーディングすることで得られる経験と達成感は、はるかに価値があります。
長い答え: あらゆる形式のユーザー入力を信頼することは、一般的に悪い考えです。ただし、ユーザー データをどう扱うかについて賢明であることは、常に最良の方法です。愚かなこと*をしなければ大丈夫ですし、その経験から得られるものは大きいでしょう。
( * 少しあいまいなのはわかっていますが、間違える前に間違いを特定してみてください。めったにできないことはわかっています。;)
「自分で何かを作るのは大きな挑戦になるのでしょうか?」はい、そうです。サードパーティのソリューションにアウトソーシングするほど大きくはありませんが、ここでコーディングしたいのは、php Webスクリプトでコーディングできる最も危険なことです。つまり、ユーザーがサーバーにファイルをアップロードできるようにすることです。ユーザーがphpスクリプトをサーバーにアップロードできないように、受け入れるファイルのフィルタリングには細心の注意を払う必要があります。フィルタリング中によくある間違いは次のとおりです。
私は続けることができました、しかし私はあなたが尋ねる前にすでに怖がっていたと思います:)
ウイルスのことによると、ええ、AVを実行するだけです。
Mootools 1.2.1 の digitarald の FancyUpload を使用して、現在同じようなものを構築しています。
この例をチェックしてください: http://localhost/fancyupload/showcase/photoqueue/がいかに素晴らしいかを確認してください。
セッションを Flash に渡す方法 (GET / POST パラメータを使用!! セッション Cookie は機能しません) をよく読んで、ファイルタイプを確認してください。
個人的には、ユーザーに動画をアップロードさせたくありません。YouTubeを使用して、そのものを埋め込むだけです。
そうそう、アップロードされたもののサムネイルが必要な場合は、Ghostscript と一緒にサーバーにインストールされている ImageMagick を使用してください。Imagemagick は、PDF からサムネイルを生成することもできます。
アップロードされたファイルを処理するためのコードは次のとおりです。
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;
アップロードがウイルスに感染していないことを確認するには、サードパーティのウイルス スキャナーを使用することをお勧めします。(ウイルスをチェックする独自のコードを書くのは大変な作業のように思えます)
例: Gmail は Norton を使用していると思いますが、Yahoo!Mail は McAfee を使用していると思います。
Keith Palmer は小さなスクリプトを提案しています。
clamscanの代わりに clamdscan を使用します。clamdscan は setup clamd (clamav デーモン) と通信しますが、clamscan はスタンドアロン アプリケーションであるため、呼び出すたびにウイルス シグネチャが読み込まれ、サーバーに大きな負荷がかかる可能性があります。
また、clamuko を試すこともできます (これにより、オンアクセス スキャンが可能になります)。そのため、clamuko が監視するディレクトリにファイルをドロップするだけです。
モジュールをカーネルに挿入できない場合、おそらくより良い解決策となるFUSEベースのClamFSもあります。