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
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,
Da -- für ein Zeilenkommentar in SQL steht, interpretiert MySQL dies:
Und das liefert alle Einträge der Tabelle zurück.
Wirklich alle.
Und somit ist
(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
für Strings, mit
für Integers.
Das ganze kann man dann in eine Funktion bauen, wie hier:
Dann können wir integers so:
und Strings so:
escapen.
Und somit seid ihr bei korrekter Verwendung die SQL-Injection los.
Part2 (Ausgabesicherheit in Nachrichtenstrukturen) folgt!
NullPointerException
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!';
}
?>
Doch: Jetzt kommt User XYZ, und probiert aus Langeweile das aus: er gibt
Code:
' OR 1=1 --
Was ist aus unserer Query geworden?
Richtig,
Code:
SELECT * FROM `users` WHERE `kennwort` = '' OR 1=1 --'
Code:
SELECT * FROM `users` WHERE `kennwort` = '' OR 1=1
Wirklich alle.
Und somit ist
Code:
mysql_num_rows($q) != 0
Um dem vorzubeugen sollten wir die Usereingaben entsprechend escapen, also sichern.
Dies geht mit
PHP Code:
$string = mysql_real_escape_string($input);
PHP Code:
$int = intval($input);
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);
}
?>
PHP Code:
$int = escapeMe($input, true);
PHP Code:
$int = escapeMe($input);
Und somit seid ihr bei korrekter Verwendung die SQL-Injection los.
Part2 (Ausgabesicherheit in Nachrichtenstrukturen) folgt!
NullPointerException