9

多くの異なるプログラムによって作成された多数のデータ ファイルがあります。データ ファイルの作成に使用されたデータベースとデータベースのバージョンを確認する方法はありますか。

たとえば、Microsoft Access、dBASE、FileMaker、FoxPro、SQLite などから作成されたファイルを特定したいと考えています。

どうにかしてファイルをすばやくスキャンし、ソース データベースやバージョンなどの情報を表示したいだけです。

参考までに、私は Delphi 2009 を使用しています。

4

3 に答える 3

10

まず、ファイルの拡張子を確認してください。対応するウィキペディアの記事、または他のサイトをご覧ください。

次に、いわゆる「署名」からファイル形式を推測できます。

これは主に最初の文字コンテンツであり、ファイル形式を識別できます。

この非常に素晴らしい Gary Kessler のWeb サイトで更新されたリストがあります。

たとえば、サーバー側でフレームワークがファイル コンテンツから MIME 形式を識別する方法は次のとおりです。

function GetMimeContentType(Content: Pointer; Len: integer;
  const FileName: TFileName=''): RawUTF8;
begin // see http://www.garykessler.net/library/file_sigs.html for magic numbers
  result := '';
  if (Content<>nil) and (Len>4) then
    case PCardinal(Content)^ of
    $04034B50: Result := 'application/zip'; // 50 4B 03 04
    $46445025: Result := 'application/pdf'; //  25 50 44 46 2D 31 2E
    $21726152: Result := 'application/x-rar-compressed'; // 52 61 72 21 1A 07 00
    $AFBC7A37: Result := 'application/x-7z-compressed';  // 37 7A BC AF 27 1C
    $75B22630: Result := 'audio/x-ms-wma'; // 30 26 B2 75 8E 66
    $9AC6CDD7: Result := 'video/x-ms-wmv'; // D7 CD C6 9A 00 00
    $474E5089: Result := 'image/png'; // 89 50 4E 47 0D 0A 1A 0A
    $38464947: Result := 'image/gif'; // 47 49 46 38
    $002A4949, $2A004D4D, $2B004D4D:
      Result := 'image/tiff'; // 49 49 2A 00 or 4D 4D 00 2A or 4D 4D 00 2B
    $E011CFD0: // Microsoft Office applications D0 CF 11 E0 = DOCFILE
      if Len>600 then
      case PWordArray(Content)^[256] of // at offset 512
        $A5EC: Result := 'application/msword'; // EC A5 C1 00
        $FFFD: // FD FF FF
          case PByteArray(Content)^[516] of
            $0E,$1C,$43: Result := 'application/vnd.ms-powerpoint';
            $10,$1F,$20,$22,$23,$28,$29: Result := 'application/vnd.ms-excel';
          end;
      end;
    else
      case PCardinal(Content)^ and $00ffffff of
        $685A42: Result := 'application/bzip2'; // 42 5A 68
        $088B1F: Result := 'application/gzip'; // 1F 8B 08
        $492049: Result := 'image/tiff'; // 49 20 49
        $FFD8FF: Result := 'image/jpeg'; // FF D8 FF DB/E0/E1/E2/E3/E8
        else
          case PWord(Content)^ of
            $4D42: Result := 'image/bmp'; // 42 4D
          end;
      end;
    end;
  if (Result='') and (FileName<>'') then begin
    case GetFileNameExtIndex(FileName,'png,gif,tiff,tif,jpg,jpeg,bmp,doc,docx') of
      0:   Result := 'image/png';
      1:   Result := 'image/gif';
      2,3: Result := 'image/tiff';
      4,5: Result := 'image/jpeg';
      6:   Result := 'image/bmp';
      7,8: Result := 'application/msword';
      else begin
        Result := RawUTF8(ExtractFileExt(FileName));
        if Result<>'' then begin
          Result[1] := '/';
          Result := 'application'+LowerCase(Result);
        end;
      end;
    end;
  end;
  if Result='' then
    Result := 'application/octet-stream';
end;

GAry Kessler のリストから、同様の関数を使用できます。

于 2011-06-04T18:31:10.010 に答える
2

数百 (数千とは言わないまでも) のバージョンとフォーマットを持つ多数のデータベース エンジンがあります。(バイナリ、CSV、XML...) それらの多くは、コンテンツを保護するために暗号化されています。すべてのデータベースとすべてのフォーマットを特定することはまったく「不可能」であり、絶え間ない変更の対象です。

そのため、まず最初に、スキャンするデータベース エンジンのリストにタスクを限定する必要があります。それが私がすることです...

于 2011-06-04T16:27:04.020 に答える
2

まず、「可能なフォーマット」を提供する以上のことが「クイックスキャン」でできるとは思いません。また、クイックテクニックが信頼できるとは想像しがたいです。

DBASE ファイルは通常、拡張子 .dbf を使用します。FoxPro と Clipper で使用される dBase ファイル形式のバリエーションがあります。ウィキペディアでは、これらをxBaseとして文書化しています。dBase ファイルを開くことができるすべての dBase ライブラリは、(a) 実際にこれが実際に dBase ファイルであることを示すことができ、(b) サポートされている xBase ファイル形式のどのバリアントが使用されているかを確認できます。 .

Access ファイルは通常 .mdb ファイル形式を使用していますが、パスワードで暗号化できます。おそらく、内部コンテンツを「Jet データベース エンジン」(Access で使用される内部タイプのファイル) であると肯定的に識別できる独自のライブラリを作成できますが、コンテンツを読み取ることはできませんが、パスワードをクラックするまでは、できるとは思えません。これを確実に行います。

FileMaker ファイルには多くのファイル拡張子を付けることができ、それらの内部ファイル形式は十分に文書化されていません。ウィキペディアによると、.fm .fp3 .fp5 および .fp7 が一般的なファイル拡張子です。Access と同様に、filemaker データベースでも同様の「パスワード」の問題が発生します。ODBC を使用する以外に、Delphi で filemaker ファイルを読み取る方法を知りません。それでも、ODBC を利用した「オムニ リーダー」を Delphi で提供できるとは思えません。ODBC には注意深いセットアップと知識が必要だからです。元のファイルを ODBC 経由で読み取り可能になる前に、odbc データ ソースに変換します。ブラウズ/検出は、ODBC でサポートされているフェーズではありません。

SQLite ファイルには、任意のファイル拡張子を付けることができます。それを検出する最も簡単な方法は、SQLite を使用してファイルを読み込んで開き、開くかどうかを確認することです。

リストの残りの部分は多かれ少なかれ無限であり、手法は同じです。より多くのデータベース エンジンとアクセス レイヤー ライブラリを、Katamari Damaci Database Detector Tool に追加し続けてください。

あなたがそうであるように古いデータベース形式から始めたい場合は、BDE(古代ですが、古代のものについて話している)とADOを使用して、ファイルを自動検出して開くことを検討します.

于 2011-06-04T17:11:44.463 に答える