SQL Injection: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(→Sicher) |
|||
Zeile 44: | Zeile 44: | ||
=Webfrontend= | =Webfrontend= | ||
[[Datei:Sql-injection-1.png]] | [[Datei:Sql-injection-1.png]] | ||
− | == | + | =Sichere Methode= |
+ | Das Sicherheitsproblem wird also dadurch verursacht, dass eine Benutzereingabe ungeprüft bzw. unverarbeitet weiter benutzt wird. | ||
+ | |||
+ | Bei der sicheren Methode wird die Benutzereingabe nicht direkt übergeben. | ||
<pre> | <pre> | ||
$search = mysqli_real_escape_string($link, $_POST['search']); | $search = mysqli_real_escape_string($link, $_POST['search']); | ||
Zeile 50: | Zeile 53: | ||
$result = mysqli_query($link, $sql); | $result = mysqli_query($link, $sql); | ||
</pre> | </pre> | ||
+ | |||
+ | In diesem Beispiel wird eine php-Funktion benutzt, die dafür sorgt, dass Sonderzeichen entwertet werden | ||
+ | |||
+ | So wird eine sicherere SQL Abfrage gebildet. | ||
+ | |||
+ | Die an die Datenbank geschickte Abfrage sieht in diesem Fall so aus: | ||
+ | |||
+ | SELECT * FROM users WHERE username='\'or\'1\'=\'1' | ||
+ | |||
+ | Prinzipiell sollten alle Daten die von Außen kommen als unsicher angesehen werden und niemals ohne eine Prüfung und/oder Bearbeitung weiterverwendet werden. |
Version vom 15. Juni 2021, 19:20 Uhr
Vorüberlegung
Verhaltensweise einer SQL Abfrage
- Normale Abfrage
- MariaDB [sql_injections]> select * from users where username = 'rudi.burkart';
+------+--------------+----------+ | id | username | password | +------+--------------+----------+ | 2 | rudi.burkart | secret | +------+--------------+----------+ 1 row in set (0.000 sec)
- Oder Verknüpfung
- MariaDB [sql_injections]> select * from users where username = 'rudi.burkart' or username = 'hans.will';
+------+--------------+----------+ | id | username | password | +------+--------------+----------+ | 2 | rudi.burkart | secret | | 1 | hans.will | geheim | +------+--------------+----------+ 2 rows in set (0.000 sec)
PHP Code
Unsicher
$search = $_POST['search']; $sql = "SELECT * FROM users WHERE username='$search'"; $result = mysqli_query($link, $sql);
- Diese Eingabe bewirkt nun
- folgende Sql Abfrage
- MariaDB [sql_injections]> select * from users where username = or '1' = '1';
+------+---------------+-------------+ | id | username | password | +------+---------------+-------------+ | 2 | rudi.burkart | secret | | 3 | erwin.lehmann | weisniemand | | 1 | hans.will | geheim | +------+---------------+-------------+ 3 rows in set (0.000 sec)
- Da '1' = '1" werden alle Datensätze angezeigt
Webfrontend
Sichere Methode
Das Sicherheitsproblem wird also dadurch verursacht, dass eine Benutzereingabe ungeprüft bzw. unverarbeitet weiter benutzt wird.
Bei der sicheren Methode wird die Benutzereingabe nicht direkt übergeben.
$search = mysqli_real_escape_string($link, $_POST['search']); $sql = "SELECT * FROM users WHERE username='$search'"; $result = mysqli_query($link, $sql);
In diesem Beispiel wird eine php-Funktion benutzt, die dafür sorgt, dass Sonderzeichen entwertet werden
So wird eine sicherere SQL Abfrage gebildet.
Die an die Datenbank geschickte Abfrage sieht in diesem Fall so aus:
SELECT * FROM users WHERE username='\'or\'1\'=\'1'
Prinzipiell sollten alle Daten die von Außen kommen als unsicher angesehen werden und niemals ohne eine Prüfung und/oder Bearbeitung weiterverwendet werden.