MarkusR hat geschrieben:PHP hat seine Beliebtheit dadurch gewonnen, dass es im Vergleich zu anderen Programmiersprachen sehr einfach zu Ergebnissen führte und man sich um Dinge wie Variablendeklaration nicht kümmern musste, die einfach "On-the-fly" genutzt wurden. Das führte aber auch zu zahlreichen Sicherheitsrisiken, daher werden hier zunehmend die Zügel angezogen, was eine konsequentere Code-Entwicklung bedingt.
Dies wird eigentlich schon seit Jahren mittels "Notice"-Ausgaben den Nutzern mitgeteilt und hätte zum Handeln führen können, aber in der Regel werden diese lästigen Hinweise (standardmäßig) abgeschaltet statt beachtet, bis diese in aktuellen PHP-Versionen zu "Warnings" werden und die Seiten nicht mehr funktionieren.
Diese Probleme werden uns in nächster Zeit noch häufig begegnen und begleiten, bis PHP 5 und PHP 7 endlich vollständig abgeschaltet sind, also bis November 2022. Bis dahin sind hoffentlich alle Codes korrigiert.MarkusR hat geschrieben:"Undefined array key", "Undefined variable" oder "Undefined index" sind typische Fehler, die durch PHP >= 8 auftreten.
In diesem Fall wurde versucht ein Cookie auszulesen, dass noch gar nicht gesetzt ist.
Lösung: Bei Prüfungen nicht direkt auf den zu erwartenden Wert prüfen sondern zuerst die Existenz des/der Arrays/Keys/Variable prüfen!
Problem:
Die Prüfung auf den Inhalt von Variablen/Keys, die gar nicht gesetzt wurden
Code: Alles auswählen
if ($variable) {
Code: Alles auswählen
if ($variable == "inhalt") {
Code: Alles auswählen
if ($array['key'] == "inhalt") {
Code: Alles auswählen
if ($array['key']) {
Grundsätzliche Lösung: Variablen etc. immer ordentlich deklarieren. Das ist aber recht schwer, weil man oft nicht weiß, dass sie überhaupt benötigt werden und insbesondere Array-Keys auch dynamisch gebildet werden.
Also die fallbezogene Lösung:
Bei Prüfungen wie oben gelistet vor der Prüfung auf Inhalt IMMER erst auf Existenz prüfen, wenn man nicht weiß, ob die Variable im Vorfeld deklariert wurde bzw. "undefined"-Meldungen erhält, also z.B.
Code: Alles auswählen
if (isset($variable)) {
Code: Alles auswählen
if (isset($variable) && $variable == "inhalt") {
Code: Alles auswählen
if (isset($array['key']) && $array['key'] == "inhalt") {
Code: Alles auswählen
if (isset($array['key'])) {
Lediglich Boolsche Werte (true/false) sollten genauer betrachtet werden, weil diese ggf. eine Variable füllen, aber die Prüfung aufgrund des Wertes negativ ausfällt.
Code: Alles auswählen
if ($variableBool) {
Code: Alles auswählen
if (isset($variableBool) && $variableBool === true) {
$variableBool=false
bei
Code: Alles auswählen
if (isset($variableBool)) {