在java中检测可执行文件

Raj*_*eev 8 java security file-io file-upload http-headers

我有一个用例,我们允许用户上传文件.现在在后端java(控制器从http请求中提取文件并检查),我想检测用户是否上传任何可执行文件.如果他上传,我必须丢弃该文件.我用谷歌搜索它但找不到一个好的解决方案.有人建议验证扩展名(.exe).但我不知道它将过滤exe文件到底有多远.我想完全阻止上传的可执行文件.

如果您有任何人遇到过这种情况或有解决方案,请告诉我.我很感激你.

如果您能指出任何JAVA实现或Java API或算法来完成这项工作,我会更高兴.

dev*_*obf 11

我怀疑,除了你已经提到的扩展检查方法之外,没有办法抓住每一个可能的情况.可执行文件最终是机器指令的序列,这使得它们在很大程度上与任何其他数据无法区分.

尽管如此,有些东西你可以在某些类型的可执行文件中寻找.例如:

  • Windows使用可移植可执行文件格式,该格式应始终以幻数4d5a(ASCII字符MZ)开头
  • Linux使用的ELF格式可执行文件 7f454c46
  • Java类文件总是以cafebabe(十六进制,而不是ASCII!)开头.
  • 据我所知,Mac-OSX使用的Mach-O文件具有幻数feedface(再次为十六进制)

我建议你创建一个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();
  }
}
Run Code Online (Sandbox Code Playgroud)

还要注意,可能会出现误报,拒绝不可执行的文件.我不知道您打算上传什么类型的文件,因此您应该考虑这种情况发生的可能性.