Seite 1 von 2

Was passiert mit Strings bei FreeStructure() ?

Verfasst: 10.09.2017 15:40
von Bisonte
Und noch eine Frage.

Code: Alles auswählen

Structure s_mystructure
  id.i
  text.s
  value.i
EndStructure

*Mem.s_mystructure = AllocateStructure(s_mystructure)

*Mem\id = 1
*Mem\value = 2831
*Mem\text = "Hallo"

FreeStructure(*Mem)
Was passiert mit dem String in der Struktur ? Meines Wissens wird ja eigentlich nur ein Zeiger auf diesen String in der "Struktur" abgelegt.
Würde also heissen, er würde noch irgendwo im RAM des Computers herumfliegen. Sehe ich das richtig ?

Und wenn dem so ist, wie kriegt man den dann weg ? Weil ich stell mir das gerade wie eine Sicherheitslücke vor, wenn die Strings noch im
Speicher sind (Monitoring) ....

Re: Was passiert mit Strings bei FreeStructure() ?

Verfasst: 10.09.2017 16:34
von Josh
Bei FreeStructure() gibt es einen Verweis auf ClearStructure()
Help hat geschrieben:ClearStructure gibt den Speicher eines strukturierten Speicherbereichs frei. Dies ist nützlich, wenn die Struktur Strings, Arrays, Listen oder Maps beinhaltet, welche intern von PureBasic allokiert wurden. 'Struktur' ist der Name der Struktur, welche zum Ausführen des Löschens verwendet werden soll. Alle Felder werden auf Null gesetzt. Es gibt keine interne Überprüfung, um sicherzustellen, dass die Struktur zum Speicherbereich passt. Diese Funktion ist nur für fortgeschrittene Anwender und sollte mit Bedacht verwendet werden.
Wenn du den String wirklich aus dem Speicher haben willst, dann müsstest du den Speicherbereich vorher mit Blanks überschreiben.

Re: Was passiert mit Strings bei FreeStructure() ?

Verfasst: 10.09.2017 16:35
von Bisonte
Das hab ich glatt überlesen. Danke.

Re: Was passiert mit Strings bei FreeStructure() ?

Verfasst: 10.09.2017 16:38
von mk-soft
Wird nicht überschrieben, aber freigegeben...

Re: Was passiert mit Strings bei FreeStructure() ?

Verfasst: 10.09.2017 17:30
von GPI
Der String wird freigeben. Problem ist allerdings, nicht überschrieben und ein Pointer auf diesen String bleibt gültig. Anfangs erhält man sogar noch den String, bis irgendwann das System den Speicher wieder verwendet und irgendwas drin landet. Und dann wirds kritisch.

Re: Was passiert mit Strings bei FreeStructure() ?

Verfasst: 10.09.2017 19:08
von Bisonte
Das war meine Befürchtung.

Also sollte man vor dem Freigeben den String mit der gleichen Länge mit irgendwas befüllen.

Re: Was passiert mit Strings bei FreeStructure() ?

Verfasst: 10.09.2017 19:41
von Josh
Das Problem hast doch nicht nur in Strukturen, das hast du bei jedem einzelnen String. Wenn es so wichtige Daten sind, dann halt immer mit Leerzeichen drüber schreiben.
Bisonte hat geschrieben:Also sollte man vor dem Freigeben den String mit der gleichen Länge mit irgendwas befüllen.
Den String mit gleicher Länge zu befüllen ist unsicher, soweit ich weiß, allociert Pb bei jeder Änderung eines Strings einen neuen Speicher. Mit PokeS() ist das auf jeden Fall sicherer.

Re: Was passiert mit Strings bei FreeStructure() ?

Verfasst: 10.09.2017 20:08
von mk-soft
In Deiner Structure ist es doch ein ganz normaler String.
Wenn du die Structure frei gibst, darf du auch nicht mehr darauf zugreifen. Ist doch normal.
Warum solltest du auf den String als Pointer zugreifen?

Mit FreeStructure wird auch der String in der Structure freigeben. Somit kommt es auch nicht zu einen Speicherleck.
Also alles Gut.

Oder hast du Angst das jemand im Arbeitsspeicher Dein Programm hackt :mrgreen:

Re: Was passiert mit Strings bei FreeStructure() ?

Verfasst: 10.09.2017 23:38
von Bisonte
mk-soft hat geschrieben:In Deiner Structure ist es doch ein ganz normaler String.
Wenn du die Structure frei gibst, darf du auch nicht mehr darauf zugreifen. Ist doch normal.
Warum solltest du auf den String als Pointer zugreifen?

Mit FreeStructure wird auch der String in der Structure freigeben. Somit kommt es auch nicht zu einen Speicherleck.
Also alles Gut.

Oder hast du Angst das jemand im Arbeitsspeicher Dein Programm hackt :mrgreen:
Nein, das nicht. Es geht mir eigentlich darum, dass WENN sensible Daten in einem String stecken, das man diese dann auch aus dem Speicher
wirklich entfernt, oder halt unlesbar macht. Das kein Speicherleck entsteht ist mir klar.

Z.b. nimm ein Datenbank Programm. Du hast ein verschlüsseltes Passwort. Dieses musst du entschlüsseln, damit du auf die Datenbank zugreifen kannst. Nach dem "Login" Vorgang würde aber bei einem "nichtfreigeben" das unverschlüsselte Passwort noch im Speicher stehen.

Und daher wollt ich nun wissen, ob bei FreeStructure() oder auch FreeMemory() mit einem String passiert.

Fazit : Der String ist noch unverändert im Speicher. Ergo : Unlesbar machen wenn sensible Daten. (natürlich VOR dem freigeben ;) )

Im Grunde das gleiche Prinzip wie bei Festplatten. Das File ist solange "rettbar", solange es nicht überschrieben wurde.

Re: Was passiert mit Strings bei FreeStructure() ?

Verfasst: 11.09.2017 17:56
von GPI
Bisonte hat geschrieben:Nein, das nicht. Es geht mir eigentlich darum, dass WENN sensible Daten in einem String stecken, das man diese dann auch aus dem Speicher
wirklich entfernt, oder halt unlesbar macht.
dann liest man es aus, wenn das Programm das noch nutzt...

Ich denke darüber brauchst du nicht so große Gedanken machen. Wenn der Rechner verseucht ist, dann wird eh alles ausgehebelt. Und das entschlüsselte Passwort - es müsste von einen anderen Programm gezielt angefordert werden (was nicht geht) und dann ausgewertet. Es müsste immer wieder Speicher anfordern und zwar eigentlich alles etc. durchsuchen und freigeben und so weiter. Das würde auffallen.

Aber wenn du sicher gehen willst, ruf ein "ClearStructure" vorher auf. Dann ists weg.