Hi Leutz,
da ich hier immer wieder in euren Codes Sachen sehe, die mich total aggressiv machen, möchte ich euch jetzt ein paar Tipps geben, wie ihr mein Leben hier erträglicher machen könnt. Vielen Dank für eure Aufmerksamkeit!
Also fangen wir einfach mal klein bei Numero 1 an. Hier hätten wir ein kleines Script:
<?php
if (isset($_POST['flags'], $_POST['content']) && strlen($_POST['flags'] = trim(mysql_real_escape_string(htmlspecialchars($_POST['flags'])))) > 1 && strlen($_POST['flags'] = trim(mysql_real_escape_string(htmlspecialchars($_POST['content'])))) > 1) {
mysql_connect(....);
mysql_select_db(...);
mysql_query('INSERT INTO ... (flags, content) VALUES (\''.$_POST['flags'].'\',\' '.$_POST['content'].'\')');
}
?>
<!-- post !-->
<html><body><form method="post"><input type="hidden" name="flags" /><input type="text" name="content" /><input type="submit" /></form></body></html>
<!-- end !-->
<!-- list !-->
<?php
$qy = mysql_query('SELECT flags FROM ...');
while ($row = mysql_fetch_array($qr)) {
echo htmlspecialchars($row[0]) . '<br />';
}
?>
<!-- end !-->
Alles anzeigen
Okay. Dieses Problem ist jetzt nicht all zu tragisch, kann jeder falsch machen. Trotzdem könnte es in diesem Fall erhebliche Performance Probleme geben, falls viele Einträge vorhanden sind. Erahnt ihr das Problem?
Hier ist die Auflösung:
Spoiler anzeigen
Nehmen wir mal 2 Sachen aus dem Code..
$_POST['flags'] = trim(mysql_real_escape_string(htmlspecialchars($_POST['flags'])));
mysql_query('INSERT INTO ... (flags, content) VALUES (\''.$_POST['flags'].'\',\' '.$_POST['content'].'\');
So, was können wir feststellen? $_POST['flags'] wird in der ersten Zeile für die SQL-Abfrage escapt und dann zusätzlich noch gegen XSS-Attacken und (teilweise) gegen Spam geschützt. Danach wird $_POST['flags'] in eine Tabelle eingetragen. Soll auch so sein, hier können wir keinen Fehler entdecken.
Nehmen wir noch ein paar Zeilen raus:
Wir sehen, dass es wieder vor HTML gesichert wird, nämlich 2-mal. Etwas unnötig, oder? Das ist nur ein kleines Beispiel so was könnte man bei etlichen anderen Funktionen auch machen. Aber bedenkt bitte: Falls ein Eintrag geändert/hinzugefügt werden kann, wo er nicht gegen HTML gesichert wird und man keinen Zugriff auf diese Server-Dateien hat, dann empfehle ich euch die XSS-Protection in der SQL-Query einfach wegzulassen und sie bei der Ausgabe stehen zu lassen.
Schön und gut, weiter geht es mit der 2. Da hätten wir noch ein Script:
<?php
// mysql connection und so weiter..
$q = mysql_fetch_assoc(mysql_query('SELECT * FROM ... ORDER BY id DESC LIMIT 1'));
echo 'Hallo.. der neuste Benutzer hat die ID '.$q['id'].' und er hat '.$q['coins'].' Taler!';
?>
Wer kennt das Problem? Die Lösung:
Spoiler anzeigen
Wenn du die Query..
.. hast, dann werden mit * alle Spalten abgefragt, da wir aber nur zwei brauchen werden hier etliche andere Spalten umsonst abgefragt.
Also.. kurz und knapp: Wenn du z.b. nur ID und Taler eines Users abfragen möchtest und nicht mehr brauchst, dann musst du nicht mehr eingeben als
Simpel, nicht?
Und falls du am Ende nur eine Spalte abfragen möchtest, empfehle ich dir die Funktion 'mysql_result'.
Alle guten Dinge sind drei.. kommen wir zum 3ten Punkt:
Okay.. das Problem müsste jeder erkennen.
Spoiler anzeigen
In PHP muss man keine Datentypen angeben, weswegen die Sprache sehr oft von Anfängern gelernt wird, da sie unkompliziert ist und alle denken, sie müssen sich keine Gedanken über den Speicher machen. Es gibt in PHP (versteckt) unter anderem Datentypen wie Integer (Zahl) und String (Kette von Zeichen) oder Boolean (wahr oder falsch). Jeder Datentyp verbraucht eine andere Anzahl an Bits und hat speziell dafür gemachte Methoden. Mit den zwei Zeichen " und ' initialisiert du normalerweise einen String, für einen Integer reicht einfach nur eine Zahl. Wir sehen also oben im Code $count wird als String initialisiert und hat als Inhalt eine Zahl. Wieso nicht gleich als Integer initialisieren? So würde $count unter anderem weniger Speicher verbrauchen und bei Rechenoperationen müsste der String nicht immer in einen Integer umgewandelt werden.
Wir machen also stattdessen:
So, das waren erstmal 3. Mir fallen noch 1000 weitere ein, aber ich hatte jetzt einfach keine Lust mehr weiterzuschreiben. Gegebenenfalls folgen weitere Tipps, falls ich mal wieder nichts zu tun habe.
Cheers
Steve Winfield