none
MDB aus einem Stream lesen RRS feed

  • Frage

  • Hallo zusammen,

    ich hoffe nicht gleich virtuell gesteinigt zu werden, aber ich habe nochmal ne Frage, diesmal hoffe ich nicht die Lösung übersehen zu haben :-)

    Es ist mir aus sicherheitsgründen nicht möglich eine MDB-Datenbank aus einer verschlüsselten ZIP-Datei auf der Festplatte abzulegen um diese dann zu öffnen und eine einzige Zeile aus einer Tabelle einzulesen.

    Also dachte ich es zu machen wie bei XML-Files etc, ich öffne das ZIP-File mit dem dazugehörenden Passwort, erstelle einen Stream und lese darüber das File ein. Das gleiche muss ich nun auch mit einer MDB-Datei machen, aber alles was ich in Bezug OleDbConnection gelesen habe ist ein Bezug auf ein physisches File, aber nicht per Stream direkt aus einer Datei oder dem MemoryStream.

    Ich brauche keinen schreibenden Zugriff, nur eben ein Feld einer Zeile aus einer Tabelle. Lege ich ein Testfile an, kann ich dieses ja auch per Excel öffnen, es ist nicht passwort geschützt (das geschieht über das ZIP-File).

    Hätte jemand dazu evtl eine Idee? Wäre so die letzte grosse Anforderung, zumindest heute :-)

    Viele Grüsse,
    Maximilian

    Sonntag, 31. Juli 2011 19:14

Antworten

  • Hallo Maximilian,

    wenn Du nicht selber das Access Datenbankformat interpretieren möchtest, gibt es keinen Weg eine MDB über einen vorhandenen Stream zu öffnen, außer diesen temporär auf der Festplatte zwischenzuspeichern. Alternative dazu wäre, die Information aus dieser Datenbank anderweitig in dem Zipfile zu speichern und dort auszulesen. Sofern Du beeinflussen kannst, wie dieses Zipfile aufgebaut sein soll.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    • Als Antwort markiert MaxiTesch Freitag, 5. August 2011 08:31
    Sonntag, 31. Juli 2011 20:06
  • Hallo Maximilian,

    Access war als Desktop Datenbank niemals für die Ablage sicherheitsrelevanter Daten gedacht.
    Und ohne einen Dateizugriff klappt es nicht - den Sharepoint Modus aussen vorgelassen
    (wo eh die Netzwerksicherheit eher mehr Probleme bereiten könnte).

    Eine RamDisk ist letztendlich auch nicht sicherer, da nicht nur Du darauf zugreifen könntest,
    (und natürlich könnte man auch einen eigenen Speicher-Dateisytemtreiber programmieren ;-)
    Nur - entsprechende Fähigkeiten vorausgesetzt -  kann man auch den Speicher auslesen.

    All das setzt aber kriminelle Energie voraus und das wäre ein Fall für die Juristen,
    und könnte über Verträge durch Konventialstrafen zusätzlich sanktioniert werden.

    Vorschlag wäre:
    Verschlüssele die Datei mit einem (komplexen) Kennwort, dann ist das Datensalat.

    Vorzugsweise mit Access 2010 (würde die ACE Treiber benötigen) -
    denn da scheint man die Verschlüsselung geändert zu haben[1]

    Nach dem Entpacken öffne die Datei im exklusiven Modus (Mode=Share Exclusive),
    womit kein zweiter darauf zugreifen kann.

    Direkt nach dem Zugriff überschreibe die Datei mit Nullen, bevor Du sie löscht.

    Dann benötigt man schon einiges Knowhow um sich Zugriff auf die Daten zu verschaffen.

    Oder Plan B: Lass es Deinen Chef machen ;-))

    Gruß Elmar

    [1] siehe http://msdn.microsoft.com/en-us/office/cc907897
    Da ich mich mit den aktuellen Versionen nicht näher beschäftigt habe,
    ggf. im Access Forum rückversichern, ob sich dabei um eine reale Verbesserung handelt.
    Die Verschlüsselung von ältere Versionen ist nicht sonderlich sicher,
    Knackprogrämmchen findet man dafür an jeder Warez-Ecke.

     

    • Als Antwort markiert MaxiTesch Freitag, 5. August 2011 08:31
    Dienstag, 2. August 2011 19:12

Alle Antworten

  • Hallo Maximilian,

    wenn Du nicht selber das Access Datenbankformat interpretieren möchtest, gibt es keinen Weg eine MDB über einen vorhandenen Stream zu öffnen, außer diesen temporär auf der Festplatte zwischenzuspeichern. Alternative dazu wäre, die Information aus dieser Datenbank anderweitig in dem Zipfile zu speichern und dort auszulesen. Sofern Du beeinflussen kannst, wie dieses Zipfile aufgebaut sein soll.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    • Als Antwort markiert MaxiTesch Freitag, 5. August 2011 08:31
    Sonntag, 31. Juli 2011 20:06
  • Hallo Thorsten,

    leider kann ich das Ablegen in der ZIP-Datei nicht beeinflussen da dies von einem Dritt-Anbieter so vorgegeben ist.

    Ich bin gerade am überlegen ob man evtl temporär eine RAM-Disk oder so anlegen könnte um dort die Datei abzulegen und zu öffnen. Kommt darauf an ob sich das bewerkstelligen lässt...

    Leider habe ich bisher auch keine Library gefunden um die Datei per Stream zu öffnen.

    Gruss,
    Maximilian

    Sonntag, 31. Juli 2011 20:20
  • Hallo Maximilian,

    wenn jemand auf eine solch dümmliche Idee kommt, dass man etwas derart wichtiges in einer MDB Datei, welche in einer ZIP-Datei steckt, ablegt und dann auch noch "wünscht", dass man aber ja nicht auf die Platte schreiben darf/soll, hat wohl selbst ein kleines Designproblem in seiner Anwendung. (Damit meine ich weniger dich, sondern den Dritt-Anbieter.

    Wenn Du zwar auf Platte schreiben darfst, die Datei aber vor Zugriffe schützen musst, könnte man darüber nachdenken, diese aus der Zip zu entpacken, eine OleDbConnection darauf zu erstellen und im direkten Anschluss einen exklusiven Lock auf die Datei zu legen. Bspw. per FileStream mit den entsprechenden Optionen. Allerdings bin ich mir nicht sicher, ob die OleDbConnection dann noch funktioniert.

    Ansonsten sehe ich das wie Thorsten.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Sonntag, 31. Juli 2011 20:42
    Moderator
  • Hallo zusammen,

    erst mal vielen Dank für die Antworten.

    Also, die Vorgabe das diese Datei nicht auf der Platte abgelegt werden darf ist noch nicht mal vom Dritt-Anbieter sondern von meinem Vorgesetzten. Ich habe heute mal versucht ihn umzustimmen, aber er will es nicht da hier eben Kundendaten gespeichert sind. Darauf habe ich das Tool erst mal soweit auf Hold gesetzt :-)

    Ganz früher (also fast Steinzeit :-) ) hatten wir zur Beschleunigung immer diese netten Ram-Disks angelegt, nur dazu musste man das System neu starten, das fällt hier eben flach. Aber auf Grundlage dieser Idee, kann man evtl ein Speicherbereich als Ram-Disk zur Laufzeit anlegen und nach dem entpacken und lesen der Datei dann wieder löschen?

    Ich habe versucht dem Parameter Data Source von OleDbConnection ein MemoryStream anzubieten, aber das mochte er ewartungsgemäss natürlich nicht. Grundsätzlich aber ist eine Datei im Speicher ja zum schreiben und lesen offen, nur klemmt es eben am Zugrif auf die Access.MDB im Speicher.

    Ich bin mal gespannt ob mein Chef nun doch das ablegen der Datei erlaubt :-)

    Viele Grüsse,
    Maximilian

    Dienstag, 2. August 2011 18:30
  • Hallo Maximilian,

    Access war als Desktop Datenbank niemals für die Ablage sicherheitsrelevanter Daten gedacht.
    Und ohne einen Dateizugriff klappt es nicht - den Sharepoint Modus aussen vorgelassen
    (wo eh die Netzwerksicherheit eher mehr Probleme bereiten könnte).

    Eine RamDisk ist letztendlich auch nicht sicherer, da nicht nur Du darauf zugreifen könntest,
    (und natürlich könnte man auch einen eigenen Speicher-Dateisytemtreiber programmieren ;-)
    Nur - entsprechende Fähigkeiten vorausgesetzt -  kann man auch den Speicher auslesen.

    All das setzt aber kriminelle Energie voraus und das wäre ein Fall für die Juristen,
    und könnte über Verträge durch Konventialstrafen zusätzlich sanktioniert werden.

    Vorschlag wäre:
    Verschlüssele die Datei mit einem (komplexen) Kennwort, dann ist das Datensalat.

    Vorzugsweise mit Access 2010 (würde die ACE Treiber benötigen) -
    denn da scheint man die Verschlüsselung geändert zu haben[1]

    Nach dem Entpacken öffne die Datei im exklusiven Modus (Mode=Share Exclusive),
    womit kein zweiter darauf zugreifen kann.

    Direkt nach dem Zugriff überschreibe die Datei mit Nullen, bevor Du sie löscht.

    Dann benötigt man schon einiges Knowhow um sich Zugriff auf die Daten zu verschaffen.

    Oder Plan B: Lass es Deinen Chef machen ;-))

    Gruß Elmar

    [1] siehe http://msdn.microsoft.com/en-us/office/cc907897
    Da ich mich mit den aktuellen Versionen nicht näher beschäftigt habe,
    ggf. im Access Forum rückversichern, ob sich dabei um eine reale Verbesserung handelt.
    Die Verschlüsselung von ältere Versionen ist nicht sonderlich sicher,
    Knackprogrämmchen findet man dafür an jeder Warez-Ecke.

     

    • Als Antwort markiert MaxiTesch Freitag, 5. August 2011 08:31
    Dienstag, 2. August 2011 19:12
  • Hallo Maximlian,

    wird die Zip-Datei direkt vom Dritt-Hersteller auf dem Zielrechner platziert? Oder lieferst Du diese mit deiner Anwendung mit?

    Da dein Chef ja komische Ideen hat, will ich dann auch mal.

    • Du lädst die Zip-Datei (ggfs. mehrfach verschlüsselt) über https auf einen Webserver
      bspw. per WebClient.UploadFile
    • Dort wird die Zip-Datei von einem Serverskript (bspw. ASP.NET unter Verwendung von DotNetZip) temporär entpackt
    • Falls gewünscht, wird das über einen eigens temp. erstellten Benutzeraccount gemacht, bei dem dann _nur_ dieser Account noch Berechtigungen für das Zielverzeichnis bzw. die Zieldatei hat. Sämtliche anderen Accounts -> kein Zugriff. Einzige Gefahr wären dann die Admins des Webservers aber bis die sich Zugriff verschafft haben, ist die Datei schon lange wieder gelöscht :)
    • Die Access DB wird serverseitig ausgelesen, die Daten in eine XML Struktur (oder auch CSV) gewandelt.
    • Das Resultat wird als mehrfach verschlüsselter String über https zurückgeliefert.
      (WebClient.UploadFile erhält als Rückgabe ein ByteArray mit der Antwort)
    • Deine Anwendung liest den verschlüsselten String, erzeugt InMemory ein lesbares Abbild davon und kann dann mit den Daten hantieren
    • Fertig

    :)

    Sämtliche Vorgaben werden eingehalten :) Keine MDB auf lokaler Platte, kein System Neustart, halbwegs sicher ist es auch. Was will man mehr^^

    Wobei mir Elmar's Plan B doch erheblich besser gefällt^^


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Dienstag, 2. August 2011 22:27
    Moderator
  • Hallo zusammen,

    mittlerweile konnte ich meinen Chef nun doch "überreden" das ich die Datei ablegen und dann auslesen darf. Euch für die Infos besten Dank :-)

    Viel Grüsse,
    Maximilian

    Freitag, 5. August 2011 06:35