Neues Problem bzgl. "Problem beim Durchlaufen eines Array"
Enrico
- php
Hallo,
bitte entschuldigt, dass ich einen neuen Beitrag eröffnet habe, aber ich habe dies deshalb getan, weil mein ursprüngliches Problem gelöst wurde, nun aber ein neues Problem aufgetreten ist, das mit vorgenanntem Beitrag in Zusammenhang steht.
Ausgangspunkt ist, dass ich über PHP eine ID erzeugen lasse und diese als Ausgangspunkt meines Warenkorb-Arrays verwenden möchte, d.h. alle weiteren Variablen samt deren Werte sind dieser ID untergeordnet.
Meine Überlegung hierbei war, dass an keiner Stelle ein konkretes Auslesen der ID über eine Zuordnung nach dem Muster $ID = $_SESSION['ID']
möglich sein soll, um ein Ausspionieren der ID (weitestgehend) zu unterbinden.
Ich lösche auf unserer Startseite (Code nachfolgend zusammengekürzt) zunächst alle Cookies und zerstöre etwaige Session-Daten (hoffentlich) komplett, erzeuge dann die ID und initialisiere die Session:
~~~php
<?php
session_start();
if (ini_get ("session.use_cookies"))
{
$params = session_get_cookie_params();
setcookie (session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]);
}
session_destroy();
session_start();
$chars = md5 (uniqid (mt_rand(), true));
$ID = substr ($chars, 0, 8) . '-';
$ID .= substr ($chars, 8, 4) . '-';
$ID .= substr ($chars, 12, 4) . '-';
$ID .= substr ($chars, 16, 4) . '-';
$ID .= substr ($chars, 20, 12);
$_SESSION[$ID] = md5 (uniqid ($ID, true));
?>
~~~html
<html>
<head>
</head>
<body>
<a href="SEITEN/Index.php">
<img id="Logo" src="GRAFIKEN/logo-800px.png">
</a>
</body>
</html>
Nach Anklicken unseres Logos wird auf unsere eigentliche Homepage weitergeleitet und die Session-Verwaltung über session_start(); erneut aufgerufen.
Mein Problem ist nun aber, wie ich auf die mir unbekannte ID zugreifen kann, um ihr übergebene Artikel unterordnen zu können.
~~~php
if (isset ($_SESSION[$ID]))
{
if (! is_array ($_SESSION[$ID]))
{
$_SESSION[$ID] = array();
}
$Artikel = array ('Bezeichnung' => $Bezeichnung,
'Groesse' => $Groesse,
'Farbe' => $Farbe,
'Anzahl' => $Anzahl,
'Einzelpreis' => $Einzelpreis);
array_push ($_SESSION[$ID], $Artikel);
}
else
{
echo "SESSION existiert nicht";
}
Ein Zugriff über `$_SESSION[$ID]`{:.language-php} liefert mir die Fehlermeldung "Undefined variable: ID", was auch nachvollziehbar ist, da ich keine Variable namens $ID übergeben habe.
Schreibe ich anstelle von $ID überall 'ID', dann geht die Prüfung ohne Fehlermeldung in den else-Zweig und gibt mir "SESSION wurde nicht übergeben" aus.
Wie kann ich nun aber auf diese ID zugreifen, ohne sie explizit auslesen zu müssen?
Ich drehe mich hier im Kreis:
Ich will, wie ich eingangs geschrieben habe, keine direkte Zuordnung im Code, dann könnte ich (und auch andere) sie direkt auslesen und ich sie verarbeiten (und möglicherweise andere missbrauchen).
So weiß ich aber nicht, wie ich auf sie zugreifen kann.
Könnte ihr mir hier helfen?
Vielen Dank und Gruß,
Enrico
Zusatz:
print_r(array_keys($_SESSION));
und
echo "<br><br><pre>";
var_dump ($_SESSION);
echo "</pre>";
liefern mir keine Werte, d.h. die Initialisierung hat schon mal nicht geklappt?
Gruß
Enrico
Mein letztes Posting von 16:44 Uhr ist hinfällig, das hat sich erledigt
Tach!
bitte entschuldigt, dass ich einen neuen Beitrag eröffnet habe, aber ich habe dies deshalb getan, weil mein ursprüngliches Problem gelöst wurde, nun aber ein neues Problem aufgetreten ist, das mit vorgenanntem Beitrag in Zusammenhang steht.
Gerade weil es im Zusammenhang steht, wäre es sinnvoll, dort weiterzumachen. Dann wäre nämlich auch meine Antwort über die Sinnfälligkeit deines Vorhabens mit dabei.
Meine Überlegung hierbei war, dass an keiner Stelle ein konkretes Auslesen der ID über eine Zuordnung nach dem Muster
$ID = $_SESSION['ID']
möglich sein soll, um ein Ausspionieren der ID (weitestgehend) zu unterbinden.
In $_SESSION befinden sich immer nur die Daten des einen Clients, der sich durch seine Session-ID zu erkennen gegeben hat. reset($_SESSION) liefert mir das erste Element eines Arrays, auch ohne dass ich dessen Key kenne. Den gäbe es aber auch mit key(). Und über foreach, sowie array_keys(), was du schon gefunden hast. array_values() als Alternative zu reset() gäbe es auch noch.
Du siehst, es gibt viele Möglichkeiten, wenn ich erst einmal im Kontext des Anwenders bin, seine Daten abzugreifen. Hier noch was verschleiern zu wollen, ist aussichtslos.
Und dann ist die Sesssion-ID "lebenswichtig", um einen Client wiederzuerkennen. Der muss die ID gesagt bekommen und sie bei jedem Request wieder mitsenden. Der Server allein hat ohne die vom Client gesendete ID keine Chance, irgendeine Zuordnung zu früheren Requests herzustellen.
Was du verhindern kannst, wäre eine Wiederverwendung der ID mit session_regenerate_id(). Dann gilt ab dem nächsten Request die neue ID, die per neuem Cookie (oder URL-Parameter) mitgeteilt wird. Dieses Vorgehen bei jedem Request bringt aber den Nachteil mit sich, dass der Client beim Zurücklaufen zumindest bei per URL übertragener Session-ID nicht wiedererkannt wird, weil die vom Browser gemerkte URL mit ID nicht mehr gültig ist.
Ich lösche auf unserer Startseite (Code nachfolgend zusammengekürzt) zunächst alle Cookies und zerstöre etwaige Session-Daten (hoffentlich) komplett, erzeuge dann die ID und initialisiere die Session:
Den Cookie zu löschen ist nicht weiter nützlich. Wichtiger ist, $_SESSION zu leeren, wenn die Session definiert zu Ende gebracht wurde. Dass der Client allerdings mittendrin aufhört, weitere Requests zu senden und damit eine angefangene Session eine Mindestzeitdauer und ab da bis zur nächsten Garbage Collection herumliegt, ist unvermeidbarer Teil des Session-Konzepts. Besser geht es mit dem zustandslosen HTTP nicht.
session_start();
if (ini_get ("session.use_cookies"))
{
$params = session_get_cookie_params();
setcookie (session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]);
}session_destroy();
session_start();
Du löschst also alle Cookies und "destroys all of the data associated with the current session" - was auch immer das konkret heißen mag, denn das wichtigste sind die Daten in $_SESSION, die leben bleiben.
$chars = md5 (uniqid (mt_rand(), true));
[...]
$_SESSION[$ID] = md5 (uniqid ($ID, true));
Eigentlich willst du den Hash $ID zuweisen, nehme ich an. Beim Berechnen ist jedenfalls ein Stück Zufall drin. Diese ID übergibst du aber nicht dem Client. Sie steht lediglich irgendwo in $_SESSION drin. Über das zweite session_start() wird einen neue Session-ID erzeugt und diese mittelbar (über Cookie in den Response-Headern) dem Client mitgeteilt.
Nach Anklicken unseres Logos wird auf unsere eigentliche Homepage weitergeleitet und die Session-Verwaltung über session_start(); erneut aufgerufen.
Mein Problem ist nun aber, wie ich auf die mir unbekannte ID zugreifen kann, um ihr übergebene Artikel unterordnen zu können.
Wenn sich die ID keiner merkt, kannst du darüber auch nicht mehr über die Daten zugreifen - abgesehen von den oben genannten einfachen Möglichkeiten, auch ohne sie auf die Daten zuzugreifen.
if (isset ($_SESSION[$ID]))
Neuer Request, der Variablenspeicher ist wieder jungfräulich. Nur in $_SESSION stehen "alte" Werte, wenn session_start() eine bekannte Session-ID finden konnte. Damit ist auch $ID nicht mehr vorhanden.
Ein Zugriff über
$_SESSION[$ID]
liefert mir die Fehlermeldung "Undefined variable: ID", was auch nachvollziehbar ist, da ich keine Variable namens $ID übergeben habe.
Schreibe ich anstelle von $ID überall 'ID', dann geht die Prüfung ohne Fehlermeldung in den else-Zweig und gibt mir "SESSION wurde nicht übergeben" aus.
Der String ID ist ja auch ein immer gleicher Wert. Und diesen String hast du bisher nirgends verwendet. Nun willst du ihn als Key nehmen? Du hast noch grundlegende Verständnisprobleme, wie Variablen und Literale so richtig zusammenspielen und willst ein sicherheitstechnisches Problem lösen. Das kann nicht wirklich gut enden.
Wie kann ich nun aber auf diese ID zugreifen, ohne sie explizit auslesen zu müssen?
Hellsehen geht nicht. Da sie zufällig ist, muss sie sich jemand merken - abgesehen von siehe oben.
Ich will, wie ich eingangs geschrieben habe, keine direkte Zuordnung im Code, dann könnte ich (und auch andere) sie direkt auslesen und ich sie verarbeiten (und möglicherweise andere missbrauchen).
Wie schon im anderen Posting gesagt, jemand der Code unter deinem Nutzer ausführen kann, kann problemlos sämtliche deiner Session-Dateien auslesen, ohne irgendwelche Session-IDs kennen zu müssen. Ein glob() oder opendir()/readdir() reicht da schon.
dedlfix.
Hallo dedlfix,
vielen, vielen Dank für Deine sehr ausführliche Antwort, die mich jetzt, auch in Zusammenspiel mit Deinen Antworten im anderen Threat, weiterbringen sollte.
Zusammenfassend muss man dann also sagen, egal wie man mit Sessions arbeitet, dass diese immer anfällig für Manipulationen von Außen sind?
Gruß
Enrico
Hallo,
[...] Antworten im anderen Threat
das musst du missverstanden haben; drohen wollen wir hier niemandem! ;-)
Zusammenfassend muss man dann also sagen, egal wie man mit Sessions arbeitet, dass diese immer anfällig für Manipulationen von Außen sind?
Nein, von außen eben gerade nicht, nur von innen. Session-Daten bleiben auf dem Server gespeichert und sind von außen nicht zugänglich. Die einzige mögliche Manipulation ist, eine falsche Session-ID zu übermitteln. Das führt in den allermeisten Fällen dazu, dass man eine nicht existierende Session adressiert, und das ist ebensogut wie gar keine; und es gibt eine sehr geringe Chance, dass man zufällig eine andere, ebenfalls gerade gültige Session erwischt und so die Daten eines anderen Besuchers sehen und verändern kann.
Betrachte die Session-Daten wie eine Krankenakte, die immer beim Arzt verbleibt und nie herausgegeben wird. Anhand deiner Krankenversicherungs-Nummer ordnet das Praxispersonal die Akte dir als Patient zu, wenn du in der Praxis auftauchst. Kommt nun jemand mit einer gefälschten bzw. erfundenen Nummer an, wird keine Krankenakte gefunden und einfach eine neue angelegt. Dass jemand sich zufällig eine Nummer ausgedacht hat, zu der beim Arzt tatsächlich eine Krankenakte lagert, wäre freilich denkbar, aber sehr unwahrscheinlich.
So long,
Martin
Hallo Martin,
drohen wollen wir hier niemandem! ;-)
Habe ich auch nicht so aufgefasst, freut mich aber trotzdem, dass dem nicht so ist ;-)
Auf in den Kampf, es gibt noch viel zu tun für mich :-)
Gruß
Enrico
Tach!
Auf in den Kampf, es gibt noch viel zu tun für mich :-)
Denk ich auch. Viel Erfolg dabei. Aber lass das mit der Session-Sicherheit erstmal auf sich beruhen. Verwende einmalig am Script-Start session_start() und greif einfach ohne zusätzliche Verrenkungen auf $_SESSION zu. Beim definierten Abschluss $_SESSION = array(); und fertig ist. Du kannst es besser als PHP zu machen versuchen, wenn du die anderen Kämpfe mit der Sprache gewonnen hast. - Wobei ich ja der Ansicht bin, kämpfen gegen etwas, das man verwenden muss und nicht ändern kann, ist zu sehr kräftezehrend. Besser bringt man diese Kraft auf, um die Philosophie des Systems zu verstehen, um im Einklang mit ihr die Lösungen zu suchen.
dedlfix.
Hallo dedlfix,
um im Einklang mit ihr die Lösungen zu suchen
Schön formuliert :-)
Gruß
Enrico