dedlfix: Sicherheitslücken?

Beitrag lesen

echo $begrüßung;

[...] ü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 Funktion isset() prüft auf das Vorhandensein von Variablen. Da Arrayelemente auch nur Variablen sind kann man sie auch darauf anwenden:
  if (isset($_POST['xyz'])) ...
bzw.
  if (! isset(...)) setze Defaultwert.

setcookie(admin_einblenden, yes, time()+(3600*24*100));
Was sind denn admin_einblenden und yes für Dinge?
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.

Das sind doch sicher Strings. Notiere sie als solche in Anführungszeichen. Ohne Anführungszeichen sind es Konstanten-Bezeichner, die PHP aber beim Nichtfinden einer mit diesem Namen definierten Konstante als Strings ansieht.

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?

Zum Einstieg in das Thema empfehle ich aus dem Themenbereich http://de.selfhtml.org/inter/index.htm@title=Internationalisierung mindestens den Artikel <http://de.selfhtml.org/inter/sprache.htm@title=Computer und geschriebene Sprache>. Auch die nächsten beiden können nicht schaden. Du müsstest dich dann entscheiden, ob du ISO-8859-1/Latin1 oder UTF-8 verwenden möchtest. ISO-8859-1 ist hierzulande (nach meinem Gefühl) noch am weitesten verbreitet. UTF-8 mit seinen Vorteilen gewinnt zwar Land, stellt aber Anfänger und teilweise auch die Systeme (z.B. PHP kleiner als Version 6) gelegentlich vor Probleme.

Jedem am Datenverarbeitungsprozess beteiligten System muss klar sein, welche Kodierung die zu verarbeitenden Daten haben. Das muss beziehungsweise sollte man dem System mitteilen, wenn man sich nicht auf die gegebenenfalls unterschiedlichen Default-Einstellungen verlassen möchte. Für HTTP als charset-Angabe im Content-Type-Header, für HTML im Meta-Element Content-Type (HTTP hat Vorrang vor der HTML-Angabe). Selbstverständlich müssen die Daten dann auch in dieser Kodierung vorliegen. Das setzt als Folge auch einen Editor voraus, der in der gewünschten Kodierung speichern kann. (UTF-8 bitte ohne BOM speichern.)

Um dem MySQL-Server die auf der Verbindung zwischen ihm und PHP zu verwendende Kodierung mitzuteilen gibt es die Funktion mysql_set_charset(). Falls diese noch nicht vorhanden ist, geht auch ein nach dem Verbindungsaufbau abgesetztes Statement SET NAMES latin1 bzw. utf8.
Auch die Kodierungsangabe der einzelnen Felder sollte angemessen eingestellt sein. Angaben der Tabelle oder der Datenbank zählen nur als Default-Wert für neu angelegte Felder oder Tabellen.

Das war auf die Schnelle nur das Wichtigste. Bei Bedarf bitte auch das hiesige Archiv befragen.

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.

Werte das Ergebnis der mysql_*-Funktionen aus und reagiere angemessen. Informiere dich im Handbuch, wann welches Ergebnis zurückgegeben wird. Oft sieht man

mysql_...(...) or die(fehlermeldung);

Das ist schnell notiert aber kein guter Stil. Wegen Datenbankfehler muss man keinen Script-Selbstmord begehen. Besser ist:

if ($connection = mysql_connect(...)) {
    Tu was mit der Connection.
  } else {
    Erzähl dem Anwender, dass sein Anliegen grad nicht ausgeführt werden konnte, aber keine technischen Details.
    Technische Details (z.B. die Ausgabe von mysql_error()) braucht nur der Administrator. Informiere diesen, z.B. per Mail.
    Gib Alternativen an, die dem Anwender helfen, sein Ziel dennoch zu erreichen.
  }

Nach diesem Prinzip müsstest du auch mit den Querys verfahren.

Da du die Connection in einer Include-Datei aufbaust, lässt sich dieses if-Konstrukt nicht direkt wie oben notiert anwenden. Statt dessen müsstest du im Haupt-Script prüfen, ob die Verbindung eine ist oder nicht. Es reicht dabei, sie per
  if ($connection)
zu testen.

<?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.

Nein, falscher Kontext. Die Behandlung mit mysql_real_escape_string() ist nicht für die Speicherung in der Datenbank da sondern für die Notation im SQL-Statement. Nur auf dem Weg zum SQL-Server müssen die Daten in ein SQL-Statement eingebettet werden und dabei muss unterschieden werden können ob Zeichen (wie ', " und ) zu den Daten gehören oder Syntax-Bestandteil (z.B. Stringbegrenzungszeichen) sind. In der Datenbank kommen die Zeichen in ihrer unbehandelten Form zu liegen und bei einer Abfrage auch so wieder zum Client zurück. Wenn du sie nun in einen HTML-Kontext bringst, musst du sie nun für den HTML-Kontext behandeln. Das hast du an anderen Stellen ja schon mit htmlspecialchars() praktiziert.

If($choice == "create")
        elseif($choice == "edit")
        elseif($choice == "kill")
        else
Hier plädiere ich für ein switch, weil das übersichtlicher zeigt, was gewünscht ist
"Switch"?

switch.

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

Schon mal sehr gut. Bedenke aber, dass Sicherheit kein Ruhekissen ist.

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

Falls noch was übrig geblieben ist oder neue Fragen aufgetaucht sind, frag einfach. Beantworten muss es aber jemand anderes. Ich bin dann mal weg.

echo "$verabschiedung $name";