Frage von mrkuddel, 90

HTML Änderungen verhindern oder Javascript sicher übergeben?

Guten Abend,

Ich habe folgendes Problem. Ich möchte von HTML/PHP zu Javascript eine Variable übergeben. Momentan mache ich das so:

Das Problem ist, dass man als Angreifer z.B. in den Editiermodus von Chrome gehen kann und dort die ID ändert und den Bereich danach anclickt. Dabei wird nun die falsche ID abgesendet und dann auch blöderweise in meine Datenbank gespeichert. (Weitergabe über AJAX (HTTP Requets) an eine PHP-Datei.

Was kann ich machen um meine Seite in dem Fall abzusichern? Wie bekomme ich eine PHP Variable sicher an mein JS weitergeleitet? Oder wie bekomme ich mit wenn jemand meine ID "heimlich" ändert?

Ich freue mich auf eure Hilfe! Liebe Grüße

Antwort
von tWeuster, 48

Also generell zu einer ID in einem Formular.

Eine ID darf niemals von einem Formular in eine Datenbank wandern. Eine ID dient der Identifikation (steckt ja schon im Namen). Wenn die ID vom Formular in die Datenbank wandert, dann kann der Angreifer in der Tat die ID ändern und schwups hast du zwei Datensätze mit der selben ID. Und inkonsistente Daten sind das schlimmste was passieren kann.

Ergo suchst du den Datensatz mit der ID erneut aus der Datenbank und änderst die restlichen Felder. Dabei bleibt nur noch die Frage ob der Benutzer diesen Datensatz ändern darf. Wenn ja, dann ändere die Daten, wenn nein, dann verwirf die Daten und gib eine Fehlermeldung aus.

Antwort
von happyfish2, 18

Um festzustellen, ob die ID geändert wurde, kannst du einen Prüfwert übergeben, z. B.

<input type=hidden" name="pruef" value="<?php echo md5($id . 'haha'); ?>" />

Dann prüfen ob der Wert zur $id passt:

if($_POST['pruef'] == md5($_POST['id'] . 'haha') )
{
// passt
}
else
{
// id wurde manipuliert
}
Antwort
von FloPinguin, 34

Du könntest die ID via PHP encrypten und dann wieder decrypten, ist aber nicht allzu elegant - ich würde die ID nur Serverseitig belassen.

Antwort
von TitusPullo, 55

Wozu brauchst du denn die ID und warum erstellst du die nicht serverseitig also mit PHP?

Kommentar von mrkuddel ,

Die ID benötige ich um ein neues DIV zu erstellen, welches dann auch wieder die ID bekommt. Dadurch kann ich dann den Benutzer dem DIV zuweisen.
Wie gebe ich die ID denn serverseitig weiter?

Kommentar von RakonDark ,

du speicherst das ganze in einer session auf dem server

und dann beim senden des ajax wird nur die ID akzeptiert .

praktischer blödsinn weil das ajax eigentlich die ID gar nicht senden brauch , die Session weiss ja welche ID der User hat , sofern du ein login bentuzt .

Sollte dem nicht so sein , machst du ein architekten fehler . und solltest dein script und workflow umschreiben


Kommentar von TitusPullo ,

Musste jetzt auch erstmal überlegen was ich schreiben soll, ich denke auch in dem ganzen steckt keine Logik und sollte nochmal komplett überarbeitet werden. Da ich das Projekt nicht kenne sowie die genutzten Technologien ist hier schwer zu helfen.

Kommentar von mrkuddel ,

Okay,
ich werde meine Architektur in dem Aspekt noch einmal überarbeiten. Vielen Dank!

Antwort
von fluffiknuffi, 23

Naja generell gilt ja der Grundsatz, dass JS erst einmal nicht zu trauen ist, da clientseitig und somit beliebig manipulierbar. Daher musst du bei jeder User-Aktion, bei der die Identität des Users eine Rolle spielt, diese immer irgendwie überprüfen und das geht ja zum Glück auch serverseitig über die Session. 

Wichtig ist aber, dass das nicht zu 100% ausreicht - jemand könnte versuchen die Session eines User zu missbrauchen, z. B. über XSS / CSRF-Attacken. Daher sollte man immer auch ein CSRF-Token mit übergeben - das ist einfach ein zufällig generierter Wert der dann serverseitig bei jedem POST-Request überprüft wird.

Beim Rendern der Website:

$_SESSION['token'] = rand();

Beim Auswerten des POSTs:


if (! isset($_POST['_token']) or $_POST['_token'] != $_SESSION['token']) {
die('Invalid token. Please try again.');
}

Template:

<form method="POST">
    <input name="_token" type="hidden" value="<?php echo($_SESSION['token']); ?>">
    ...
</form>

Keine passende Antwort gefunden?

Fragen Sie die Community