Photoshop
Cinema 4d
HTML / CSS
JavaScript
PHP
Flash
Fotografie
Terragen
Webserver
Informatik
Sonstige
Seite vor SQL-Injections schützen (Php Tutorial)
Tutorial erstellt von q-tube, letzte Änderung am 11.02.2008
Das ist mein erstes Tutorial überhaupt, also freue ich mich über Rückmeldungen (positiver und negativer Art) im Forum.
Ich schreibe dieses Tutorial, weil ich nirgens im Web etwas ähnliches gefunden habe und ich denke, dass es eigentlich sehr wichtig für die Sicherheit einer Seite ist.
Ich denke diese Frage kann man am besten mit einem Beispiel beantworten:
Mal angenommen man hat gerade ein eigenes Gästebuch mit PHP und MySql für eine Website gecodet. Nun kommt jemand, der aus welchen Gründen auch immer, einen Eintrag in das Gästebuch schreibt. Beispielsweise: Hallo Welt"; mysql_query("DROP TABLE ´NameDeinerWebsite´");. Nun, es muss nicht sein, dass er beim ersten Mal Erfolg hat, doch mit ein bisschen Ausprobieren könnte er so die gesamte Tabelle löschen, denn mit "; geht er aus der echo-Anweisung und danach kann er seinen eigenen PHP-Code hineinschreiben. Auf gleiche Art und Weise lassen sich Passwörter aus Datenbanken auslesen, gezielt Benutzerdaten abfragen usw.
Dieser Vorgang wird auch häufig automatisiert durch Spider bzw. Bots, die gezielt nach Sicherheitslücken auf anderen Seiten in Foren, Gästebüchern usw. suchen.
Dies ist der Grund, warum SQL-Injections so gefährlich sind und unbedingt unterbunden werden müssen.
Meine Lösung dafür wäre eine eigene Funktion zu basteln, welche die übergebenen Variablen nach Sonderzeichen und MySql-Anweisungen durchsucht.
Code:
function checkString($string)
{
$check = array();
$check[] = "SELECT";
$check[] = "DROP";
$check[] = "INSERT";
$check[] = "TABLE";
$check[] = "CREATE";
$check[] = "DELETE";
$check[] = "UPDATE";
$check[] = "WHILE";
$check[] = "#";
$check[] = "=";
$check[] = "BETWEEN";
$check[] = "OR";
$check[] = "AND";
$check[] = ":";
$check[] = "//";
$check[] = ";";
$check[] = "'";
$check[] = "-";
$check[] = '"'; // ' + " + '
$freigabe=true;
foreach ($check as $array)
{
if(eregi($array, $string))
$freigabe=false;
}
return $freigabe;
}
Alle Zeichen oder Strings nach denen wir suchen, speichern wir im Array $check.
Danach setzten wir die Freigabe-Variable default auf true, damit die Funktion true ausgibt, falls nichts gefunden wurde.
Mit der foreach()-Schleife überprüfen wir nun für jedes Array-Element in $check, ob es im angegebenen String vorkommt. Falls dies so ist, wird $freigabe auf false gesetzt.
Schlussendlich geben wir noch $freigabe zurück.
Diese Funktion können wir nun in einer seperaten Datei speichern und dann, wenn sie benötigt wird, auf der Hauptseite inkludieren und verwenden.
Tipp: Nennt die Datei genauso wie die Funktion. So fällt es euch nachher wesentlich leichter, Funktionen zu inkludieren und zu verwenden, ohne den Funktionsnamen nachlesen zu müssen.
Code:
if(!checkString($_POST['eintrag']))
//Was passieren soll, wenn ein Sonderzeichen oder eine MySql-Anweisung gefunden wurde(z.B. header("location:index.php");)
>> Allgemeine Fragen oder Probleme mit dem Tutorial? Hier gehts zum Forum!
Ich schreibe dieses Tutorial, weil ich nirgens im Web etwas ähnliches gefunden habe und ich denke, dass es eigentlich sehr wichtig für die Sicherheit einer Seite ist.
Was sind "SQL-Injections" eigentlich?
Ich denke diese Frage kann man am besten mit einem Beispiel beantworten:
Mal angenommen man hat gerade ein eigenes Gästebuch mit PHP und MySql für eine Website gecodet. Nun kommt jemand, der aus welchen Gründen auch immer, einen Eintrag in das Gästebuch schreibt. Beispielsweise: Hallo Welt"; mysql_query("DROP TABLE ´NameDeinerWebsite´");. Nun, es muss nicht sein, dass er beim ersten Mal Erfolg hat, doch mit ein bisschen Ausprobieren könnte er so die gesamte Tabelle löschen, denn mit "; geht er aus der echo-Anweisung und danach kann er seinen eigenen PHP-Code hineinschreiben. Auf gleiche Art und Weise lassen sich Passwörter aus Datenbanken auslesen, gezielt Benutzerdaten abfragen usw.
Dieser Vorgang wird auch häufig automatisiert durch Spider bzw. Bots, die gezielt nach Sicherheitslücken auf anderen Seiten in Foren, Gästebüchern usw. suchen.
Dies ist der Grund, warum SQL-Injections so gefährlich sind und unbedingt unterbunden werden müssen.
Meine Lösung dafür wäre eine eigene Funktion zu basteln, welche die übergebenen Variablen nach Sonderzeichen und MySql-Anweisungen durchsucht.
Code:
function checkString($string)
{
$check = array();
$check[] = "SELECT";
$check[] = "DROP";
$check[] = "INSERT";
$check[] = "TABLE";
$check[] = "CREATE";
$check[] = "DELETE";
$check[] = "UPDATE";
$check[] = "WHILE";
$check[] = "#";
$check[] = "=";
$check[] = "BETWEEN";
$check[] = "OR";
$check[] = "AND";
$check[] = ":";
$check[] = "//";
$check[] = ";";
$check[] = "'";
$check[] = "-";
$check[] = '"'; // ' + " + '
$freigabe=true;
foreach ($check as $array)
{
if(eregi($array, $string))
$freigabe=false;
}
return $freigabe;
}
Erklärung
Alle Zeichen oder Strings nach denen wir suchen, speichern wir im Array $check.
Danach setzten wir die Freigabe-Variable default auf true, damit die Funktion true ausgibt, falls nichts gefunden wurde.
Mit der foreach()-Schleife überprüfen wir nun für jedes Array-Element in $check, ob es im angegebenen String vorkommt. Falls dies so ist, wird $freigabe auf false gesetzt.
Schlussendlich geben wir noch $freigabe zurück.
Diese Funktion können wir nun in einer seperaten Datei speichern und dann, wenn sie benötigt wird, auf der Hauptseite inkludieren und verwenden.
Tipp: Nennt die Datei genauso wie die Funktion. So fällt es euch nachher wesentlich leichter, Funktionen zu inkludieren und zu verwenden, ohne den Funktionsnamen nachlesen zu müssen.
Einbau in die Seite
Code:
if(!checkString($_POST['eintrag']))
//Was passieren soll, wenn ein Sonderzeichen oder eine MySql-Anweisung gefunden wurde(z.B. header("location:index.php");)
>> Allgemeine Fragen oder Probleme mit dem Tutorial? Hier gehts zum Forum!