You are not logged in.

  • Login

Dear visitor, welcome to Coder Forum. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Tuesday, February 20th 2007, 4:54pm

Problem mit Script auf Server - get_magic_quotes falsch ???

Hi Leute,

hab mal wieder ein Problem. Wenn ich den folgenden Code lokal auf meinem Rechner ausführe funktioniert alles bestens. Nur wenn ich ich diesen auf meinen Server uploade und aufrufe, dann scheint es nicht zu klappen. Es gibt immer:

HTML Code

1
Die email-Adresse wird bereits vergeben. (Zeile 71)


aus.

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// Prüfen, ob alle notwendigen Felder ausgefüllt wurden
$MustFilled = array ("domain","anrede","vorname","nachname","strasse","plz","ort","land","vorwahl","telefon","email","username","pass","pass2");
$FillError=false;
foreach ($MustFilled as $Item) {
if (!isset($_REQUEST[$Item]) or trim($_REQUEST[$Item])=="") $FillError=true;
}
if ($FillError) {
	$fehler = 'Sie m&uuml;ssen alle notwendigen Felder ausgef&uuml;llen.<br>Gehen Sie zur&uuml;ck und korregieren Sie dies.';
} elseif ($_POST['pass'] != $_POST['pass2']) {
	$fehler = 'Die angebenen Passw&ouml;rter stimmen nicht &uuml;berein.<br>Gehen Sie zur&uuml;ck und korregieren Sie dies.';
} elseif ((!isset($_REQUEST['agb'])) || (!isset($_REQUEST['datenschutz']))) {
	$fehler = 'F&uuml;r einen Vertragsabschluss m&uuml;ssen Sie unsere AGB und die Datenschutzrichtlinien akzeptieren.<br />
			Bitte gehen Sie zur&uuml;ck und markieren die H&auml;kchen.';
} else {
	// Temporäre Variablen setzen
	$newuser = true; // Deklaration eines neuen Users (Standard)
	$status = "1"; // Status über den Bearbeitungsstand festlegen (1 = "in Bearbeitung ohne KK-Antrag")
 
	// Status über den Bearbeitungsstand festlegen, wenn KK-Antrag gestellt werden muss
	if (isset($_POST['kk'])) { 
		$status = "2"; // (2 = "in Bearbeitung mit KK-Antrag")Angeben, ob ein KK-Antrag gestellt werden muss.
	}
 
	// Vertragnummer generieren
	$maxvertragnr = 'SELECT MAX(id) FROM kcc_vertrag';
	$vertragnr = mysql_result(mysql_query($maxvertragnr),0);
	if ($vertragnr == "") { mysql_query('ALTER TABLE `kcc_vertrag` auto_increment = '.$start_vertragnr); }
 
	// Kundenummer generieren
	$maxkndnr = 'SELECT MAX(id) FROM kcc_user';
	$kndnr = mysql_result(mysql_query($maxkndnr),0);
	if ($kndnr == "") { mysql_query('ALTER TABLE `kcc_user` auto_increment = '.$start_kndnr); }
 
	// Prüfen, ob Benutznamen bereits vergeben
	$query = mysql_query(sprintf('SELECT username FROM kcc_user WHERE username=%s',quote_smart($_POST["username"])));
	$result = mysql_num_rows($query);
	if ($result > "0") {
		$username = true;
	}
 
	// Prüfen, ob email bereits vergeben
	$query = mysql_query(sprintf('SELECT email FROM kcc_user WHERE email=%s',quote_smart($_POST["email"])));
	$result = mysql_num_rows($query);
	if ($result > "0") {
		$email = true;
	}
 
	// Prüfen, ob Benutzname, email, Passwort gleich sind.
	if (isset($username, $email)) {
		$query = mysql_query(sprintf('SELECT email,passwort FROM kcc_user WHERE username=%s',quote_smart($_POST["username"])));
		$result = mysql_fetch_array($query);
		if (($result['email'] == $_POST["email"]) && ($result['passwort'] == $_POST["pass2"])) {
			$authentic = true;
			unset ($newuser);
		} else {
			$wrongpass = true;
		}
	} else {
		$wrongpass = true;
	}
 
	if (isset($wrongpass)) {
		// Wenn Username vorhanden, aber die email-Adresse nicht übereinstimmt
		if (isset($username)) {
			$fehler = 'Der Username ist bereits vergeben.';
			unset ($newuser);
		}
		// Wenn email vorhanden, aber der Username nicht übereinstimmt
		if (isset($email)) {
			$fehler = 'Die email-Adresse wird bereits vergeben.';
			unset ($newuser);
		}
	}
 
 
	// Weiteres Paket eines vorhanden authentifizierten Kunden eintragen oder komplett eintragen bei neuen Kunden
	if (isset($authentic)) {
		$paket = mysql_query('INSERT INTO kcc_vertrag (username,paket,status) 
				VALUES ("'.$_POST["username"].'","'.$_POST["paketauswahl"].'","'.$status.'")');
	} 
	if (isset($newuser)) {
		$adresse ='INSERT INTO kcc_user
		(anrede,titel,vorname,nachname,firma,kontakt,strasse,plz,ort,land,vorwahl,
		telefon,faxvorwahl,fax,email,username,passwort,umst_nachw,nl_akt,nl_art)
		VALUES ("'.$_POST["anrede"].'","'.$_POST["titel"].'","'.$_POST["vorname"].'","'.$_POST["nachname"].'",
		"0","0","'.$_POST["strasse"].'","'.$_POST["plz"].'","'.$_POST["ort"].'","'.$_POST["land"].'",
		"'.$_POST["vorwahl"].'","'.$_POST["telefon"].'","'.$_POST["faxvorwahl"].'","'.$_POST["fax"].'",
		"'.$_POST["email"].'","'.$_POST["username"].'","'.$_POST["pass2"].'","0","1","1")';
		$adresse_save = mysql_query($adresse) or die(mysql_error());
		$bankdaten = 'INSERT INTO kcc_bankdaten (username,ktoname,ktonr,blz,institut,paypal,zahlart)
		VALUES ("'.$_POST["username"].'","","","","","","0")';
		$bankdaten_save = mysql_query($bankdaten) or die(mysql_error());
		$paket = mysql_query('INSERT INTO kcc_vertrag (username,paket,status) 
				VALUES ("'.$_POST["username"].'","'.$_POST["paketauswahl"].'","'.$status.'")');
		$empfaenger = "info@domain.tld";
		$betreff = "Testmail";
		$text = file_get_contents("templates/email_forms/paket_komplett.tpl");
		mail($empfaenger, $betreff, $text,'From: Admin <admin@domain.tld>');
	}
}


Es ist aber keine Tabelle mit Daten befüllt, also dürften auch demzufolge die Variablen email und username nicht belegt sein. Folgerichtig dürfte er dann auch nicht die Variable wrongpass auf true setzen. Macht er aber. Nur woran liegt es. Die Funktion quote_smart sieht folendermaßen aus:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Variablen absichern
function quote_smart($value)
{
   // Ueberfluessige Maskierungen entfernen
   if (get_magic_quotes_gpc()) {
       $value = stripslashes($value);
   }
   // In Anfuehrungszeichen setzen, sofern keine Zahl
   // oder ein numerischer String vorliegt
   if (!is_numeric($value)) {
       $value = "'" . mysql_real_escape_string($value) . "'";
   }
   return $value;
}


Wie gesagt lokal auf meinen Rechner funzt es ordnungsgemäß, aber auf´m Server nicht.

2

Tuesday, February 20th 2007, 6:25pm

warum sorgst du dich eigentlich so um die Anführungszeichen bei MySQL und bei PHP sind sie dir egal? Ich meine in PHP machst du vergleiche wie $var > "1" und dann hast du eine eigene Methode die sie dir in SQL entfernt.

²topic: Gib uns mal die Ausgabe von

PHP Quellcode

1
sprintf('SELECT email FROM kcc_user WHERE email=%s',quote_smart($_POST["email"]))


unterscheidet die sich auf deinen Systemen? Dennoch komisch, dass er auf dem Server mehr finden soll als auf dem lokalen Computer. Das kann ja eigentlich kein Fehler bei der Abfrage sein.

3

Tuesday, February 20th 2007, 8:07pm

Zu allererst wollte ich noch sagen, dass die Ausgabe bei Tausch der If-Anweisung aus den Zeilen: 65-68 bzw. 70-73 auch jeweils die andere Fehlermeldung ausgegeben wird. Also setze ich die Anweisung email nach oben und die Username nach unten erscheint die Fehlermeldung für den Usernamen. Es scheint als ob der die Variable wrongpass setzt und die jeweiligen Anweisung durch nacheinander durchgeht und die letzte Meldung als $fehler-Variable setzt. Aber warum setzt er denn die wrongpass-Variable? Der Username und die email sind in der Datenbank nicht vorhanden.

Testscript:

PHP Quellcode

1
2
3
4
$_POST["email"] = "info@domain.tld";
$test = sprintf('SELECT email FROM kcc_user WHERE email=%s',quote_smart($_POST["email"]));
$query = mysql_query($test);
$result = mysql_num_rows($query);

echo $test;
Ausgabe lokal und Server: SELECT email FROM kcc_user WHERE email='info@domain.tld'
echo $query;
Ausgabe lokal: Resource id #6
Ausgabe Server: Resource id #7

echo $result;
Ausgabe lokal und Server: 0

4

Tuesday, February 20th 2007, 8:25pm

$result ist beidesmal 0?
Dann kann es doch eigentlich nur an den falschen Quotes um die Zahlen liegen

if ($result > "0") => if ($result > 0)

5

Tuesday, February 20th 2007, 9:01pm

Habe das jetzt mal etwas eingrenzen können. Das ganz liegt an der email. Das "@" stört gewaltig. Ersetze ich dies durch ein anderes Zeichen funztz es wunderbar. Aber wie kriege ich das jetzt hin, dass das "@" aus der Variable als ein Sonderzeichen betrachtet?

6

Tuesday, February 20th 2007, 10:08pm

Ich denke aber nicht, dass das Problem an der Übertragung mittels PHP liegt.
Vermutlich sind die Daten in der Datenbank schon falsch. (von irgendwo importiert?)

Vergleich mal die Zeichensätze der Datenbanken.

7

Wednesday, February 21st 2007, 2:39pm

Die Zeichensätze sind total identisch. Keinerlei Verschiedenheiten.

8

Wednesday, February 21st 2007, 3:10pm

Hi

Also so wie ich die Sache sehe, liegt es u.a. an deinen isset() prüfungen. was soll dir das denn sagen? isset prüft doch nur ob eine variable/array existiert oder nicht. da du ja weiter oben die variablen schon erzeugst, gibt die funktion immer true zurück...

von daher nicht wirklich verlässlich imho

kannst ja der einfachheithalber eher so prüfen

PHP Quellcode

1
2
3
4
if($wrongpass) // wenn true
{..}
else if(!($wrongpass)) //wenn false
{..}


oder eben auf datentyp prüfen wie du schon bei is_numeric(); gemacht hast.
Aber halt allein die prüfung mit isset() sagt ja nicht viel aus... da kann ja alles drin stehn. und eigentlich sollte es auch nicht vorkommen das eine variable nicht existiert. zumindest wenn man selber codet ;)

unset brauchst du dann eigentlich auch nicht mehr, da alle variablen/objekte/arrays/etc nach beendigung des scriptes aus dem speicher gelöscht werden (GC)

btw: ich würde keine daten aus $_REQUEST direkt in ein mysql query schreiben. da kann man ziemlich viel blödsinn mit anstellen...

zu dem @ Problem: wenn du die daten per GET/POST übermittelst, kannst du versuchen den query string vorher mit rawurlencode() zu encoden und nachher mit
rawurldecode() wieder decoden... dabei werden alle sonderzeichen bis auf - _ . so umgewandelt das die problemlos über die url übermittelt werden können... vlt hilft das ja weiter ;)

mfg da BendIt

9

Wednesday, February 21st 2007, 6:51pm

Hab den Fehler gefunden. Hab die Variable register_globals in der php.ini auf "off" gesetzt. Jetzt funktionierts. Ist es eigentlich sinnvoll register_globals zu deaktivieren?

Und was ist denn wenn ich Magic_quotes_gpc auch deaktivere. Sinnvoll? Und wie prüfe ich dann die effektiv die Eingaben über die URL oder einer Variable (ich meine evt. Hochkommata und so). Will mich ja auch gegen die SQL-Injections optimal schützen.

10

Wednesday, February 21st 2007, 7:38pm

also deine quote_smart() würde ich als ausreichend beurteilen. Die mysql_real_escape_string regelt ja alles wichtige ;-)

register_globals sollte man immer deaktivieren!
Wenn du Sicherheitsmeldungen zu phpbb, wordpress, ... liest, dann betreffen die Meldungen oft nur Systeme mit register_globals on.
Abgesehen davon liegt der Vorteil doch auf der Hand ;-)

Similar threads

Social bookmarks