Problem mit Script auf Server - get_magic_quotes falsch ???

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 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:

    Quellcode

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


    aus.

    Quellcode

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


    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:

    Quellcode

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


    Wie gesagt lokal auf meinen Rechner funzt es ordnungsgemäß, aber auf´m Server nicht.
  • 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

    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.
  • 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:

    Quellcode

    1. $_POST["email"] = "info@domain.tld";
    2. $test = sprintf('SELECT email FROM kcc_user WHERE email=%s',quote_smart($_POST["email"]));
    3. $query = mysql_query($test);
    4. $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
  • 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

    Quellcode

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


    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
    .:Reden Ist Schweigen und Silber Ist Gold:.

    real programmers don't comment their code: if it was hard to write, it should be hard to read!
  • 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.
  • 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 ;)