Hallo,
ich dachte mir, mal ein Tutorial über Sicherheit in PHP-Skripten zu machen.
Na dann fang ich wohl an^^
Vorraussetzung ist PHP & MySQL zu können.
SQL-Injections sind der Albtraum eines jeden Webmasters.
Doch was ist eine SQL-Injection?
Wie der Name schon sagt wird SQL-Code in deinen SQL-Code eingeschleust.
Um das zu demonstrieren hier ein PHP-Script.
NICHT BENUTZEN! BEINHALTET SICHERHEITSLÜCKE
PHP Code:
<?php
//Wir nehmen an per POST wurde ein Kennwort an dieses Skript gesendet,
//es befindet sich im Element mit dem Key 'unsicher'
$unsicher = $_POST['unsicher'];
//Das Kennwor überprüfen wir nun in der DB und schauen ob es vorhanden ist.
$q = mysql_query("SELECT * FROM `users` WHERE `kennwort` = '".$unsicher."'");
//Nun behandeln wir den user entsprechend.
if (mysql_num_rows($q) != 0) {
echo 'Eingeloggt!';
} else {
echo 'Nix da!';
}
?>
So. Sieht auf den ersten Blick ja nicht so falsch aus.
Doch: Jetzt kommt User XYZ, und probiert aus Langeweile das aus: er gibt
ein.
Was ist aus unserer Query geworden?
Richtig,
Code:
SELECT * FROM `users` WHERE `kennwort` = '' OR 1=1 --'
Da -- für ein Zeilenkommentar in SQL steht, interpretiert MySQL dies:
Code:
SELECT * FROM `users` WHERE `kennwort` = '' OR 1=1
Und das liefert alle Einträge der Tabelle zurück.
Wirklich alle.
Und somit ist
Code:
mysql_num_rows($q) != 0
(außer wenn die Tabelle leer ist) automatisch erfüllt - der User ist drin, ohne das Kennwort zu kennen.
Um dem vorzubeugen sollten wir die Usereingaben entsprechend escapen, also sichern.
Dies geht mit
PHP Code:
$string = mysql_real_escape_string($input);
für Strings, mit
PHP Code:
$int = intval($input);
für Integers.
Das ganze kann man dann in eine Funktion bauen, wie hier:
PHP Code:
<?php
function escapeMe($data, $isInt = false)
{
if ($isInt)
return intval($data);
return mysql_real_escape_string($data);
}
?>
Dann können wir integers so:
PHP Code:
$int = escapeMe($input, true);
und Strings so:
PHP Code:
$int = escapeMe($input);
escapen.
Und somit seid ihr bei korrekter Verwendung die SQL-Injection los.
Part2 (Ausgabesicherheit in Nachrichtenstrukturen) folgt!
NullPointerException