einzigartigen tabelleneintrag generieren

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

  • einzigartigen tabelleneintrag generieren

    folgende situation: ich habe eine tabelle mit den feldern "id" und "key". (id = autoincrement). bei einer änderung an der tabelle wird das script so aufgerufen: change.php?id=54&key=1657531656&....
    damit user nicht andere id's einfach ändern können, indem sie den link ändern habe ich o.g. key-feld mit eingebaut. wie kann ich beim inserten in die datenbank am einfachsten einen key generieren, der noch nicht in der tabelle vorhanden ist. im moment sieht das bei mir so aus:

    PHP-Code:
    <?php
    srand 
    ((double)microtime()*1000000);
    $result = @mysql_query ("SELECT key FROM $tabelle");
    while (
    $result_2 = @mysql_fetch_row($result)) {
        
    $key_array[] = $result_2[0];
    }
    $new_key mt_rand(0,999999999);
    while (
    in_array($new_key,$key_array)) { $new_key mt_rand 0,999999999); }
    ?>
    geht das auch irgendwie eleganter/einfacher?

  • #2
    Was hast Du vor? Zu welchem Zweck das ganze?

    damit user nicht andere id's einfach ändern können, indem sie den link ändern habe ich o.g. key-feld mit eingebaut.
    Das hindert mich aber nicht daran, deine Daten zu manipulieren. Es sei denn, du verlangst die Eingabe des Keys zur Überprüfung. Ansonsten bringt das ganze nicht viel.

    Was du brauchst ist eher eine Benutzerauthentifikation und nicht irgendwelche nicht konsequent durchgedachten Pseudo-Sicherheitsfunktionen.
    [color="#334D7B"]"Los, lass uns loslegen! Hm ? Quatschen können wir hinterher immer noch!"[/color]
    [color="#9C5245"]"Aber Bommel, wir können jetzt nicht bumsen. Wir müssen doch erst den Kindern - ... "[/color]
    [color="#334D7B"]"Ja ja ja. Du willst immer nur das Eine. Buchstabenzeigen, Buchstabenzeigen - meine Gefühle sind dir wohl scheißegal."[/color]

    © Harald Schmidt

    Kommentar


    • #3
      wenn ich im link nur hätte: change.php?id=54&.... also zum ändern der tabelle bei id 54 und ein user ändert die 54 in z.b. 53 ab könnte er den datensatz mit der id 53 ändern, obwohl er das nicht darf. darum habe ich noch den key eingebaut, der auch gleichzeitig übereinstimmen muß. ob das sinn macht oder nicht lass mal meine sorge sein. die frage war ja eine ganz andere.

      wie finde ich am einfachsten einen eintag für ein feld (hier eben key), der noch nicht vorhanden ist?

      p.s.:
      Es sei denn, du verlangst die Eingabe des Keys zur Überprüfung.
      darum ja: change.php?id=54&key=1657531656&....

      Kommentar


      • #4
        Nein, mit Eingabe meinte ich folgendes:
        Du gibst ein Formular aus, wo steht "Bitte geben sie den Key ein."
        Erst dann kann man den Datensatz bearbeiten.
        [color="#334D7B"]"Los, lass uns loslegen! Hm ? Quatschen können wir hinterher immer noch!"[/color]
        [color="#9C5245"]"Aber Bommel, wir können jetzt nicht bumsen. Wir müssen doch erst den Kindern - ... "[/color]
        [color="#334D7B"]"Ja ja ja. Du willst immer nur das Eine. Buchstabenzeigen, Buchstabenzeigen - meine Gefühle sind dir wohl scheißegal."[/color]

        © Harald Schmidt

        Kommentar


        • #5
          mache die spalte vom typ VARCHAR(32)

          und die zeile

          $new_key = mt_rand(0,999999999);

          änderst du in
          PHP-Code:
          $new_key md5(mt_rand(0,999999999)); 
          damit solltest du einen wert haben, der in verbindung mit der id nicht so schwer zu 'erraten' ist ....
          INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


          Kommentar


          • #6
            ich glaube wir reden etwas aneinander vorbei...
            Also: ich habe eine Tabelle. Eine Spalte der Tabelle heisst 'key'. Wenn ich eine neue Zeile einfüge, möchte ich für 'key' eine (10-Stellige) Zufallszahl haben, die bisher noch nicht als key in den schon vorhandenen Zeilen vorkommt. Wie ich das bis jetzt mache kann man oben sehen. Ich will jetzt nur wissen, ob das auch einfacher geht.

            Kommentar


            • #7
              Ja, so wie Abraxax es sagte, ist es schon okay.
              Ich würde allerdings nicht srand() benutzen, sondern mt_srand().
              Wenn Du es hashst, dann hast einen recht sicheren Zufallswert.
              Normalerweise muss der Zufallswert auch ohne Überprüfung sicher sein. Wenn er sich wiederholen könnte, taugt der zufallsgenerator nichts.
              Mit einem Mersenne-Twister (ein bestimmter Zufallsgenerator) bekommst du z.b. erst nach 4,32e6001 Durchläufen denselben Zufallswert.

              Wenn du wirklich sichergehen willst, dass er einzigartig ist, mach dein DB Feld auf UNIQUE oder als Primary Key.

              Aber willst du deinem Benutzer wirklich zumuten, sich ein 10 zeichen langes Passwort/Key zu merken?
              Zuletzt geändert von Troublegum; 17.12.2002, 19:40.
              [color="#334D7B"]"Los, lass uns loslegen! Hm ? Quatschen können wir hinterher immer noch!"[/color]
              [color="#9C5245"]"Aber Bommel, wir können jetzt nicht bumsen. Wir müssen doch erst den Kindern - ... "[/color]
              [color="#334D7B"]"Ja ja ja. Du willst immer nur das Eine. Buchstabenzeigen, Buchstabenzeigen - meine Gefühle sind dir wohl scheißegal."[/color]

              © Harald Schmidt

              Kommentar


              • #8
                Normalerweise muss der Zufallswert auch ohne Überprüfung sicher sein. Wenn er sich wiederholen könnte, taugt der zufallsgenerator nichts.
                Mit einem Mersenne-Twister (ein bestimmter Zufallsgenerator) bekommst du z.b. erst nach 4,32e6001 Durchläufen denselben Zufallswert.
                und wenn ich nach 3 Tagen oder nach 2 Wochen später 100 neue Einträge in die db schreibe, kann ich da auch sicher sein, daß keine Zahl doppelt vorkommt?

                Wenn du wirklich sichergehen willst, dass er einzigartig ist, mach dein DB Feld auf UNIQUE oder als Primary Key.
                ich will aber vorher wissen, ob ein Wert schon in der db vorkommt, und nicht erst durch eine fehlermeldung bei einem Neueintrag (bei UNIQUE) und ich will auch keine fortlaufende zahle (Wie bei Primary Key)

                Aber willst du deinem Benutzer wirklich zumuten, sich ein 10 zeichen langes Passwort/Key zu merken?
                Wie gesagt: lass das mal meine Sorge sein

                Kommentar


                • #9
                  Original geschrieben von mysterx2000
                  und wenn ich nach 3 Tagen oder nach 2 Wochen später 100 neue Einträge in die db schreibe, kann ich da auch sicher sein, daß keine Zahl doppelt vorkommt?
                  Wenn du einen guten Zufallsgenerator benutzt ja.
                  der in php eingebaute Zufallsgenerator (unbedingt mt_srand() & mt_rand() benutzen - nicht das normale rand() & srand(), das du auch noch in deinem Beispiel verwendest. Achtung!) benutzt ja auch den Mersenne Twister.
                  Die Funktion mt_rand() bietet einen Drop-In Ersatz für die von der libc bereitgestellten Funktionen. Sie benutzt einen Zufallsgenerator mit bekannter Characteristik, den sogenannten "Mersenne Twister", der Pseudozufalls-Sequenzen generiert, die auch kryptografischen Ansprüchen genügen sollten und viermal so schnell arbeitet wie der typische libc-Algorithmus.
                  Der Seed (Startwert) des Zufallsgenerators ist allerdings sehr wichtig.
                  Aber mit microtime() erhälst du einen ganz passablen Startwert.
                  Gleiche Startwerte führen auch jeweils zu derselben Pseudo-Zufallssequenzen daher ist es üblich, diese über die aktuelle Uhrzeit festzulegen




                  Original geschrieben von mysterx2000
                  ich will aber vorher wissen, ob ein Wert schon in der db vorkommt, und nicht erst durch eine fehlermeldung bei einem Neueintrag (bei UNIQUE) und ich will auch keine fortlaufende zahle (Wie bei Primary Key)
                  Primary Keys sind nicht nur vortlaufende Zahlen (das ist nur bei auto_increment Spalten so). Ich kann auch "SDODF" und "ds9235j" als Primary Key nehmen ;D
                  Wenn du es vorher überprüfen willst, würde ich wie folgt vorgehen.
                  Einen Wert generieren und per Select prüfen, ob er vorhanden ist. Falls ja, solange einen neuen Wert generieren, bis er einzigartig ist. Das erfordert eine Whileschleife und produziert leider soviele Abfragen, wie die Schleife Durchläufe hat. Das finde ich aber immer noch besser, als vorher alle Datensätze einzulesen in einen Array. Wenn du später mal tausende Einträge hast, und die alle speicherst, dann sprengst du u. U. sogar das RAM Limit für PHP Scripte.


                  Aber ich bin mir ziemlich sicher, dass Du mit einem guten Seed die Periode für gleiche zufallszahlen sehr weit hochschrauben kannst.
                  In den Kommentaren zu mt_srand() sind noch Funktionen beschrieben, mit denen du den Raum für mögliche Seeds vergrößerst. mit microtime() - steht dort jedenfalls - bekommst du nämlich nicht annähernd so viele mögliche Seeds, wie es der mersenne Twister ermöglicht. Und je mehr, desto besser.
                  Vor allem die beiden letzten sowie der zweite Kommentar sind ganz interessant. Schau sie dir mal an: http://php3.de/manual/en/function.mt-srand.php


                  Fazit: Wenn du es schaffst, die Raum für Seeds möglichst groß zu halten, ist die Periode für Zufallszahlen auch sehr viel größer. Und das reicht locker für 100 Einträge. Aber von 100 darfst du auf keinen Fall ausgehen, das ist lächerlich wenig. Die mögliche Anzahl an Zufallszahlen muss so hoch wie möglich sein.


                  So, ich hoffe, ich habe mich nicht allzu sehr wiederholt.
                  Aber bei dem Thema Kryptographie und was damit zu tun hat (z.B. Zufallszahlen) rede ich gerne mit.
                  Zuletzt geändert von Troublegum; 18.12.2002, 01:07.
                  [color="#334D7B"]"Los, lass uns loslegen! Hm ? Quatschen können wir hinterher immer noch!"[/color]
                  [color="#9C5245"]"Aber Bommel, wir können jetzt nicht bumsen. Wir müssen doch erst den Kindern - ... "[/color]
                  [color="#334D7B"]"Ja ja ja. Du willst immer nur das Eine. Buchstabenzeigen, Buchstabenzeigen - meine Gefühle sind dir wohl scheißegal."[/color]

                  © Harald Schmidt

                  Kommentar


                  • #10
                    Naja. Wollen wirs nicht zu kompliziert machen.
                    Nimm doch die IP & der Zeitpunkt (UNIX-Zeitstempel) und füge sie aneinander, IP evtl. hexadezimal, dann hast du immer gleich viel stellen. Evtl. noch einen md5() drausmachen, der hat glaub ich auch immer gleich viele Stellen.
                    Ist doch bestimmt einzigartig genug solange du nicht die Uhr umstellst.
                    mfg

                    Kommentar

                    Lädt...
                    X