echo $begrüßung;
Da ich ein ziemlicher Neuling bin und mir php und Mysql bislang nur mit Tutorials beigebracht habe, hätte ich gerne eine Kontrolle bezüglich Sicherheitslücken.
Ich hoffe jemand von euch hat die Zeit, das mal zu überfliegen.
Ich fange mal mit news_b.php an. Lücken sind mir beim Fliegen nicht aufgefallen, aber verbesserungswürdige Dinge.
include("../db_connect.php");
Die Klammern sind überflüssig, include ist keine Funktion.
$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));
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.
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.
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?
$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.
<?php echo $titel; ?>
Preisfrage: Ist $titel HTML-gerecht ausgegeben worden oder nicht?
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
Überfliegen kann natürlich keinen gewissenhaften Test ersetzen. Den solltest du selbst so ausführlich wie möglich machen. Prüfe dabei auch mit ungewöhnlichen Eingabewerten. Wenn du Zahlen erwartest, gibt Buchstaben ein. Sonderzeichen (insbesondere ', ", \ sowie < und > (am besten als HTML-Tag, z.B. <hr>)) sollten in jedem Eingabefeld zumindest exemplarisch getestet werden. Lass solche Werte in die Datenbank eintragen und sieh dir an, ob die Ausgabe unverfälscht erfolgt. Versuch dein Script zu komprommitieren und zum Fehlverhalten zu bringen. Wenn du das nicht machst, und dabei Schwachstellen entdeckst, macht es jemand anderes.
Schau dir dann das Ganze auch aus der Sicht des Anwenders an. Sind alle Ausgaben (insbesondere Fehlermeldungen) verständlich und auch im Fehlerfall noch zielweisend und nicht nur Hinweise an den Programmierer?
echo "$verabschiedung $name";