h41msh1c0r
Goto Top

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:

<!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?

userrechte

3. mysqli_select_db($link, "gb"); sollte doch stimmen oder nicht? wie : http://php.net/manual/de/mysqli.select-db.php


VG

Content-Key: 395048

Url: https://administrator.de/contentid/395048

Printed on: April 18, 2024 at 14:04 o'clock

Member: maretz
Solution maretz Dec 07, 2018 at 17:43:43 (UTC)
Goto Top
also - wenn du mal bei php.net guckst siehst du das es eben das select_db nich mehr gibt, das wird als 4ter parameter zu connect gepackt... das select_db brauchst du dann nicht mehr.

versuch mal nen reload von mysql - ich vermute du hast kein reload_grants gemacht nachdem du die rechte gesetzt hast.
Member: Pjordorf
Pjordorf Dec 07, 2018 at 19:52:40 (UTC)
Goto Top
Hallo,

Zitat von @H41mSh1C0R:
Wie in dem Video versuche ich das gerade nachzubauen.
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
Gruß,
Peter
Member: H41mSh1C0R
H41mSh1C0R Dec 07, 2018 updated at 20:29:34 (UTC)
Goto Top
Das dies Video von 2013 stammt ist mir bewusst.
Das umschiffen mit mysqli hatte wie du oben lesen kannst ja bereits begonnen aber das Problem war ja ein anderes.

Wenns nur ums 1:1 abschreiben gegangen wäre hätte man das sicher machen können mit den alten Softwareversionen, nur ist es nicht immer besser das auf dem aktuellen Release hinzubekommen? Wir leben ja nicht in der Vergangenheit. =)

Gruß und nur noch 40min bis zum Feierabend. =)
Member: LordGurke
LordGurke Dec 07, 2018 updated at 22:22:25 (UTC)
Goto Top
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:
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 face-sad
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.
Member: H41mSh1C0R
H41mSh1C0R Dec 08, 2018 updated at 00:33:07 (UTC)
Goto Top
Danke für deinen ausführliches Post aber ich bin der Meinung das die Video Reihe NUR grundlegend zeigen soll wie die Abläufe sind, lesen und schreiben in eine DB. Da visuell vieles schöner ist was bietet sich zu Demozwecken besser an als eine Form?

Es handelt sich hier um einen Grundkurs "Datenbanken 1". Zum veranschaulichen reicht daher das gezeigte locker aus.

Würde der Kurs sich rein um php & co drehen könnte ich deine Einwände verstehen.
Member: LordGurke
LordGurke Dec 08, 2018 at 01:16:23 (UTC)
Goto Top
Naja... Wie viele Leute suchen wohl nach dem konkreten Problem, landen auf dem Video und lassen das dann so? face-wink
Member: maretz
maretz Dec 08, 2018 at 11:09:52 (UTC)
Goto Top
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...