9

ユーザーがファイルをアップロードできるようにするユースケースがあります。現在、バックエンドの java (http 要求からファイルを抽出してチェックするコントローラー) で、ユーザーが実行可能ファイルをアップロードしたかどうかを検出したいと考えています。彼がアップロードした場合、私はそのファイルを破棄する必要があります。私はそれをグーグルで調べましたが、良い解決策を見つけることができませんでした。一部の人々は、拡張子 (.exe) を検証することを提案しました。しかし、exeファイルをどこまでフィルタリングするかはわかりません。実行ファイルのアップロードを完全にブロックしたい。

このシナリオに遭遇したことがある場合、またはこれに関する解決策がある場合は、お知らせください。私はあなたに感謝します。

この仕事をするJAVA実装、Java API、またはアルゴリズムを教えていただければ幸いです。

4

6 に答える 6

11

あなたがすでに言及した拡張子チェック方法を除けば、考えられるすべてのケースをキャッチする方法はないと思います。実行可能ファイルは、最終的には機械命令のシーケンスであり、他のデータとほとんど区別がつきません。

ただし、これにもかかわらず、特定の種類の実行可能ファイルで探すことができるものがあります。例えば:

FileInputStreamまたは類似のファイルを作成して、ファイルの最初の数バイトを読み取り、これらのマジック ナンバーを確認することをお勧めします。実行可能コードを含むファイルは検出されませんが、これらの標準の実行可能形式のファイルが許可されないようにする必要があります。これは、あなたが望んでいたことだと思います。

たとえば、次のようになります。

public static boolean isExecutable(File file) {
  byte[] firstBytes = new byte[4];
  try {
    FileInputStream input = new FileInputStream(file);
    input.read(firstBytes);

    // Check for Windows executable
    if (firstBytes[0] == 0x4d && firstBytes[1] == 0x5a) {
      return true;
    }
    return false;
  }
  catch (Exception e) {
    e.printStackTrace();
  }
}

また、実行可能でないファイルを拒否する誤検知が発生する可能性があることにも注意してください。アップロードしようとしているファイルの種類がわからないので、これが発生する可能性を考慮する必要があります。

于 2013-02-10T16:52:48.697 に答える
0

Windowsの実行可能ファイルはファイルだけではない.exeため、拡張子を確認するだけでは不十分であることに注意してください。

高度でだましにくいものが必要な場合は、Linuxから移植された人気のあるコマンドラインツールであるFileforWindowsなどのサードパーティツールを使用できます。

たとえば、ファイルをチェックしたい場合program.exe

C:\file -b "program.exe"

結果は次のようになります

PE32 executable for MS Windows <GUI> Intel

このツールは、Javaプログラムから次のコマンドを使用して実行できます。Runtime.getRuntime().exec()

コマンドラインプログラムを実行してJavaで出力を取得する方法については、この質問を参照してください。

Apache Tikaをチェックして、そのコンテンツからファイルタイプを取得することもできます

于 2013-02-10T17:03:16.740 に答える
0

MZWindows 実行可能ファイルは常にマジック ナンバーで始まります。おそらくこれで確認できます。

于 2013-02-10T16:43:27.357 に答える
0

私が見た限りでは、最も一般的なアプローチは拡張子を検証することです。たとえば、zip やその他の拡張子に名前が変更されている場合、メール クライアントは通常、実行可能ファイルの送信を受け入れることに気付きました。
セキュリティの問題は、ユーザーが誤って実行可能ファイルを実行した場合に発生するため、これで十分だと思います。ファイルの名前を不明な/異なる拡張子に変更することで、ユーザーが誤ってそれを行うことができないため、危険が何らかの形で「軽減」されます.
そうでなければ、ファイルの内容を調べて、実際に実行可能ファイルがあるかどうかを判断する方法を考え出します.これがどれほど実現可能か、移植性があり、信頼性があるかはわかりません

于 2013-02-10T16:49:42.647 に答える
0

ここを見てください:

ファイルがJavaで実行可能かどうかを判断する良い方法はありますか

このコマンドが役立つようです: java.io.File.canExecute()

于 2013-02-10T16:50:09.200 に答える