AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wurde Datei verändert?

Ein Thema von BrotherLui · begonnen am 24. Aug 2006 · letzter Beitrag vom 24. Aug 2006
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#11

Re: Wurde Datei verändert?

  Alt 24. Aug 2006, 11:18
*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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
BrotherLui

Registriert seit: 14. Jun 2006
26 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: Wurde Datei verändert?

  Alt 24. Aug 2006, 11:24
Zitat:
Ein normaler User, der einfach nur ein funktionierendes Programm will, wird sich garantiert nicht an diesen Dateien vergreifen.
So rum hab ich mir das auch noch nicht überlegt. Aber irgedwo hast du Recht.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#13

Re: Wurde Datei verändert?

  Alt 24. Aug 2006, 11:40
Zitat von 3_of_8:
Edit: MD5 kann gar nicht gehen, ohne die Datei zu laden.
Na ja, wenn du das Änderungsdatum lesen möchtest, wird auch lesend auf das Dateisystem zugegriffen (gut, nicht direkt die Datei, aber egal). Ich denke es ging hier eigentlich nur darum, dass sein Programm die Datei einliest und dabei irgendwas mit der Datei macht. wenn die jetzt extern verändert wurde, muss die also nicht mehr konsistent sein und das möchte er verhindern. Lesen sollte also kein Problem sein, es darf halt nur nichts mit dem Inhalt gemacht werden (ausser erstmal den Hash berechnen).

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:
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);
[NACH roten Kästen]
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]
  Mit Zitat antworten Zitat
BrotherLui

Registriert seit: 14. Jun 2006
26 Beiträge
 
Delphi 7 Enterprise
 
#14

Re: Wurde Datei verändert?

  Alt 24. Aug 2006, 12:17
Super so etwas hab ich gesucht!
Danke Unwissender auch für den ausführlichen Beitrag.

Gruß
wallerking
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#15

Re: Wurde Datei verändert?

  Alt 24. Aug 2006, 12:21
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!"
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#16

Re: Wurde Datei verändert?

  Alt 24. Aug 2006, 12:23
Es gibt nur 2 Fehler soweit ich das sehe:

1. (kleiner Fehler)
Delphi-Quellcode:
if FileExists(FileName) then
  begin
    iniFile := TIniFile.Create(ExtractFilePath(ParamStr(0)) + INI_FILE_NAME);
FileName bringt ja quasi nix - es wird immer auf die inifile im Programmverzeichnis zurückgegriffen ...

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?
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#17

Re: Wurde Datei verändert?

  Alt 24. Aug 2006, 12:29
Zitat von 3_of_8:
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!"
Hey, ist doch hier kein Contest oder so. Ich meine es zweifelt doch keiner an deiner Kenntnis! Sicherlich hätten du und andere sogar eine schönere Lösung hinbekommen, aber ich habe jetzt einfach mal in die Beiträge von BrotherLui reininterpretiert, dass er da noch gar keine (sehr geringe) Kenntnis hat und von daher den Code gepostet. Also ganz entspannt nochmal lesen, was er sagte und dann siehst du, dass er sicherlich auch aus deinen Tipps eine Menge gelernt hat! (z.B. über die Möglichkeiten eine Datei zu verändern)

Gruß Der Unwissende
Zitat von jfheins:
Es gibt nur 2 Fehler soweit ich das sehe:

1. (kleiner Fehler)
Delphi-Quellcode:
if FileExists(FileName) then
  begin
    iniFile := TIniFile.Create(ExtractFilePath(ParamStr(0)) + INI_FILE_NAME);
FileName bringt ja quasi nix - es wird immer auf die inifile im Programmverzeichnis zurückgegriffen ...
INI_FILE_NAME soll natürlich eine Konstante sein, die den Namen der Ini-Datei enthält! [EDIT]Und FileName enthält den Pfad zu der Datei, über die der Hash gebildet wird![/EDIT]

Zitat von jfheins:
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?
Der Hash einer Datei (nicht der Ini!) wird in einer Ini abgelegt. Das heißt du bildest den Hash über die Datei Blubb.txt und speicherst den Hash in deiner Ini. Hoffe das wurde von anderen richtig verstanden.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#18

Re: Wurde Datei verändert?

  Alt 24. Aug 2006, 12:35
Oh 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 ...
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#19

Re: Wurde Datei verändert?

  Alt 24. Aug 2006, 13:17
Moin Zusammen,

Zitat von 3_of_8:
Ein normaler User, der einfach nur ein funktionierendes Programm will, wird sich garantiert nicht an diesen Dateien vergreifen. Alle anderen kann man vernachlässigen.
Das sehe ich anders.
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#20

Re: Wurde Datei verändert?

  Alt 24. Aug 2006, 13:21
Zitat von Der_Unwissende:
Zitat von 3_of_8:
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!"
Hey, ist doch hier kein Contest oder so.
Hab ich auch nie behauptet. Ich wollte damit sagen, dass es schwer ist, jemandem zu helfen, wenn er falsche Angaben macht, also sagt "Laden nicht möglich", im Endeffekt das doch möglich ist.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz