PHP mysqli Connect und Select DB mag nicht
Aloa in die Runde,
https://www.youtube.com/watch?v=BxaD-5cuvQg&index=86&list=PL5-HG ...
Wie in dem Video versuche ich das gerade nachzubauen.
- XAMPP installiert
- Datenbank "gb" eingerichtet
- Tabelle gb angelegt mit Nutzer, Nachricht und Datum
- User angelegt und auf "gb" berechtigt, SELECT und INSERT und Häkchen bei administrativ auf GRANT
Jetzt verwendet der Prof aus dem Video für connect und select db --> mysql_connect und mysql_select_db.
Laut aktuellem Manual deprikated. Sollte stattdessen mysqli_connect und mysqli_select_db benutzen:
Bekomme bei dem Beispiel nun folgende Warnings:
1. Warum heißen die Dinger Warnings, wenn die im error.log stehen? *gg*
2. Warum ein Access Denied? Hab die Userberechtigung auf der Datenbank oder muss die Berechtigung auf global stehen?
3. mysqli_select_db($link, "gb"); sollte doch stimmen oder nicht? wie : http://php.net/manual/de/mysqli.select-db.php
VG
https://www.youtube.com/watch?v=BxaD-5cuvQg&index=86&list=PL5-HG ...
Wie in dem Video versuche ich das gerade nachzubauen.
- XAMPP installiert
- Datenbank "gb" eingerichtet
- Tabelle gb angelegt mit Nutzer, Nachricht und Datum
- User angelegt und auf "gb" berechtigt, SELECT und INSERT und Häkchen bei administrativ auf GRANT
Jetzt verwendet der Prof aus dem Video für connect und select db --> mysql_connect und mysql_select_db.
Laut aktuellem Manual deprikated. Sollte stattdessen mysqli_connect und mysqli_select_db benutzen:
<!doctype html>
<html>
<body>
<h1> Übung Gästebuch </h1>
<form method="POST" action="./gb.php">
Ihr Name : <input type="text" name="IhrName"> <br />
Ihre Nachricht : <textarea name="IhreNachricht"></textarea> <br />
<input type="submit" />
</form>
<?php
$link = mysqli_connect('localhost', 'gbuser', 'h4s)zu', 'gb');
mysqli_select_db($link, "gb");
if ($_POST['IhrName'] AND $_POST['IhreNachricht']) {
$IhrName = $_POST['IhrName'];
$IhreNachricht = $_POST['IhreNachricht'];
$sql = "INSERT INTO gb.gb (Name, Nachricht, Datum) VALUES ('$IhrName','$IhreNachricht', now())";
$result = mysqli_query($link, $sql);
};
?>
</body>
</html>
Bekomme bei dem Beispiel nun folgende Warnings:
Warning: mysqli_connect(): (HY000/1045): Access denied for user 'gbuser'@'localhost' (using password: YES) in C:\Tools\xampp\htdocs\gb\gb.php on line 18
Warning: mysqli_select_db() expects parameter 1 to be mysqli, boolean given in C:\Tools\xampp\htdocs\gb\gb.php on line 19
1. Warum heißen die Dinger Warnings, wenn die im error.log stehen? *gg*
2. Warum ein Access Denied? Hab die Userberechtigung auf der Datenbank oder muss die Berechtigung auf global stehen?
3. mysqli_select_db($link, "gb"); sollte doch stimmen oder nicht? wie : http://php.net/manual/de/mysqli.select-db.php
VG
Please also mark the comments that contributed to the solution of the article
Content-ID: 395048
Url: https://administrator.de/contentid/395048
Printed on: September 1, 2024 at 00:09 o'clock
7 Comments
Latest comment
Hallo,
Und wenn du vorher geschaut hättest wäre auch dir aufgefallen das ein Video welches 2013 reingestellt wurde teilweise auf Softwareversionen aufgebaut ist die teils heute gar nicht mehr funktionieren müssen. Setzt deine Bastelkisten auf den Softwarestand des Authors und du kannst 1:1 abschreiben.
Gruß,
Peter
Und wenn du vorher geschaut hättest wäre auch dir aufgefallen das ein Video welches 2013 reingestellt wurde teilweise auf Softwareversionen aufgebaut ist die teils heute gar nicht mehr funktionieren müssen. Setzt deine Bastelkisten auf den Softwarestand des Authors und du kannst 1:1 abschreiben.
![php youtube date - 19a1f800d81b4cb0051cf8609ec91536 php youtube date](/images/c/2018/12/07/19a1f800d81b4cb0051cf8609ec91536.jpg)
Peter
Bei dem Video und dem Code zieht es einem ja die Schuhe aus...
Tu dir einen gefallen, und folge den Tutorials vom Herrn Preuss besser nicht mehr. Wer es selbst nicht kann, sollte nicht versuchen anderen etwas beizubringen...
Niemals, wirklich niemals, erst recht nicht zum Zwecke der Schulung aber auch sonst niemals übernimmt man Nutzereingaben ungefiltert in eine SQL-Anweisung.
Du kannst dir ja mal ausgeben lassen wie deine SQL-Anweisung aussieht, wenn du in das Feld "Ihr Name" folgendes einträgst:
Um es abzukürzen: Da käme dann heraus:
Da der doppelte Bindestrich alles, was nach ihm kommt, für MySQL vollkommen uninteressant macht, würde MySQL also ausführen:
-> INSERT INTO gb.gb (Name, Nachricht, Datum) VALUES ('irgendein Name', 'Nachricht', NOW());
-> DROP TABLE `gb`;
Ja, und dann ist deine Tabelle weg![face-sad face-sad](/images/icons/fa/light/face-frown.svg)
Nennt sich SQL-Injection und ist leicht zu bekämpfen indem man am besten direkt MySQLi sein lässt und mit PDO und Prepared Statements einsteigt. Wenn man bei MySQLi bleiben will, muss man sich dringend um "mysqli_real_escape_string()" bemühen.
Im Nachfolgenden Video wird dann das Formular ausgegeben und das, was der Nutzer reingeschrieben hat auf der Webseite ausgegeben.
Auch vollkommen ungefiltert, was es uns ermöglicht, HTML und JavaScript auf die Seite zu schleusen...
Wenn du in dein Formular also als Name z.B. einträgst:
Dann wird beim Aufruf der Seite mein Javascript ausgeführt, was im Zweifel nicht so nett ist und nur eine Message-Box anzeigt sondern dir direkt den hottesten ### der Malware-Szene installiert.
Kann man verhindern, indem man die Variablen nicht einfach nur per "echo" ausgibt sondern z.B. mit "htmlentities()" unschädlich macht.
Jetzt könnte man argumentieren, dass das ja nur ein schnelles Tutorial ist.
Nein, das sind trivialste und katastrophalste Sicherheitslücken und deren Beseitigung eben keine optionale Sache. Das sollte man den Leuten von Anfang an richtig beibringen.
Tu dir einen gefallen, und folge den Tutorials vom Herrn Preuss besser nicht mehr. Wer es selbst nicht kann, sollte nicht versuchen anderen etwas beizubringen...
Niemals, wirklich niemals, erst recht nicht zum Zwecke der Schulung aber auch sonst niemals übernimmt man Nutzereingaben ungefiltert in eine SQL-Anweisung.
Du kannst dir ja mal ausgeben lassen wie deine SQL-Anweisung aussieht, wenn du in das Feld "Ihr Name" folgendes einträgst:
irgendein Name', 'Nachricht', NOW()); DROP TABLE `gb`; --
Um es abzukürzen: Da käme dann heraus:
INSERT INTO gb.gb (Name, Nachricht, Datum) VALUES ('irgendein Name', 'Nachricht', NOW()); DROP TABLE `gb`; --', 'Beliebige Nachricht, wird aber ignoriert, weil ein doppelter Bindestrich einen Kommentar einleitet', now())
Da der doppelte Bindestrich alles, was nach ihm kommt, für MySQL vollkommen uninteressant macht, würde MySQL also ausführen:
-> INSERT INTO gb.gb (Name, Nachricht, Datum) VALUES ('irgendein Name', 'Nachricht', NOW());
-> DROP TABLE `gb`;
Ja, und dann ist deine Tabelle weg
Nennt sich SQL-Injection und ist leicht zu bekämpfen indem man am besten direkt MySQLi sein lässt und mit PDO und Prepared Statements einsteigt. Wenn man bei MySQLi bleiben will, muss man sich dringend um "mysqli_real_escape_string()" bemühen.
Im Nachfolgenden Video wird dann das Formular ausgegeben und das, was der Nutzer reingeschrieben hat auf der Webseite ausgegeben.
Auch vollkommen ungefiltert, was es uns ermöglicht, HTML und JavaScript auf die Seite zu schleusen...
Wenn du in dein Formular also als Name z.B. einträgst:
irgendein Name</td> <script type="text/javascript">alert('Herrje, selbst im Jahr 2013 war XSS ein bekanntes und bewältigbares Problem!!');</script>
Dann wird beim Aufruf der Seite mein Javascript ausgeführt, was im Zweifel nicht so nett ist und nur eine Message-Box anzeigt sondern dir direkt den hottesten ### der Malware-Szene installiert.
Kann man verhindern, indem man die Variablen nicht einfach nur per "echo" ausgibt sondern z.B. mit "htmlentities()" unschädlich macht.
Jetzt könnte man argumentieren, dass das ja nur ein schnelles Tutorial ist.
Nein, das sind trivialste und katastrophalste Sicherheitslücken und deren Beseitigung eben keine optionale Sache. Das sollte man den Leuten von Anfang an richtig beibringen.
Stimmt - und wenn die z.B. für privat was zum lernen machen wollen ist es auch nicht weiter wild. Ja, es gibt bessere Ansätze, keine Frage... Und dann könnte man auch gleich noch mit Objektorientierung anfangen, mit Funktionen, APIs,.... -> und du wirst merken das die ersten Testprojekte gleich gegen die Wand laufen.
Oder man fängt halt erst mal mit sowas an und geht dann Schritt für Schritt bei und schaut wie es besser gehen würde... Und nur mal nebenbei: Auch die Implementierung von PDO usw. ist eben nur EIN Punkt in der Kette, das hilft dir aber nicht wenn du z.B. den MySQL mit simplen Passwörtern frei ins Netz stellst,... Wenn du dann nich nen Video nur für "Hallo Welt" machen willst dürftest du gleich für nen Grundlagentraining locker mal 30h machen...
Oder man fängt halt erst mal mit sowas an und geht dann Schritt für Schritt bei und schaut wie es besser gehen würde... Und nur mal nebenbei: Auch die Implementierung von PDO usw. ist eben nur EIN Punkt in der Kette, das hilft dir aber nicht wenn du z.B. den MySQL mit simplen Passwörtern frei ins Netz stellst,... Wenn du dann nich nen Video nur für "Hallo Welt" machen willst dürftest du gleich für nen Grundlagentraining locker mal 30h machen...