|
|
| Zeile 1: |
Zeile 1: |
| =Vorüberlegung=
| | *[SQL Injection Datenabfrage]] |
| ==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=
| |
| <pre>
| |
| $search = $_POST['search'];
| |
| $sql = "SELECT * FROM users WHERE username='$search'";
| |
| $result = mysqli_query($link, $sql);
| |
| </pre>
| |
| ;Diese Eingabe bewirkt nun
| |
| | |
| [[Datei:Sql-injection-2.png]]
| |
| | |
| ;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=
| |
| [[Datei:Sql-injection-1.png]]
| |
| =PHP Code sicher=
| |
| <pre>
| |
| $search = mysqli_real_escape_string($link, $_POST['search']);
| |
| $sql = "SELECT * FROM users WHERE username='$search'";
| |
| $result = mysqli_query($link, $sql);
| |
| </pre>
| |
| | |
| | |
| 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.
| |
| | |
| 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.
| |