Problem mit MySql verbindung über PHP

Diskutiere Problem mit MySql verbindung über PHP im Programmierung Forum im Bereich Software Forum; Hallo, ich hoffe das ich das hier richtig gepostet habe, da ich es genau so gut auch in Datenbanken machen kann, aber ich fand das es hier besser...

nka

Threadstarter
Dabei seit
29.03.2010
Beiträge
699
Ort
Hamburg
Hallo,
ich hoffe das ich das hier richtig gepostet habe, da ich es genau so gut auch in Datenbanken machen kann, aber ich fand das es hier besser passt.
Ich habe ein Problem mit einer Datenbankverbindung zu Lima City. Hier mien Code:
PHP:
$verbindung = mysql_connect("Server", "Username","geheim") or die ("Server Fehler! Bitte komme später wieder!");
						mysql_select_db("db_192076_1") or die ("Server Fehler bitte komme später wieder!");
$datum = time();
			$mail = $_POST["e-mail"];
			$name = $_POST["username"];
			$passwort = md5($_POST["passwort1"]);
			$zufall .= rand(1,10000000000000);
$eintrag = ("INSERT INTO user ('username', 'email', 'passwort', 'anmeldedatum', 'regcode') VALUES ('$name', '$mail', '$passwort', '$datum', '$zufall')");
$eintragen = mysql_query($eintrag);
			if($eintragen == true)
			{
				echo "Regestrierung erfolgreich!";
			}
			else
			{
			echo "Es ist ein Fehler aufgetreten";
			}
Ich habe mir natürlich herausgenommen mein Passort nicht rein zu schreiben. Er gibt hier immer einen Fehler aus. Woran liegt das. Ich weiß da nicht mehr weiter.
Danke für eure Hilfe.
 
Zuletzt bearbeitet:

DiableNoir

Dabei seit
18.01.2004
Beiträge
6.069
Das Thema ist hier wunderbar aufgehoben. Passwörter solltest du hier auf keinen Fall posten. Es wäre besser wenn du auch den Host und den Usernamen rauslöschen würdest. ;)

Welcher Fehler wird den eigentlich ausgegeben? Es wäre leichter, den meist bietet der einen deutlichen Hinweis. Schau mal ob die Spalten in der Tabelle auch wirklich so heißen wie im INSERT-Statement. Auf jeden Fall solltest du folgendes beachten:

'$name' ist nicht das Selbe wie "$name". Du trägst hier den Wert "$name" in die Datenbank ein und nicht den Wert der Variable. PHP parst nur Sequenzen mit doppelten Anführungszeichen. In diesem Fall würdest du eigentlich gar keine brauchen. Wenn du in der Tabelle nicht überall als Datentyp VARCHAR angegeben hast (zB beim Datum) dann ist das sicher der Fehler.


BTW #1: Es wäre sauberer wenn du vor die Befehle ein @ hängen und dann mit einem if-Statement abfragen würdest ob alles geklappt hat. Das die-Statement ist schon ziemlich hart und sollte man eher für die Fehlersuche verwenden. ;)

BTW #2: Es ist keine gute Idee wenn du eine Zufallszahl als ID verwendest. Die Chance ist verdammt hoch, dass zwei User die selbe Zahl bekommen. (Egal ob mit oder ohne Seed. Jeder Zufallszahlenalgorithmus arbeitet immer nach dem selben Schema und erzeugt immer die selben Zufallszahlen.)

BTW #3: Der Code ist übrigens stark anfällig für SQL Injections. Du sollest die Werte in $_POST unbedingt erst prüfen, oder gleich eine sichere Methode wählen. Ich könnte hier dir zB als Benuternamen diesen String schicken:

Code:
'','','','',''); TRUNCATE user; --

Das würde alle deine Benutzer aus deiner Datenbank löschen. Noch fieser wäre es mit einem Update sämtliche Passwörter auf einen eigenen Wert zu überschreiben und sich dann als fremder Benutzer anzumelden.
 
Zuletzt bearbeitet:

nka

Threadstarter
Dabei seit
29.03.2010
Beiträge
699
Ort
Hamburg
Es wird der von mir eingegebene Fehler ausgegeben. Der Zweite in der letzten If Verzweigung und in die DB wird überhaupt nichts geschrieben.
Es ist nicht der ganze Code, sondern nur der Schreib Code. Hätte ich den gabzen Code mit den abfragen etc. gemacht wäre der glaube ich zu lang es ist Selbstverständlich das ich vorher nach richtigen Eingaben prüfe und doppelte Usernamen nicht zulasse. Es geht lediglich um den Eingabecode. Herauslesen aus der DB geht nämlich Problemlos. Wenn ihr wollt kann ich den ganzen Code Posten, aber ich glaube nicht, dass das hilft.
 

nka

Threadstarter
Dabei seit
29.03.2010
Beiträge
699
Ort
Hamburg
So hier ist noch einmal der ganze Code:
PHP:
<?php	
	session_start();
	include ("scripts/sitemapleft.php");
	echo "<div id=\"inhalt\">";

		  require_once('scripts/recaptchalib.php');
			$privatekey = "Geheim";
			$resp = recaptcha_check_answer ($privatekey, $_SERVER["REMOTE_ADDR"], $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"]);
			if (!$resp->is_valid) {
				$rechepta = false;
			} 
			else {
				$rechepta = true;
			}

		$pas1 = $_POST["passwort1"];
		$pas2 = $_POST["passwort2"];
		
		If ($pas1 == $pas2) $pas = true;
		else $pas = false;
		
		$verbindung = mysql_connect("Server", "User","geheim") or die ("Server Fehler! Bitte komme später wieder!");
						mysql_select_db("Datenbank") or die ("Server Fehler bitte komme später wieder!");
		$name = $_POST["username"];
		$abfrage = "SELECT username FROM user";
		$ergebnis = mysql_query($abfrage);

		while($row = mysql_fetch_object($ergebnis))
		{
			if ($row->username == $name) $name = false;
			else $name = true;
		}
		
		$mail = $_POST["e-mail"];
		$abfrage = "SELECT email FROM user";
		$ergebnis = mysql_query($abfrage);

		while($row = mysql_fetch_object($ergebnis))
		{
			if ($row->email == $mail) $email = false;
			else $email = true;
		}
		if ($_POST["agb"] == true) $agb = true;
		if ($rechepta == true and $pas == true and $name == true and $email == true and $agb == true)
		{
			$datum = time();
			$mail = $_POST["e-mail"];
			$name = $_POST["username"];
			$passwort = md5($_POST["passwort1"]);
			$zufall .= rand(1,10000000000000);
			
			$eintrag = ("INSERT INTO user ('username', 'email', 'passwort', 'anmeldedatum', 'regcode') VALUES ('$name', '$mail', '$passwort', '$datum', '$zufall')");

			$eintragen = mysql_query($eintrag);
			if($eintragen == true)
			{
				echo "Regestrierung erfolgreich!";
			}
			else
			{
			echo "Es ist ein Fehler aufgetreten.";
			}


		}
		else
		{
			echo "<h1>Registrieren</h1>";
			If ($rechepta == false) echo "Du musst die richtigen Zeichen unter dem Bild eingeben!<br>";
			If ($pas == false) echo "Sie Passwörter sind nicht identisch!<br>";
			If ($name == false) echo "Der ausgewählte Benutzername existiert schon!<br>";
			If ($email == false) echo "Du darfst dich nur einmal mit einer Mail Adresse anmelden!<br>";
			If ($agb == false) echo "Du musst das AGB  und die Regeln anerkennen!<br>";
			echo "<a href=\"newuser.php\">Zurück</a>";
		}
		echo "</div>";
		include ("scripts/sitemapdown.php");
		mysql_close($verbindung);
?>
Ich habe natürlich alle Anmeldedaten in die mysql raus genommen.
So kleine Änderung um das ganze sicherer zu machen nehme ich jetzt statt rand
$zufall = md5(uniqid()); soll angeblich einmalig sein so eine ID
 
Zuletzt bearbeitet:

nka

Threadstarter
Dabei seit
29.03.2010
Beiträge
699
Ort
Hamburg
Hat sich von selbst gelöst das Problem in der Tabelle gibt es einen Intenger als ID und Tabellen Präfix, dieser erhöht sich aber nicht automatisch, MySql hat den immer nicht angenommen, weil der ja mit 0 übergeben wurde und da er nur einmalig sein darf wird es wohl das Problem gewesen sein. Also Problem gelöst.
 

AngelCris

Dabei seit
09.08.2010
Beiträge
2
Alter
32
So hier ist noch einmal der ganze Code:
PHP:
<?php	
	session_start();
	include ("scripts/sitemapleft.php");
	echo "<div id=\"inhalt\">";

		  require_once('scripts/recaptchalib.php');
			$privatekey = "Geheim";
			$resp = recaptcha_check_answer ($privatekey, $_SERVER["REMOTE_ADDR"], $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"]);
			if (!$resp->is_valid) {
				$rechepta = false;
			} 
			else {
				$rechepta = true;
			}

		$pas1 = $_POST["passwort1"];
		$pas2 = $_POST["passwort2"];
		
		If ($pas1 == $pas2) $pas = true;
		else $pas = false;
		
		$verbindung = mysql_connect("Server", "User","geheim") or die ("Server Fehler! Bitte komme später wieder!");
						mysql_select_db("Datenbank") or die ("Server Fehler bitte komme später wieder!");
		$name = $_POST["username"];
		$abfrage = "SELECT username FROM user";
		$ergebnis = mysql_query($abfrage);

		while($row = mysql_fetch_object($ergebnis))
		{
			if ($row->username == $name) $name = false;
			else $name = true;
		}
		
		$mail = $_POST["e-mail"];
		$abfrage = "SELECT email FROM user";
		$ergebnis = mysql_query($abfrage);

		while($row = mysql_fetch_object($ergebnis))
		{
			if ($row->email == $mail) $email = false;
			else $email = true;
		}
		if ($_POST["agb"] == true) $agb = true;
		if ($rechepta == true and $pas == true and $name == true and $email == true and $agb == true)
		{
			$datum = time();
			$mail = $_POST["e-mail"];
			$name = $_POST["username"];
			$passwort = md5($_POST["passwort1"]);
			$zufall .= rand(1,10000000000000);
			
			$eintrag = ("INSERT INTO user ('username', 'email', 'passwort', 'anmeldedatum', 'regcode') VALUES ('$name', '$mail', '$passwort', '$datum', '$zufall')");

			$eintragen = mysql_query($eintrag);
			if($eintragen == true)
			{
				echo "Regestrierung erfolgreich!";
			}
			else
			{
			echo "Es ist ein Fehler aufgetreten.";
			}


		}
		else
		{
			echo "<h1>Registrieren</h1>";
			If ($rechepta == false) echo "Du musst die richtigen Zeichen unter dem Bild eingeben!<br>";
			If ($pas == false) echo "Sie Passwörter sind nicht identisch!<br>";
			If ($name == false) echo "Der ausgewählte Benutzername existiert schon!<br>";
			If ($email == false) echo "Du darfst dich nur einmal mit einer Mail Adresse anmelden!<br>";
			If ($agb == false) echo "Du musst das AGB  und die Regeln anerkennen!<br>";
			echo "<a href=\"newuser.php\">Zurück</a>";
		}
		echo "</div>";
		include ("scripts/sitemapdown.php");
		mysql_close($verbindung);
?>
Ich habe natürlich alle Anmeldedaten in die mysql raus genommen.
So kleine Änderung um das ganze sicherer zu machen nehme ich jetzt statt rand
$zufall = md5(uniqid()); soll angeblich einmalig sein so eine ID

md5 macht nix zufälliger kostet nur ein wenig mehr Rechenleistung (Bei Passwörtern auf jedenfall weiterhin benutzen!). Auch sonst ist dein Script nicht wirklich "skalierbar". Es ist schwachsinn, sich jedes mal alle Benutzernamen und E-Mail Addressen zu laden und dann auf Programmebene zu checken, ob etwas schon existiert.

Verwende doch einfach einen solchen Query, um das selbe durch MySQL lösen zu lassen (Ist ungefähr 1000-100000x mal schneller).
Code:
SELECT COUNT(*) FROM user WHERE username = 'benutzername'

Auch würde ich wirklich auf die Vorredner hören. Sicherheit wird meistens unterschätzt und sollte einen höheren Stellenwert bei der Softwareentwicklung haben. Eventuell mal googeln, das Internet ist voll mit Anleitungen. Ich kann zum Beispiel diese Anleitung empfehlen. Ist nicht ganz einfach und kostet ein wenig Zeit, aber eine sichere Anwendung ist auf jedenfall den Aufwand wert!
 

HWFlo

Dabei seit
04.09.2005
Beiträge
5.271
Alter
32
Meine Vorredner haben allesamt recht vor allem wenn der Schutz teilweise so einfach ist
Schau dir einfach mal folgende methode an
Code:
mysql_real_escape_string
 

nka

Threadstarter
Dabei seit
29.03.2010
Beiträge
699
Ort
Hamburg
Großteile des Skriptes sind sowie so schon geändert, dieser war eher gesagt ein Test ob ich überhaupt was in die DB schreiben kann. Überwiegend ist das jetzt alles sicherer. Beispiel die while schleife. Da habe ich was geändert und die Datenbank ist über einen fremden Code vor injektions geschützt. Da sonst dieser script zu groß geworden wäre.
 

nka

Threadstarter
Dabei seit
29.03.2010
Beiträge
699
Ort
Hamburg
Ich habe noch eine bessere Variante gefunden, doch so richtig kann ich damit nichts anfangen. Kann mir jemand sagen was da genau gemacht wird bzw. wie ich das einbauen muss damit es funktioniert?
PHP:
$verbindung = new PDO(geheim);

$sql = "SELECT ID FROM user WHERE username = :username AND password = :password";
$stmt = $verbindung->prepare($sql);

$stmt->bindParam( ':username', $_POST['username'] );
$stmt->bindParam( ':password', $_POST['password'] );

if($stmt->execute())
{
  $data = $stmt->fetch(PDO::FETCH_OBJ);

  echo $data->ID;
}
$result = null;
$stmt = null;
$dbc = null;

Ich komme damit nicht so recht weiter.
Danke
 

nka

Threadstarter
Dabei seit
29.03.2010
Beiträge
699
Ort
Hamburg
Hmm, du meinst das könnte auf dem Webserver gar nicht funzen? Meint ihr denn es reicht wenn ich mysql_real_escape_string benutze oder ist das immer noch zu unsicher?
 

HWFlo

Dabei seit
04.09.2005
Beiträge
5.271
Alter
32
Das eine hat mit dem anderen erst mal nicht so viel zu tun.
Ohne zu escapen ist die Verbindung mit PDO auch nicht wesentlich sicherer.
 

nka

Threadstarter
Dabei seit
29.03.2010
Beiträge
699
Ort
Hamburg
Es ging weniger um die Verbindung sondern um die allgemeine Vrerschlüsselung. Ich denke aber das der mysql_real_escape_string reicht. Oder meint ihr intval ist besser oder gibt es da überhaupt einen Unterschied?
 

ModellbahnerTT

Dabei seit
20.04.2005
Beiträge
3.778
Alter
40
Besser wäre es auf jeden Fall Callable Statments zu verwenden.
 

nka

Threadstarter
Dabei seit
29.03.2010
Beiträge
699
Ort
Hamburg
Und das heißt genau? Bei mysql_real_escape_string wird das ganze ja so geschrieben mysql_real_escape_string ($Variable) und dann ist die maskiert und/oder mysql sicher und wie sieht das dann mit Callable Statmenst aus? Wie schreibt man das?
 

ModellbahnerTT

Dabei seit
20.04.2005
Beiträge
3.778
Alter
40
callable Statment sind auch unter Stored Procedur bekannt. Wie man darauf zugreifen kann weiss ich aber leider nur in Java und C aber es sollte auch in php möglich sein.
 
Thema:

Problem mit MySql verbindung über PHP

Problem mit MySql verbindung über PHP - Ähnliche Themen

GELÖST PHP Code anpassen und funktion löschen: Hallo Leute, ich möchte um mein wissen zu erweitern, diesen PHP-Quellcode zu erweitern bzw. zu erleichtern. <?php // DB Host $server=...
PHP Code zum Datenbank eintragen geht nicht: Hier ist der Code mit dem ich die MySQL datenbank beschreiben will. Wenn ich es teste bekomme ich den Fehler <?php...
MySQL mehrere datenbanken abfragen: Moin! ich bitte um eure hilfe, ich kenn mich nicht so gut mit mysql aus, muss aber eine datei ein wenig ummodifizieren. also dersma hier die...
Umzug von PHP4 auf PHP5 und nichts funktioniert mehr so wie es sollte: Hallo, ich habe meinen Webhoster gewechselt. Mein alter hatte PHP4 und der neue nun PHP5, nun musste ich leider feststellen das einige sachen...
PHP + MySQL: Hi ich habe ein kleines Problem mit php + Mysql: Ich habe eine Tabelle mit folgenden Feldern: ID, Nachname, Vorname, Titel, EMAIL, TelNr...

Sucheingaben

content

Oben