Erstes Leck: Eigentlich solltest du wissen, ob der Request über POST oder GET reinkommt.
$_REQUEST ist nicht empfohlen, es sei denn, du brauchst es
wirklich.
Zweites Leck: Ungeprüfte Eingabe an Datenbank übergeben...
SQL:
SELECT *
FROM " . PRE_DB . "user
WHERE Name = '$_REQUEST['username']';
Mögliche Injection wäre zB:
SQL:
SELECT *
FROM " . PRE_DB . "user
WHERE Name = '' OR Name !='';
Und eventuellerweise hat jemand ein Passwort, dass mit der Eingabe übereinstimmt.
Reduzierung der Gefahr:
PHP:
$sql = "
SELECT COUNT(*)
FROM `prefix_user`
WHERE `Name` = '" . mysql_real_escape_string($_POST['username']) . "' AND
`Passwort` = '" . mysql_real_escape_string(crypt($_POST['password'], $schluessel)) . '"
LIMIT 0,1;";
$result = mysql_query($sql);
list($user_exists) = mysql_fetch_row($result);
settype($user_exists, 'boolean');
if ($user_exists == true) {
// ...
}
Das zweite Escapen ist optional, aber außer 0.000001 Sekunden mehr schadet es niemandem. Des Weiteren wird direkt in der Abfrage übreprüft, ob User und Passwort auf einen Record zutreffen. Die Limit Clause vermeidet, dass eventuell mehrere Datensätze abgeholt werden, ist aber nicht wirklich notwendig.
Anschließend wird die Anzahl (Maximal 1, minimal 0) im Script abgeholt und nach boolean umgewandelt. Wenn das dann wahr ist, kannst du zB den Benutzer als eingeloggt ansehen.
Die Grundregel für PHP - so genial ich die Programmier-, Script- oder Templatesprache auch finde - lautet: Vertraue nie der Eingabe eines Client. Demnach solltest du auch wirklich alles immer überprüfen und validieren, bevor du damit arbeitest.