![]() |
Wurde Datei verändert?
Hallo Leute,
in meinem Programm kann man Einstellungen in einer Textdatei speichern und auch wieder laden. Wird nun diese Datei nach dem speichern außerhalb mit einem editor verändert bekomme ich Probleme im Programm. Frage: Wie kann ich ganz einfach (muss nicht verschlüsselt und auch nicht sicher sein) feststellen ob die Datei verändert wurde und dann nur eine Meldung ausgeben: Datei wurde verändert. Laden nicht möglich! Er soll dann die Datei gar nicht erst laden. Danke. Gruß P.S.: hab schon einiges über MD5 gelesen aber nicht verstanden wie ich das auf mein Problem anwenden kann. |
Re: Wurde Datei verändert?
Hi,
also am einfachsten ist es, wenn du dir das Änderungsdatum der Datei anschaust. Du weißt ja wann die letzte Änderung stattgefunden haben darf, gab es danach noch eine... Genauso sicher gehst du natürlich auch, wenn du einfach einen MD5 (oder anderen) Hash über die Datei errechnest. Hier ist die Wahrscheinlichkeit, dass du einen gleichen Hash bei einer veränderten Datei bekommst nahezu 0 (wirklich nahe an der 0!). Gruß Der Unwissende |
Re: Wurde Datei verändert?
Du musst eine md5-Checksum der Datei generieren lassen, später nochmal und dann die Checksums vergleichen. Leider habe ich selbst noch nichts mit md5 gemacht.
Vielleicht kannst du das brauchen: ![]() |
Re: Wurde Datei verändert?
Danke euch.
@ Unwissender: Das mit dem Änderungsdatum ist gar keine schlechte Idee. Muss mal schauen wie ich das auslesen kann. Zitat:
Gruß |
Re: Wurde Datei verändert?
Und wo speicherst du das Änderungsdatum wieder ;-)
|
Re: Wurde Datei verändert?
Registry (Ich hör jetzt schon die Buh-rufe)
Eine Datei in deinem Programmordner (checksums.dat oder so ähnlich) Ein Ordner in deinem Programmordner (checksums zum Beispiel) Da gibts viele Möglichkeiten. Edit: MD5 kann gar nicht gehen, ohne die Datei zu laden. |
Re: Wurde Datei verändert?
Warum speicherst Du die Daten nicht einfach in einem anderen Format?
Dann kann auch keiner mit einem Texteditor die Datei ändern? Frank PS.: Klar geht das auch... Aber i.d.R. reicht es! |
Re: Wurde Datei verändert?
Zitat:
Ich glaub ich werd das mal versuchen mit der checksum.dat Dank euch |
Re: Wurde Datei verändert?
Die lässt sich natürlich auch verändern.
Aber ich formuliere es mal so: Wenn ein Benutzer will, dass ein Programm abstürzt, dann schafft er das auch. Du solltest so weit gehen, dass ein Benutzer nicht fahrlässig oder grob fahrlässig ein Programm abstürzen lassen kann, aber bei reinem Vorsatz kannst du auch nichts dagegen tun. ;) |
Re: Wurde Datei verändert?
Ja klar...
Ich kann auch die Exe in einen Editor laden und verändern.! :wall: Frank |
Re: Wurde Datei verändert?
*räusper*
Genau das wollte ich damit sagen. Es ist also völlig egal, in welchem Format du die Dateien abspeicherst. Ein normaler User, der einfach nur ein funktionierendes Programm will, wird sich garantiert nicht an diesen Dateien vergreifen. Alle anderen kann man vernachlässigen. |
Re: Wurde Datei verändert?
Zitat:
|
Re: Wurde Datei verändert?
Zitat:
Ich würde dir ehrlich gesagt eher zum Hash raten. Du hast ein fertige Unit in dem geposteten Link, der übergibst du die Datei und bekommst einen Hash fester Länge. Das hat echt ein paar Vorteile (beim wieder einlesen). Klar, Datumsangaben haben auch eine feste Länge, die dann aber auf anderen Systemen, z.B. englischem Windows ganz anders aussehen. Ist immer wieder ein Problem mit recht neuen Programmierern, deren Programme zwar in eigenen Tests super laufen, beim Kunden dann aber nicht mehr (es gibt wirklich häufig englische Windows Systemeinstellungen!). Wie hier schon gesagt wurde, kannst du am leichtesten das ganze als Textdatei abspeichern. Von der Registry würde ich dir abraten, ist hier einfach nicht nötig. Klar, kann man verwenden, aber dann ist die Portierbarkeit (einfach umkopieren) nicht mehr gegeben. Nimm einfach ein TIniFile. Da kannst du eine Sektion anlegen und in der dann die Zuordnungen vom Dateinamen und deinem String (z.B. dem Hash). Das ganze hätte dann ungefähr die Form:
Delphi-Quellcode:
[NACH roten Kästen]
uses iniFiles, md5;
... procedure saveMd5ToFile(const FileName : String); var iniFile : TIniFile; hash : MD5Digest; begin if FileExists(FileName) then begin iniFile := TIniFile.Create(ExtractFilePath(ParamStr(0)) + INI_FILE_NAME); try hash := MD5File(FileName); iniFile.WriteString(MD5_SECTION, FileName, MD5Print(hash)); finally iniFile.Free; end; end; // if FileExists(FileName) end; // procedure saveMd5ToFile(const FileName : String); function hasChanged(const FileName : String) : Boolean; var iniFile : TIniFile; currentHash : MD5Digest; buffer : String; begin result := True; if FileExists(FileName) then begin currentHash := MD5File(FileName); iniFile := TIniFile.Create(ExtractFilePath(ParamStr(0)) + INI_FILE_NAME); try buffer := iniFile.ReadString(MD5_SECTION, FileName, ''); if trim(buffer) <> '' then begin result := buffer = MD5Print(currentHash); end; // if trim(buffer) <> '' finally iniFile.Free; end; end; // if FileExists(FileName) end; // function hasChanged(const FileName : String); Es schadet jedenfalls nichts die Informationen abzuspeichern. Wie gesagt, man kann so leicht feststellen, ob jmd. die Datei verändert hat oder nicht. Ob es ein normaler Benutzer macht oder nicht ist ja eine andere Sache. Ich denke es war hier ja auch nicht als ernster Schutz vor der Manipulation gedacht (er wollte immerhin auch gar nicht erst verschlüsseln). Und wenn man irgendein Hashverfahren nimmt, müsste der Benutzer dann auch wissen welches genau verwendet wurde, raten kann auch dort schnell zu einem falschen Hash führen (gut, kann man natürlich disassemblieren und auslesen, aber wozu die Mühe?!) [/NACH roten Kästen] |
Re: Wurde Datei verändert?
Super so etwas hab ich gesucht!
Danke Unwissender auch für den ausführlichen Beitrag. :thumb: Gruß wallerking |
Re: Wurde Datei verändert?
Ich will ja nichts sagen, aber ich tus trotzdem mal:
Eine ähnliche Lösung hätte ich dir auch bieten können, aber dann sag bitte nicht "Laden nicht möglich!" |
Re: Wurde Datei verändert?
Es gibt nur 2 Fehler soweit ich das sehe:
1. (kleiner Fehler)
Delphi-Quellcode:
FileName bringt ja quasi nix - es wird immer auf die inifile im Programmverzeichnis zurückgegriffen ...
if FileExists(FileName) then
begin iniFile := TIniFile.Create(ExtractFilePath(ParamStr(0)) + INI_FILE_NAME); 2. (größerer Fehler) Beim speichern wird über die gesamte Datei gehasht, und dann in der Datei gespeichert. Beim Laden wird wieder über die gesamte Datei - jetzt inkl. Hash - gehasht und mit dem alten verglichen. Glaubst du, dass die beiden jemals gleich sein werden? Alles klar? ;) |
Re: Wurde Datei verändert?
Zitat:
Gruß Der Unwissende Zitat:
Zitat:
|
Re: Wurde Datei verändert?
Oh :oops: das habe ich wohl falsch verstanden - ich dachte, er wollte die Info in derselben Datei haben, wie das abgespeicherte ...
Naja ... ist ja noch nachtschlafende Zeit ... :stupid: |
Re: Wurde Datei verändert?
Moin Zusammen,
Zitat:
Genau die die das nicht wollen würden den Fehler, dass ein Programm bei ungültigen Daten abstürzt dazu benutzen zu versuchen das System zu korrumpieren. Die ganzen Angriffe die auf Buffer-Overflow und ähnlichem basieren nutzen genau so ein Verhalten eines Programmes aus. Besser wäre es die Datei auf Gültigkeit zu überprüfen, und erst dann zu verarbeiten, wenn die Daten OK sind. |
Re: Wurde Datei verändert?
Zitat:
|
Re: Wurde Datei verändert?
Zitat:
|
Re: Wurde Datei verändert?
Argh, ich hab mich verlesen. Entschuldigung an alle.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz