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

nka

Threadstarter
Mitglied seit
29.03.2010
Beiträge
699
Standort
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

DiableNoir

Mitglied 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

nka

Threadstarter
Mitglied seit
29.03.2010
Beiträge
699
Standort
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

nka

Threadstarter
Mitglied seit
29.03.2010
Beiträge
699
Standort
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

nka

Threadstarter
Mitglied seit
29.03.2010
Beiträge
699
Standort
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.
 
A

AngelCris

Mitglied seit
09.08.2010
Beiträge
2
Alter
31
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!
 
H

HWFlo

Mitglied seit
04.09.2005
Beiträge
5.271
Alter
31
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

nka

Threadstarter
Mitglied seit
29.03.2010
Beiträge
699
Standort
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

nka

Threadstarter
Mitglied seit
29.03.2010
Beiträge
699
Standort
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
 
H

HWFlo

Mitglied seit
04.09.2005
Beiträge
5.271
Alter
31
http://php.net/manual/de/book.pdo.php

PDO ist eine objektorientierte schnell zwischen verschiedenen DBMS "portierbare" Datenbankschnittstelle von PHP seit Version 5.x.

Bin mir nicht sicher ob sie standardmäßig mit kompiliert wird.
 
nka

nka

Threadstarter
Mitglied seit
29.03.2010
Beiträge
699
Standort
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?
 
H

HWFlo

Mitglied seit
04.09.2005
Beiträge
5.271
Alter
31
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

nka

Threadstarter
Mitglied seit
29.03.2010
Beiträge
699
Standort
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?
 
M

ModellbahnerTT

Mitglied seit
20.04.2005
Beiträge
3.778
Alter
39
Besser wäre es auf jeden Fall Callable Statments zu verwenden.
 
nka

nka

Threadstarter
Mitglied seit
29.03.2010
Beiträge
699
Standort
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?
 
M

ModellbahnerTT

Mitglied seit
20.04.2005
Beiträge
3.778
Alter
39
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

Sucheingaben

content

Problem mit MySql verbindung über PHP - Ähnliche Themen

  • GELÖST MYSQL Server 5.1 alter table Problem

    GELÖST MYSQL Server 5.1 alter table Problem: Hallo Leute! es geht um folgende alter table: alter table tab_taetigkeiten_privat add constraint plz1 foreign key PLZ references tab_plzort PLZ...
  • Problem mit Werteübergabe einer Mysql DB

    Problem mit Werteübergabe einer Mysql DB: Hi @all Mein Problem besteht darin das folgende gespeicherte Prozedur mir keine Werte ins Java-Programm übergibt. CREATE PROCEDURE `Tabelle`(OUT...
  • Problem beim Füllen einer MySQL Tabelle

    Problem beim Füllen einer MySQL Tabelle: Hallo, ich habe folgendes Problem. Wenn ich auf den MySQL-Server connected bin und versuche daten in eine Tabelle zu schreiben, bekomme ich einen...
  • Problem mit MySQL und Shopsoftware

    Problem mit MySQL und Shopsoftware: Hallo, ich wollte einen Shop einrichten und habe dafür schon mehrere ausprobiert. Selbstverständlich auch die kostenlosen oscommerce und...
  • MySQL Problem

    MySQL Problem: Nach einigen Systemupdates via "Windows Update" (automatisch) startet der MySQL Server nicht mehr. Auch beim Versuch den MySQL Server manuell zu...
  • Ähnliche Themen

    • GELÖST MYSQL Server 5.1 alter table Problem

      GELÖST MYSQL Server 5.1 alter table Problem: Hallo Leute! es geht um folgende alter table: alter table tab_taetigkeiten_privat add constraint plz1 foreign key PLZ references tab_plzort PLZ...
    • Problem mit Werteübergabe einer Mysql DB

      Problem mit Werteübergabe einer Mysql DB: Hi @all Mein Problem besteht darin das folgende gespeicherte Prozedur mir keine Werte ins Java-Programm übergibt. CREATE PROCEDURE `Tabelle`(OUT...
    • Problem beim Füllen einer MySQL Tabelle

      Problem beim Füllen einer MySQL Tabelle: Hallo, ich habe folgendes Problem. Wenn ich auf den MySQL-Server connected bin und versuche daten in eine Tabelle zu schreiben, bekomme ich einen...
    • Problem mit MySQL und Shopsoftware

      Problem mit MySQL und Shopsoftware: Hallo, ich wollte einen Shop einrichten und habe dafür schon mehrere ausprobiert. Selbstverständlich auch die kostenlosen oscommerce und...
    • MySQL Problem

      MySQL Problem: Nach einigen Systemupdates via "Windows Update" (automatisch) startet der MySQL Server nicht mehr. Auch beim Versuch den MySQL Server manuell zu...
    Oben