Tesa: Sicherheitslücken?

Beitrag lesen

Puh, erst einmal Danke für deine Antwort. Ich versuch das ganze mal der Reihe nach abzuhandeln.

include("../db_connect.php");

Die Klammern sind überflüssig, include ist keine Funktion.

Ok, ist überall verbessert.

$datum = $_POST["datum"];
  ...

Immer wieder gern gemacht und nicht nur unnötig sondern auch bedenklich. Du prüfst zum einen nicht, ob $_POST['datum'] überhaupt existiert, sondern greifst einfach drauf zu. Dann kopierst du den Inhalt ohne Not in eine harmlos aussehende Variable um. Man muss sich nun merken, dass dieser Wert eine Benutzereingabe ist. Bei einem $_POST['foo'] sieht man das hingegen ohne weiteres.

$datum = mysql_real_escape_string($datum);
  ...

Diese Aktion ist zwar richtig, aber ihre Stelle kann besser gewählt werden. Auch hier muss man sich wieder merken, dass $datum (und die anderen Werte) bereits SQL-gerecht aufbereitet sind. Was ich nicht sehe ist eine Gegenbehandlung zu den Magic Quotes. Sind die bei dir generell deaktivert? Ja: gut. Nein: Disabling Magic Quotes.

Eine passendere Stelle ist genau beim Zusammenbau des Statements. Dann kann es auch nicht passieren, dass du dieses erweiterst und oben vergisst, eine Zeile hinzuzufügen. Statt:

$editieren = "UPDATE d_news SET datum = '$datum', newstext = '$newstext' WHERE id = '$id'";

empfehle ich:

$editieren = sprintf("UPDATE d_news SET datum = '%s', newstext = '%s' WHERE id = '%s'",
    mysql_real_escape_string($datum),
    mysql_real_escape_string($newstext),
    mysql_real_escape_string($id));

Ok, ich hab die real_escape_strings an die richtige Stelle gesetzt und überall statt der Variablen direkt das $_POST["xyz"] eingesetzt. Wie ich prüfe ob es das gibt weiß ich allerdings nicht, da bräuchte ich noch einen kleinen tipp.
Die Magic Quotes sind laut phpinfo ausgeschaltet, stellen also keine "Gefahr" dar.

Du schwindelst,

$edit = mysql_query($editieren);
  $msg = "Die Nachricht wurde erfolgreich editiert.";

denn du hast hier gar nicht geprüft, ob das Statement erfolgreich ausgeführt wurde.

Auch hier wieder: Wie mache ich das am besten? In meinem Lieblingstutorial scheint dieser Teil zu fehlen :P

Weiter in index.php:

setcookie(admin_einblenden, yes, time()+(3600*24*100));

Was sind denn admin_einblenden und yes für Dinge? Konstanten, die in db_connect.php definieret wurden? Wenn nicht, dann fehlt die Kennzeichnung als String. Stelle bitte das error_reporting auf E_ALL (und display_errors auf on), dann siehst du, warum diese Stelle trotzdem "funktioniert" hat.

Er meldet mir ein
"Notice: Undefined index: admin in /home/www/webx/html/xyz/index.php on line 10"
Von den Angaben im Cookie ist nichts irgendwie definiert, der Teil soll dazu dienen die Symbole zur Administration nur auf Wunsch per Cookie einzublenden. Sieht für den normalen Benutzer ohne eben schöner aus.
Wenn ich das richtig verstanden habe ist admin_einblenden der Name des Cookies und yes der Teil, mit dem ich dann prüfe ob die If Anweisung nun wahr ist oder nicht.

Dadurch ist auch klar, dass $admin = $_GET['admin']; nur funktioniert wenn auch jemand auf den entsprechenden Link ganz unten auf der Seite geklickt hat.

Apropos db_connect.php. Hast du dort nach dem Öffnen der Verbindung die in deinen Scripten verwendete Zeichenkodierung explizit mit dem MySQL-Server ausgehandelt? Sonst ist es Zufall, wenn Zeichen jenseits von ASCII (also auch Umlaute) richtig behandelt werden. Hast du dir überhaupt Gedanken um die Zeichenkodierung gemacht?

Zu meiner Schande nein. Was sollte ich dort am besten schreiben?
In db_connect sind nur die Befehle "mysql_connect" und "mysql_select"

$starttext_abfrage = "SELECT * FROM d_starttext WHERE id = 1";
  $text = mysql_query($starttext_abfrage);
  while($row = mysql_fetch_object($text))

Hier prüfst du ebenfalls nicht, ob das Statement erfolgreich ausgeführt werden konnte, sondern machst einfach weiter. Im Fehlerfall liefert mysql_query() ein false zurück, was aber kein gültiges Argument für die Fetch-Funktionen ist.

Hier das selbe wie oben, ich bräuchte diesbezüglich etwas Nachhilfe.

<?php echo $titel; ?>

Preisfrage: Ist $titel HTML-gerecht ausgegeben worden oder nicht?

Ich hab es mit mysql_real_escape_string in die Datenbank eingetragen wenn du das meinst.

If($choice == "create")
        {
        echo $create;
        }
        elseif($choice == "edit")
        {
        echo $edit;
        }
        elseif($choice == "kill")
        {
        echo $kill;
        }
        else
        {
        echo "Fehlerhafte Anweisung!";
        }

Hier plädiere ich für ein switch, weil das übersichtlicher zeigt, was gewünscht ist

"Switch"?

Ich hab alle Eingaben mal auf verschiedene Weise durchgemacht, bislang konnte ich keine Fehler verursachen.

Schonmal danke für deine kompetente Hilfe, ich hoffe du kannst auch die letzten Unklarheiten noch klären.

Gruß Tesa