Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Abgleich funktioniert nicht

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Abgleich funktioniert nicht

    Entschuldigung, aber ich bin wieder hier mit meinem sicherheitsbedenklichen Script. Falls ich Jemanden damit nerven sollte, dann lieber das Thema einfach ignorieren.

    Ich habe das Problem fast gelöst. Die Daten werden schon mal in die Datenbank eingetragen, aber der Abgleich funktioniert nicht. Obwohl Eintrag bereits in der Datenbank existiert, kann man ihn ungehindert nochmal und nochmal eintragen (Das Script muss das verhindern).

    Außerdem vereinfachte ich den Code weiter.

    PHP-Code:
    <?php
    $verbindung 
    mysql_connect("localhost""login" "pass"
    or die(
    "There are no conection to database"); 

    mysql_select_db("database") or die ("Database couldn't be find"); 

    $spalte1 $_POST["spalte1"];

    if(
    $spalte1== "")

        echo 
    "Please, fill in all fields"
        exit; 
    }

    $result "SELECT spalte1 FROM 'tabelle1' WHERE spalte1 LIKE '$spalte1'";
    $ergebnis mysql_query($result);

    if (
    $ergebnis == 0)
    {
    $input  "INSERT INTO tabelle1 (spalte1) VALUES ('$spalte1')";
    $eintragen mysql_query($input); 
    }
    else
    {
    echo 
    "Sorry, this already exists in the system.";
    }
    ?>

  • #2
    Das ist in der Tat sicherheitsbedenklich.

    - http://php-de.github.io/jumpto/faq/#deprecated-mysql (alte mysql-Erweiterung nicht mehr nutzen)
    - http://php-de.github.io/jumpto/faq/#sql-injection (SQL-Injections)
    - http://dev.mysql.com/doc/refman/5.7/...-matching.html (du willst vermutlich nicht LIKE)

    For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success, or FALSE on error.
    - http://de1.php.net/manual/en/function.mysql-query.php

    Du suchst zum Beispiel mysql(i)_num_rows.

    - http://de1.php.net/manual/en/mysqli-result.num-rows.php

    Zur Vermeidung von Race Conditions sind zudem Transaktionen sicher keine schlechte Idee.

    Es gibt andere Wege. Etwa unique indices.



    Edit: ↓ Wir sind mit dem Zeitpunkt des Absendens von Beiträgen gerade echt in sync.

    Kommentar


    • #3
      PHP-Code:
      SELECT spalte1 FROM 'tabelle1' 
      Das dürfen keine Hochkommata sein, sondern Backticks `. Dieser Fehler sorgt dafür, dass mysql sagt, die Query ist fehlerhaft und die Funktion mysql_query() liefert false zurück.
      PHP-Code:
      var_dump($ergebnis); bool(false
      Dann hast du in deinem if den Typenschwachen Operator verwendet, der setzt false mit 0 gleich. Also springt er in den Anweisungsblock und nicht ins else.
      Würdest du === nutzen, würden auch noch die Typen geprüft werden also bool(false) und int(0). Dadurch würde er den Unterschied erkennen und ins else gehen.
      PHP-Code:
      var_dump(false == 0); // bool(true)
      var_dump(false === 0); // bool(false) 
      Du hast aber auch noch einen weiteren Fehler. Dein $ergebnis enthält nur eine resource, die von mysql_query() zurückgegeben wird, falls die Query akzeptiert wird. Daraus kannst du noch nicht ableiten, ob der Datensatz schon vorhanden ist, du musst erst noch auf das Ergebnis zugreifen.
      PHP-Code:
      $query "SELECT spalte1 FROM `tabelle1` WHERE spalte1 LIKE '$spalte1'"
      $result mysql_query($query);
      $ergebnis mysql_fetch_assoc($result); 
      Und dann kannst du einfach prüfen, wie viele Reihen dir denn von der Query geliefert wurden.
      PHP-Code:
      if (count($ergebnis) === 0
      Standardtext für die Datenbankverbindung:
      Die mysql_* Erweiterung ist veraltet und wird in der nächsten PHP-Version entfernt. Zudem ist deine Query anfällig für SQL-Injections.
      Durch einen Wechsel auf mysqli_* oder PDO greifst du aufdie modernere API zu und hast die Möglichkeiten Prepared Statements zu benutzen die gegen Injections wirken.
      Ich persönlich bevorzuge PDO, schönes Tutorial: http://www.peterkropff.de/site/php/pdo.htm
      [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
      [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

      Kommentar


      • #4
        Zitat von VPh Beitrag anzeigen
        PHP-Code:
        $query "SELECT spalte1 FROM `tabelle1` WHERE spalte1 LIKE '$spalte1'"
        $result mysql_query($query);
        $ergebnis mysql_fetch_assoc($result); 
        da kommt sowas raus: Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in..

        Kommentar


        • #5
          Und? Ja weil mysql_query() auf einen Fehler läuft und daher mysql_fetch_assoc() nur false bekommt, steht ja da.

          Es wurde dir bereits in dem anderen Thread schon mehrmals gesagt, nutze mysql_error & Co bzw. wie man korrekt debuggt und das du auf mysqli oder PDO umsteigen sollst, wie oft denn noch?

          http://www.php.de/gruene-wiese/11097...wie-nicht.html

          http://www.php.de/scriptboerse/11097...-ausgeben.html

          LG
          The string "()()" is not palindrom but the String "())(" is.

          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
          PHP.de Wissenssammlung | Kein Support per PN

          Kommentar


          • #6
            [QUOTE=hausl;816317]nutze mysql_error & Co /QUOTE]



            Error: SELECT spalte1 FROM 'tabelle1' WHERE spalte1 LIKE 'sdad'
            You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''tabelle1' WHERE spalte1 LIKE 'sdad'' at line 1

            da kommt sowas raus, bringt mich auch nicht wirklich weiter, aber wenn ich dich nerve, dann lasse es bitte..

            Kommentar


            • #7
              Ja, dann hast du den Tabellennamen eben nicht in Backticks, sondern noch in Hochkommas.
              [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
              [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

              Kommentar


              • #8
                Lies bitte den ersten Satz in VPhs erstem Post noch mal…

                @VPh: Wir sind immer noch in sync. *g*

                Kommentar

                Lädt...
                X