Erst einmal muss ich dich darauf hinweisen, dass dein Script anfällig gegen SQL-Injection Attacken ist. Und gegen Cross-Site-Request-Forgery.
Gegen SQL-Injection kannst du dich leicht schützen: Lass niemals die Eingaben des Users ungefiltert in die Datenbank. Benutze in diesem Fall die Funktion mysql_real_escape_string(), sonst kann jeder Befehle in der Datenbank ausführen.
Die URL soll am Ende also kürzer sein und wir wollen uns gegen CSRF schützen. Benutzen wir doch einfach POST anstatt GET. Es wird dich zwar nicht super vor CSRF schützen, aber ist auf jeden Fall schonmal besser als GET. Hier also die Variante mit POST:
PHP-Code:
if(!empty($_POST['nick']) && !empty($_POST['nick2'])) {
$nick = mysql_real_escape_string(htmlentities($_POST["nick"]));
$nick2 = mysql_real_escape_string(htmlentities($_POST["nick2"]));
$conn = mysql_connect($host, $name, $pw);
mysql_select_db($db, $conn);
mysql_query("INSERT INTO mod_present (Nick, Nick2) VALUES ('".$nick."', '".$nick2."')", $conn);
mysql_close($conn);
echo "Du wurdest erfolgreich eingetragen";
} else {
echo '<form style="text-align:center;" action="./form.php" method="post">Sein Nick: <br><input
type="text" name="nick"><br><br>Dein Nick: <br><input type="text" name="nick2"><br><br><input
type="submit" value="Abschicken"></form>';
}
Was mache ich anders?1. Ich prüfe ob beide Felder mit Inhalt versehen sind, um rauszufinden ob das Formular abgesendet wurde, anstatt mich auf eine $_GET variable zu verlassen.
2. Ich filtere nicht nur HTML aus den Nicknames raus, sondern auch SQL Befehle (mysql_real_escape_string)
3. Unten im HTML (was ziemlich unsauber war

) benutze ich erstmal style="text-align:center" anstatt dem veralteten <center> tag
4. method ist jetzt "post" in dem <form> Element
Edit: Achja, die CSRF Lücke. Das wird etwas schwerer, denn wir müssen ein Token (zufällige Zeichenfolge) generieren, dass wir in der Session speichern und im Formular verstecken (verstecktes input-feld), um es dann serverseitig wieder zu überprüfen. Ich baus gleich in das Script ein, wenn ich etwas Zeit finde.
Warum du dich gegen CSRF schützen solltest? Sonst kann man dir einfach nen Link zu ner Seite schicken, die ganz einfach neue Nicknames einträgt. Unter deiner IP und Session! Als ob du das gemacht hättest!
So, hier mit CSRF-Schutz:
PHP-Code:
<?php
session_start();
// ... keine ahnung ob hier noch code ist, session_start() sollte aber schon ziemlich an den Anfang
if(!empty($_POST['nick']) && !empty($_POST['nick2'])) {
if ($_POST['token'] != $_SESSION['token']) {
die('Bitte senden Sie das Formular erneut ab, der CSRF Schutz hat diesen Zugriff verhindert!');
}
$nick = mysql_real_escape_string(htmlentities($_POST["nick"]));
$nick2 = mysql_real_escape_string(htmlentities($_POST["nick2"]));
$conn = mysql_connect($host, $name, $pw);
mysql_select_db($db, $conn);
mysql_query("INSERT INTO mod_present (Nick, Nick2) VALUES ('".$nick."', '".$nick2."')", $conn);
mysql_close($conn);
echo "Du wurdest erfolgreich eingetragen";
} else {
// zufällige Zeichenfolge generieren... auch nicht perfekt aber sollte auf jeden Fall reichen ;)
$_SESSION['token'] = md5(uniqid(mt_rand(), true));
echo '<form style="text-align:center;" action="./form.php" method="post"><input type="hidden"
name="token" value="' . $_SESSION['token'] . '">Sein Nick: <br><input type="text" name="nick">
<br><br>Dein Nick: <br><input type="text" name="nick2"><br><br><input type="submit"
value="Abschicken"></form>';
}