ユーザーがテキストファイル(PDFまたはドキュメント)をサーバーにアップロードできるようにするスクリプトがあります。その後、それらを生のテキストに変換する予定です。しかし、ファイルが変換されるまでは生の形式であるため、ウイルスやあらゆる種類の厄介なことが心配になります。
これらの未知のファイルのリスクを最小限に抑えるために私が何をする必要があるかについてのアイデア。クリーンであるかどうか、またはそれが主張する形式であり、サーバーをクラッシュさせないかどうかを確認する方法。
私がAerikにコメントしたように、しかしそれは本当に質問への答えです。
PHP> = 5.3を使用している場合は、を使用してfinfo_file()
ください。古いバージョンのPHPを使用している場合は、使用するmime_content_type()
か(信頼性が低い)、PECLからFileinfo拡張機能をロードできます。
これらの関数は両方とも、ファイルのmimeタイプを返します(ファイル内のデータのタイプを調べることによって)。PDFの場合は
text/pdf
ワードドキュメントの場合、それはいくつかのことかもしれません。一般的には
application/msword
サーバーが*nixを実行している場合は、保存しているファイルが実行可能でないことを確認してください。さらに良い方法:Webサーバーからアクセスできないフォルダーに保存します。ファイルにアクセスするためのコードを作成することはできますが、Webページを要求している人はファイルにまったくアクセスできません。
サーバー上でユーザーがアップロードしたファイルを開いたり実行したりしたことがある場合は、サーバーが危険にさらされていることを予期する必要があります。
JPGでも実行可能なphpを含めることができます。あなたinclude
またはrequire
あなたのスクリプトに何らかの形でファイルがある場合、それはあなたのサーバーを危険にさらす可能性もあります。あなたがウェブ上でつまずいた画像はそのように役立った...
header('Content-type:image / jpeg'); header('Content-Disposition:inline; filename = "test.jpg"'); echo file_get_contents('/some_image.jpg'); echo'<?php phpinfo(); ?>';
...これを保存して自分のサーバーで再ホストします...
$ q = $ _GET ['q']; //これは今のところ消毒されているふりをします header('Content-type:' .mime_content_type($ q)); header('Content-Disposition:inline; filename="'。$_GET['q']。'"'); $qを含める;
...phpinfo()
サーバー上で実行されます。サイトユーザーは、画像をデスクトップに保存し、メモ帳で開いてサーバー設定を確認するだけです。ファイルを別の形式に変換するだけでそのスクリプトは破棄され、ファイルに添付された実際のウイルスをトリガーすることはありません。
アップロード時にウイルス検索を行うのも最善かもしれません。チェッカーに対してインラインシステムコマンドを実行し、その出力を解析して、チェッカーが検出されるかどうかを確認できるはずです。サイトのユーザーは、とにかくダウンロードしたファイルをチェックする必要があります。
そうでなければ、ウイルスに感染したユーザーがサーバーにファイルをアップロードしただけでも、何も害を及ぼすことはありません...私が知る限りです。
うーん-私見ですが、ドキュメントの種類などについて心配する必要はありません。優れたコンバーターを使用して生のテキストに変換する場合、これはサーバーをクラッシュさせることなくこれらのチェックを実行する必要があります。
クライアントコンピュータからわかるように、サーバーは常にウイルスや攻撃から保護する必要があります。そのため、新しくアップロードされたファイルは、処理する前にチェックする必要があります。
Webアプリがそれ自体をチェックしているのを見たことがありません。
私見、何かがそれを実行しようとするまで、それはただのファイルです。ただし、ファイル拡張子を確実に確認できます(ただし、以下で説明するように、依存しないでください)。また、ファイル形式を調べて、確認できるファイルのヘッダーに特徴的なバイトシーケンスがあるかどうかを確認することもできます。
PDFを表示している場合は、ウイルス対策ソフトウェアを入手して、悪意を持って形成されたPDFを検出するように祈る以外にできることはありません。
ただし、変換ソフトウェアは通常対象とされていないため、変換してテキスト形式の出力を表示するだけの場合は、ある程度安全です。
ああ、あなたはサーバーについて心配しています。アップロードされたファイルを実行しないでください...
アップロードされたファイルには3つのセキュリティ方法があります:最良:ファイルを別のサーバーに配置する最も安全な方法:WWWフォルダーの外に配置することは、URLでファイルにアクセスできないことを意味し、読み取りにはreadfile()またはget_contentを使用する必要があります。ファイルを最後に表示:ファイルをWWWに配置し、他のユーザーがファイルを実行したり、不明なファイルを配置したりするのを防ぐフォルダーに.htaccessを使用します。これは、ファイルをアップロードすることによって行うことです。それらをWebルートの外に置き、名前を変更して、データベースに偽の名前を保存し、アルゴリズムによってファイルの実際の名前を作成します。
Webルートの外部にファイルをアップロードした後、ここで行うようにアクセスできます。ここに、ファイルの内容が表示されますgetfile.php:
<?php
define('DS', DIRECTORY_SEPARATOR);
//fake name of file
$uniqueid = $_GET['uniqueid'];
//file extension
$ext = $_GET['ext'];
if (isset($_GET['dir']))
//check address doenot contain ..
$addrss = str_replace('..', '_', $_GET['dir']);
$baseaddress = '..' . DS . 'foldername outside of web root';
if ((isset($_GET['uniqueid']) and strlen($uniqueid) === 32) and ( isset($_GET['ext']) and strlen($ext) === 3 )) {
$path = $baseaddress . DS . $addrss . DS;
$path .= md5($uniqueid . $uniqueid . $uniqueid . $ext.'*#$%^&') .'.'. $ext;
if (file_exists($path)) {
//you can check for all your accessible extension i just use for img
switch ($ext) {
case 'jpg':
$content_type = 'image/jpeg';
break;
case 'png':
$content_type = 'image/png';
break;
case 'gif':
$content_type = 'image/gif';
break;
}
header('Content-type: ' . $content_type . ' ');
$file = readfile($path);
}
ファイルsrcまたはファイルを表示する必要があるすべての場所でこれを実行します(これは私の画像用です):
<img src="/getfile.php?uniqueid=put fake file name here&ext=put extension here&dir=put rest of file address here" >
それがあなたを助けることを願っています。もっと質問することを躊躇しないでください