ulf: Session

Hi,

ich hab da son formular,
da können sich leute auf meine seite anmelden,
das formular kann sich aber logischer weise jeder kopieren,
ich möchte nicht das idioten auf die idee kommen meine db zu füllen mit einem selbstgeschriebenen script,
deswegen habe ich ein sperre eingebaut:

sobalt sich jemand registriert hat, speicher ich in $_SESSION['bla']='stop';

und vor jedem anlegen frage ich ab ob in $_SESSION['bla'] stop drin steht.

so sollte man sich doch ausrechend vor solchen attacken schützen können oder?

MfG ULF

  1. deswegen habe ich ein sperre eingebaut:

    sobalt sich jemand registriert hat, speicher ich in $_SESSION['bla']='stop';

    und vor jedem anlegen frage ich ab ob in $_SESSION['bla'] stop drin steht.

    so sollte man sich doch ausrechend vor solchen attacken schützen können oder?

    Das ist der Mörderschutz überhaupt - wenn der pöse Pube[tm] Browser wie den Internet Explorer benutzt, bei denen sich Cookies nicht mit einem Klick abschalten lassen:

    <img src="http://kino-fahrplan.de/privat/st/selfforum/cookiemeister.png" border="0" alt="">

    Einmal betätigen und das war's mit Deinem Schutz.

    Merke: Jeder Schutz, der darauf basiert, Daten außerhalb des Servers zu speichern, ist für sich alleine genommen ein Witz.

    Du kannst höchstens versuchen, Dir die Adressen der Gegenstelle auf Deinem Server zu merken.

    Gruß,
      soenk.e

    1. Hi,

      Merke: Jeder Schutz, der darauf basiert, Daten außerhalb des Servers zu speichern, ist für sich alleine genommen ein Witz.

      es scheint mir aus dem Intialbeitrag nicht klar hervorzugehen, ob das Session-Konzept ueber Cookies oder ueber serverseitiges Datenhalten implementiert worden ist. Insofern scheint mir das Schnueren eines Rundum-Happy Pakets etwas voreilig gewesen zu sein.

      Gruss,
      Luddie

      1. es scheint mir aus dem Intialbeitrag nicht klar hervorzugehen, ob das Session-Konzept ueber Cookies oder ueber serverseitiges Datenhalten implementiert worden ist.

        [x] Du möchtest Dich zusammen mit ulf über die Funktionsweise von Sessions informieren.

        Gruß,
          soenk.e

        1. Hi,

          es scheint mir aus dem Intialbeitrag nicht klar hervorzugehen, ob das Session-Konzept ueber Cookies oder ueber serverseitiges Datenhalten implementiert worden ist.

          [x] Du möchtest Dich zusammen mit ulf über die Funktionsweise von Sessions informieren.

          man kann natuerlich auch mit PHP Sessions serverseitig halten. Insofern gebe ich den Hinweis auf Schulungsbedarf gerne zurueck.

          Gruss,
          Luddie

    2. Einmal betätigen und das war's mit Deinem Schutz.

      Merke: Jeder Schutz, der darauf basiert, Daten außerhalb des Servers zu speichern, ist für sich alleine genommen ein Witz.

      was haben cookies mit sessions zu tun?
      welcher schutz ist perfekt? welchen würdest du anwenden?
      ip speichern?

      ULF

      1. Hi,

        Einmal betätigen und das war's mit Deinem Schutz.

        Merke: Jeder Schutz, der darauf basiert, Daten außerhalb des Servers zu speichern, ist für sich alleine genommen ein Witz.

        was haben cookies mit sessions zu tun?
        welcher schutz ist perfekt? welchen würdest du anwenden?
        ip speichern?

        serverbasierte Session-Speicherung und Sicherheit mit SSL wuerde er moeglicherweise antworten. "IP speichern macht keinen Sinn" moeglicherweise ebenfalls.

        Gruss,
        Lude

      2. Merke: Jeder Schutz, der darauf basiert, Daten außerhalb des Servers zu speichern, ist für sich alleine genommen ein Witz.

        was haben cookies mit sessions zu tun?

        Überlege Dir mal, wie ein Server zuverlässig erkennen soll, daß ein Browser gerade $_SESSION in Benutzung hat. Sowas geht nur, indem der Server dem Browser eine eindeutige Kennung verpasst ("Session-ID") - und die wird entweder per Cookie oder per URL vergeben.
        Die zweite Möglichkeit wäre, die Daten nicht auf dem Server (wie es mit $_SESSION geschieht), sondern im Browser zu speichern. Auch dazu brauchst Du Cookies.

        Was immer Du davon probierst, es bedeutet jedesmal, daß Du wichtige Daten außerhalb des Servers beim Feind lagerst und läuft somit in jedem Fall auf folgendes hinaus:

        Wenn Du in $_SESSION (oder in $_COOKIE) den Status "hat sich registriert" speicherst, brauche ich nur das Zurücksenden dieser Kennung unterbinden und schon bin ich wieder ein Unbekannter, nicht registriert. Keine Kennung, kein $_SESSION, kein Status.

        Es gibt keinen anderen Weg, einen Browser und damit die mit ihm verbundene Sitzung von einer Anfrage an den Server zur nächsten eindeutig wieder zu erkennen.

        welcher schutz ist perfekt? welchen würdest du anwenden?

        Ernsthaft:
        Ich weiß nicht, was Du alles je angemeldetem Benutzer speicherst, aber IMHO ist es ein Witz, wenn jemand versucht, mit massenhaften Registrierungen eine Datenbank in die Knie zu zwingen. Da gibt es feinere Methoden, mit denen man gleich den ganzen Server lahmlegen kann.
        Weiterhin wird sich Datenmüll, in diesem Fall "tote" Benutzer, so oder so mit der Zeit ansammeln. Es gibt reichlich Leute, die sich einmal anmelden und nie wieder kommen, entweder weil sie nur kurz was gucken wollten oder weil sie enttäuscht sind. Bei anderen lässt das Interesse vielleicht nach dem zehnten oder hundertsten Besuch nach, der Effekt ist der gleiche.
        Und es stellt sich die Frage, mit wieviel Millionen Besuchern Du denn so über den Daumen rechnest, daß Du Angst hast, ein paar hundert Scherzanmeldungen könnten alles zusammenbrechen lassen.
        Überhaupt: Wer sollte sich denn allen Ernstes die Mühe machen, Dich mit Anmeldungen zuzumüllen? Nicht, daß ich die Qualität Deines Projektes heruntereden möchte, aber mir kommt das irgendwie doch recht...amüsant vor, das hat schon was von Verfolgungswahn :> Du solltest Dir über ein paar halbstarke Wichtel keine Gedanken machen, lass' sie einfach ins Leere laufen, nimm' die Anmeldungen an und entferne sie später stillschweigend. Ein Angriff, der keinen Schaden hinterlässt, macht keinen Spaß. Ein Angriff, der überhaupt nichts, nicht mal eine Notiz, hinterlässt, ist frustrierend.

        Soviel zur technischen und verwalterischen Seite. Zum zweiten finde ich persönlich Seiten, auf denen man sich erst anmelden muß, generell blöd, weil es erstens umständlich ist, zweitens schon genug Mißbrauch mit meinen persönlichen Daten getrieben wird und ich drittens gerne unabhängig (nicht unbedingt anonym) bleibe. Insofern unterlasse ich als Serverbetreiber diesen ganzen Anmeldequatsch grundsätzlich. Es gibt zwar Ausnahmen, aber die beiden häufigsten Anwendungen zählen nicht dazu:

        • Personalisierte Seiten kann man auch realisieren, indem man die jeweiligen Wünsche direkt in einem Cookie speichert. Damit fällt auch gleich der komplette Aufwand für die serverseitige Datenverwaltung weg - ganz zu schweigen von Karteileichen, die können gar nicht erst entstehen, wenn es keine Kartei gibt.
        • Eine Anmeldung in Foren oder Boards ersetzt eine fähige Moderation in keinster Weise. Das es auch problemlos ohne geht, siehst Du an diesem Forum.

        Aber wenn Du Dich wirklich so fürchtest:

        ip speichern?

        Das schrieb ich ja bereits: In einer gesonderten Datei die Adressen der Rechner speichern, von denen aus in den letzten drei Minuten eine Anmeldung erfolgt ist. Das reicht, um jedem 12-jährigen Spielkind schon beim zweiten "Stör"-Versuch die Lust zu nehmen, und ist gleichzeitig so knapp bemessen, daß es keine Probleme mit dynamischen Adressen geben sollte (wohlgemerkt: sollte..).

        Noch besser, allerdings etwas aufwändiger: Die Speicherung der Mail-Adresse mit gleichzeitigem Zwang zur Bestätigung des Empfangs einer Testnachricht (entweder durch Zurücksenden der Nachricht oder -einfacher- durch Anklicken/Eingeben des zugesandten Aktivierungscodes, also einer Zufallszahl).

        Gruß,
          soenk.e

        1. ok, sehr interresant!

          dann mache ich es eben so:
          wenn sich ein user nicht effektiv an der seite beteiligt wird er gelöscht und zwar nach 2 wochen. mit effektiv ist nicht gemeint sich auf der seite zu bewegen.
          und user die sich anmelden sollten auch effektive user sein, da es ihnen ja sonst nix bringt auf der seite zu sein, was nicht heisst wer nicht angemeldet ist kann die seite nicht sehen.

          man kann sich ja neu anmelden.

          aber sobald man einmal aktiv war lösche ich den user nicht.

          aber trotzdem wie kann ich einen angriff der meine db in die knie zwingt wie du es so schön sagst abweheren,
          vieleicht in dem ich nur max 100 anmeldungen pro tag zulasse!?

          MfG Ulf

          1. wenn sich ein user nicht effektiv an der seite beteiligt wird er gelöscht und zwar nach 2 wochen.

            Das kann funktionieren.

            aber trotzdem wie kann ich einen angriff der meine db in die knie zwingt wie du es so schön sagst abweheren,
            vieleicht in dem ich nur max 100 anmeldungen pro tag zulasse!?

            Das würde die Sache eher noch schlimmer machen: Ich komme morgens vorbei, mülle Deine Kartei voll und sorge so dafür, daß die fünf anderen, ehrlichen Aspiranten den ganzen restlichen Tag keinen Zutritt mehr bekommen.

            Daß Du Dir Gedanken über die Systemsicherheit machst, finde ich vollkommen in Ordnung, aber Du scheinst es etwas zu übertreiben. Zu einer Analyse gehören drei Fragen:

            1. Inwieweit ist das zu schützende Objekt anfällig?
            2. Gegen wenn muß geschützt werden?
            3. Wer sind die berechtigten bzw. erwünschten Nutzer?

            Das alles zusammen bestimmt, wie stark der Schutz ausfallen sollte, aber auch wie stark er ausfallen _darf_. Du kannst ein Fort Knox zusammenbasteln, aber was bringt es Dir, wenn das Objekt der Begierde ein 100 Tonne schwerer Betonklotz ist, die Angreifer mit einem Korkenzieher bewaffnete Kindergartenkinder sind und den eigentlichen Benutzern die Sicherheitsmaßnahmen so auf den Keks gehen, daß sie nicht wiederkommen?

            Du solltest Dir also erstmal überlegen/ausrechnen, wie viele Anmeldungen Deine Datenbank verkraften kann. Dann solltest Du Dir überlegen, wer angreifen könnte, welche Fähigkeiten und Resourcen er hat und, darauf basierend, wie lange der Angriff dauern würde, sowie aus welcher Motivation heraus er handelt.

            Ich für meinen Teil halte es -wie bereits angedeutet- für sehr, sehr unwahrscheinlich, daß sich jemand wirklich die Mühe macht, mit einem Skript über das Netz irgendeine Datenbank zu fluten. Das dauert a) zu lange, hat b) Nebeneffekte, die man auch anders erreichen kann (übermäßige Serverlast erreiche ich auch und vor allen Dingen viel einfacher, indem ich wahllos Seiten anfordere) und ist c) mit keinerlei Unterhaltungswert für den Angreifer gesegnet - oder könntest Du Dir vorstellen, stundenlang ein Skript laufen zu lassen, das die eigene Internet-Verbindung lahmlegt, nur um am Ende nach vielleicht 25.000 Anmeldungen festzustellen, daß keine Anmeldung mehr möglich ist? Ganz banal gefragt: Wo ist da der Witz?
            Und dabei ist noch gar nicht eingerechnet, daß derartiges Verhalten strafbar ist. Ein Angreifer, der in der Lage ist, geeignete Vermummungsmaßnahmen vorzunehmen, hat ganz andere Möglichkeiten, Deinen Server lahmzulegen, und im Falle ordinärer Scriptkiddies ist der Spaß eher auf Deiner Seite - nämlich wenn Du Strafanzeige stellst und Dir ausmalst, wie die Polizei unter den Augen der entsetzten Eltern den heulenden Filius abholt.

            Genug geschwafelt: Benutze die einfache IP-Sperre, die ich bereits beschrieben hatte (achte darauf, daß die Auszeit bei jedem Versuch erneut gestartet wird). Das ist selbst mit zwei oder drei Minuten die effektivste und gleichzeitig am wenigsten die normalen Besucher beeinträchtigende Abwehrmaßnahme.
            Milchmädchenrechnung gefällig? Bei 200 Byte großen Datensätzen würden 5 MByte Speicherplatz für bummelig 26.000 Anmeldungen reichen. Bei einer Verzögerung von zwei Minuten dauert es von einer IP aus 36 Tage, bis die Datenbank voll ist.

            Gruß,
              soenk.e

            1. Hi,

              Milchmädchenrechnung gefällig? Bei 200 Byte großen Datensätzen würden 5 MByte Speicherplatz für bummelig 26.000 Anmeldungen reichen. Bei einer Verzögerung von zwei Minuten dauert es von einer IP aus 36 Tage, bis die Datenbank voll ist.

              ich kann mich dunkel daran erinnern, hier im Forum gelesen zu haben (vielleicht war 'Sönke Tesch' der Autor?), dass die IP des http-Requests beliebig gefaelscht werden kann. Darum hatte ich in diesem Thread geaeussert, dass Du vermutlich eine "IP-Sperre" nicht als Schutzmechanismus ins Auge fassen wuerdest und mit einer "Authentifizierung unter SSL" kommen wuerdest.

              Gruss,
              Lude

            2. hi,

              Wo ist da der Witz?

              jemand der mich nicht leiden kann könnte mir aus Spaß mir enorm viel arbeit hinzuzufügen soetwas antun. ich denke davon gibts genug. der spaß daran ist zu wissen es getan zu haben.

              die überlegung ist doch mit wieviel anmeldungen rechne ich pro tag und wie unwahrscheinlich ist es das sich 100 anmelden!? spätestens da weiss ich das da was nicht stimmt, aber sperren kann ich es ja dann auch nicht, weil ehrliche user sich dann nicht mehr anmelden könnten, da hast du recht. also kann ich meine db nicht schützen?

              obwohl der schadenhinzufüger bekommt ja auch kein resultat also weiss er auch nicht ob es geklappt hat oder... hm.. doch er kann sich ja einfach mal anmelden. - das internet ist echt beschissen!

              MfG
              Ulf

              1. Hallo Ulf,

                da du ja sowieso mit php arbeitest, kannst du auch, wie es auf vielen grossen seiten gemacht wird, dynamisch ein bild mit einer zufälligen buchstaben/zahlen-kombination bei jedem aufruf der anmeldeseite anzeigen, dessen kombination du der session-id zuordnest. wird die seite erneut aufgerufen, ändern sich die zeichen in dem bild, was du wieder in der session registrieren musst.
                dann noch ein zusätzliches feld einfügen: "lieber user, bitte gib die zeichenfolge auf dem bild in das textfeld ein." und beim auswerten des formulares auf übereinstimmung prüfen.
                und schon ist amateuren die automatische anmeldung verwehrt und profis müssten einigen programiertechnischen aufwand treiben, um das zu automatisieren, was sie wohl wegen _deiner_ seite kaum tun werden.
                ich hab so einen hack für das wbb2 mal angefangen, aber nicht ganz fertig gestellt.

                und wenn du, statt die ermittelte zufallszeichenfolge mit php direkt in das bild zu schreiben, jedem zeichen ein bild eines "etwas verunglückten" (und damit zwar für den menschen aber nur sehr schwer für ein ocr-programm erkennbaren) abbildes dieses zeichens zuordnest und dieses abbild dann mit php in das hintergrundgbild einfügst, ist das ganze annähernd sicher selbst gegen "nicht-vollprofis".

                als steigerung könnte man sogar noch jedes zeichen in fragmente zerlegen, die dann auf mehrere  bilder (*.gif mit transparenz) verteilt werden, welche mit absoluter positionierung übereinandergelegt erst wieder die zeichenkette sichtbar werden lassen.

                ja, ich weis, da sind die lynx-user und blinden wieder aussen vor, aber denen kann man als alternative (im alt-text) die anmeldung per mail bieten. in vielen boards wird die anmeldung sowieso erst nach prüfung freigeschaltet und darauf ein oder zwei tage zu warten, ist bei diesem medium keine katastrophe. es geht ja um ein board, nicht um einen chat.
                für öffentliche einrichtungen in historischen gebäuden mit schweren türen werden auch nicht diese eingangstüren entfernt, sondern z.b. eine klingel für rollstuhlfahrer angebracht. ich denke, sowas ist als lösung akzeptabel.

                freundl. Grüße aus Berlin, Raik

                1. Hey Raik,

                  Sehr schöner vorschlag, aber alles was ich in der Session Variable Registriere kann doch beeinflusst werden: [pref:t=66196&m=377362]
                  oder hab ich da was falsch verstanden?

                  muss es denn ein bild sein?
                  wenn es nur dadrum geht die zahlenkombination vom user in das feld übertragen zu lassen dann reicht es doch wenn die zahl neber dem feld steht oder?

                  aber hacker brauchen doch nur wie sönke es beschrieben hat die Session auslassen und das feld frei lassen so würde
                  if ($feld == $schutz)
                  true ergeben da beide felder leer sind.

                  MfG Ulf

                  1. Hallo Ulf,

                    Sehr schöner vorschlag, aber alles was ich in der Session Variable Registriere kann doch beeinflusst werden: [pref:t=66196&m=377362]

                    ja. wenn du in der session den wert $_SESSION[bla]=stop speicherst, lasse ich einfach die session beim aufruf der seite weg und bekomm automatisch ne neue zugewiesen.
                    das anmeldeformular kann ich trotzdem per script ausfüllen und abschicken.

                    muss es denn ein bild sein?
                    wenn es nur dadrum geht die zahlenkombination vom user in das feld übertragen zu lassen dann reicht es doch wenn die zahl neber dem feld steht oder?

                    genau darum geht es, das nicht jemand einfach per script die kombination auslesen und ins feld übernehmen kann.
                    die aus html auszulesen ist kein problem, aber aus einem bild schon.
                    dann gibts ohne menschliche hilfe auch keine anmeldung mehr, also auch keine massenanmeldung per script.

                    aber hacker brauchen doch nur wie sönke es beschrieben hat die Session auslassen und das feld frei lassen so würde
                    if ($feld == $schutz)
                    true ergeben da beide felder leer sind.

                    nein. wenn ich die session weglasse, bekomme ich automatisch eine neue zugewiesen. in der steht aber eine andere kombination aus dem bild drin, als beim letzten aufruf.
                    die kombination wird ja nicht beim start der session mit angelegt, sondern bei jedem aufruf der seite (auch, wenn die gleiche session verwendet wird) wieder neu generiert und in der session gespeichert. jedes "aktualisieren" verändert die kombination in dem bild.
                    und da man diese nicht mit einem einfachen script aus dem bild auslesen kann, muss ein mensch das übernehmen.
                    lässt du das feld für die kombination leer, gibts kein 'match' mit der (in der session gespeicherten) kombination, also 'false'.

                    freundl. Grüße aus Berlin, Raik

                    1. Hi Raik!

                      OK ich steht noch n bischen aufm schlauch.
                      das mit der menschlichen hilfe und dem bild hab ich kapiert, aber das mit der session-id noch nicht wirklich.

                      beim aufrufen von neuer_user.php soll ich einen zufallsgenerator die einzelnen bild segmente erstellen lassen bzw die zufallsid über den zufallsgenerator ist zb
                      1568 und mein script nimmt nun 1.gif und 5.gif und 6.gif und 8.gif
                      jetzt kann ein hacker doch
                      1.gif und 5.gif und 6.gif und 8.gif nehmen und .gif wegmachen und schon hat er auch die zahlen kombination, ok die mühe wird sich evtl keiner machen, aber die sicherheit ist die selbe wie wenn ich das ganze ohne bilder mach. ich müsste schon das bild selber erstellen mit php aber wie das geht weiss ich nicht.
                      dann wärs sicher! solange man die zufallsid im html code nicht. ok.

                      bekomme ich auch eine neue session id zugewiesen wenn der haken wegbleibt so wie es sönke beschrieben hat?

                      MfG Ulf - vielen dank für deine hilfe!

                      1. Hallo Ulf,

                        1568 und mein script nimmt nun 1.gif und 5.gif und 6.gif und 8.gif

                        nein, so nicht.
                        die kombination wird als string mit php-funktionen in _ein: vorbereitetes bild geschrieben. dieses bild ist referenziert als (z.b.) /img/zufallsbild.php
                        das "bild" heist immer gleich, nämlich zufallsbild.php
                        und damit die einzelnen zeichen noch schwerer für ein ocr-programm erkennbar sind, kann man sie noch etwas verfremden und dann diese bilder der einzelnen zeichen nacheinander in ein bild einfügen.
                        einfaches beispiel:
                        <img src="http://mitglied.lycos.de/ed2kserver/stats.php" border="0" alt="">
                        sorry, lycos ist etwas träge. einfach "bild anzeigen" und dann mal aktualisieren. der string im bild sollte jedes mal wechseln.

                        das verfremden der zeichen hab ich noch nicht eingebaut.

                        freundl. Grüße aus Berlin, Raik

                        1. Hi,

                          Ja Aber wie geht es?
                          ich brüchte mal einen Code ansatz wie ich mit zufallsbild.php ein bild erstelle? wie geht das?

                          MfG Ulf

                          1. Hallo Ulf,

                            ist kein schöner code, also nicht meckern: ;-)

                            <?

                            Textposition

                            $tx     = 9;
                            $ty     = 7;

                            Dimension

                            $MaxX   = 70;
                            $MaxY   = 30;

                            Bild erstellen

                            header("Content-type: image/png");
                            $im = @imagecreate($MaxX,$MaxY);

                            Farben definieren

                            $white = @ImageColorAllocate($im, 255,255,255);
                            $red = @ImageColorAllocate($im, 255,0,0);
                            $green = @ImageColorAllocate($im, 0,255,0);
                            $gray = @ImageColorAllocate($im, 128,128,128);
                            $lightgray = @ImageColorAllocate($im, 224,224,224);
                            $lightblue = @ImageColorAllocate($im, 128,128,255);

                            @ImageColorTransparent($im, $white); # weiß = transparent

                            $tcol = explode(",",$tcolor);
                            $text_color = @ImageColorAllocate($im, $tcol[0], $tcol[1], $tcol[2]);
                            $bcol = explode(",",$bcolor);
                            $border_color = @ImageColorAllocate($im, $bcol[0], $bcol[1], $bcol[2]);

                            $strng='';
                            for ($i=1; $i<=6;) # Anzahl der Zeichen
                            {
                            mt_srand((double)microtime()*1000000);
                            $char = mt_rand(48,122);

                            if($char>47 && $char<58 || $char>64 && $char<91 || $char>96 && $char<123)
                             {
                             $strng.=chr($char);
                             $i++;
                             }
                            }

                            @imagefill($im, 0, 0, $lightgray);

                            Rahmen und Logo setzen

                            @imagerectangle($im, 0, 0, $MaxX-1, $MaxY-1, $border_color);
                            @imagestring($im, 5, $tx, $ty, $strng, $text_color);
                            @imagepng($im);
                            ?>

                            freundl. Grüße aus Berlin, Raik

                            1. Hi Raik!

                              ist kein schöner code, also nicht meckern: ;-)

                              <?

                              (...)

                              ?>

                              genau so und nicht anders hätte ich das auch programmiert, wenns ichs gewusst hätte. Super! Vielen Dank dafür!
                              Da kann ich mir echt was abgucken.
                              Auf der Arbeit werde ich extrem viel gelobt für meine Programme, ich finde meine Scripte aber teilweise misserabel :-)

                              Wollen wir noch die komplett lösung fürs Archiv Probieren?:

                              3 Scripte:

                              index.php:
                              <FORM METHOD="POST" ACTION="action.php">
                              <TABLE>
                              <TR>
                               <TD>Username</TD>
                               <TD><INPUT TYPE="text" NAME="usr"></TD>
                              </TR>
                              <TR>
                               <TD>Ect</TD>
                               <TD><INPUT TYPE="text" NAME="ect"></TD>
                              </TR>
                              <TR>
                               <TD>Sicherheits-Code</TD>
                               <TD><INPUT TYPE="text" NAME="sc"></TD>
                              </TR>
                              <TR>
                               <TD></TD>
                               <TD><INPUT TYPE="submit"></TD>
                              </TR>
                              </TABLE>
                              </FORM>
                              Bitte tragen Sie in das Feld "Sicherheits-Code" die Zahlen- und Buchstaben-Kombination die auf dem Grauen Bild zu sehen sind.<br>
                              <IMG SRC="bild.php" BORDER="0" ALT="Sicherheits-Code">
                              --

                              action.php:
                              <?php
                              SESSION_START();
                              $secure=$_SESSION['secure'];

                              if($usr=='')$stop=true;
                              if($ect=='')$stop=true;
                              if($sc!=$secure)$stop=true;

                              if($stop!=true)
                              {
                               $qry = "INSERT INTO usrtbl (usr, ect) VALUES('$usr', '$ect')";
                               print $qry; // :-)
                              }
                              else
                              {
                               print "na stimmt was nicht :-o";
                              }
                              ?>
                              --

                              bild.php:
                              <?
                              SESSION_START();

                              Textposition

                              $tx     = 9;
                              $ty     = 7;

                              Dimension

                              $MaxX   = 70;
                              $MaxY   = 30;

                              Bild erstellen

                              header("Content-type: image/png");
                              $im = @imagecreate($MaxX,$MaxY);

                              Farben definieren

                              $white = @ImageColorAllocate($im, 255,255,255);
                              $red = @ImageColorAllocate($im, 255,0,0);
                              $green = @ImageColorAllocate($im, 0,255,0);
                              $gray = @ImageColorAllocate($im, 128,128,128);
                              $lightgray = @ImageColorAllocate($im, 224,224,224);
                              $lightblue = @ImageColorAllocate($im, 128,128,255);

                              @ImageColorTransparent($im, $white); # weiß = transparent

                              $tcol = explode(",",$tcolor);
                              $text_color = @ImageColorAllocate($im, $tcol[0], $tcol[1], $tcol[2]);
                              $bcol = explode(",",$bcolor);
                              $border_color = @ImageColorAllocate($im, $bcol[0], $bcol[1], $bcol[2]);

                              $strng='';
                              for ($i=1; $i<=6;) # Anzahl der Zeichen
                              {
                              mt_srand((double)microtime()*1000000);
                              $char = mt_rand(48,122);

                              if($char>47 && $char<58 || $char>64 && $char<91 || $char>96 && $char<123)
                               {
                               $strng.=chr($char);
                               $i++;
                               }
                              }

                              $_SESSION['secure']=$strng;

                              @imagefill($im, 0, 0, $lightgray);

                              Rahmen und Logo setzen

                              @imagerectangle($im, 0, 0, $MaxX-1, $MaxY-1, $border_color);
                              @imagestring($im, 5, $tx, $ty, $strng, $text_color);
                              @imagepng($im);
                              ?>

                              Hast du das so gemeint?

                              MfG Ulf

                              1. Hi,

                                Wollen wir noch die komplett lösung fürs Archiv Probieren?:
                                {...]

                                fuer's Archiv weise ich an dieser Stelle auch gerne darauf hin, dass es z.B. auch der Anforderungslage genuegen wuerde beispielsweise ein Bild aus einer Bildermenge beim Anmeldevorgang zur Ansicht zu bringen und den Nutzer aufzufordern dieses zu beschreiben. Beispiele: Ein Hundefoto kommt hoch: erwartete Nutzereingabe: 'Hund' oder eine bekannte politische Persoenlichkeit kommt als Foto hoch: erwartete Nutzereingabe 'Saddam'.

                                Und dieses Beispiel gibt uns dann auch die Moeglichkeit diese Loesung etwas abstrakter zu betrachten. Dem Nutzer wird aufgegeben eine kleine Aufgabe zu loesen, die wahrscheinlich nur er loesen kann, also eine IT-Routine nicht. Aus diesem Grund wird also bevorzugterweise mit Bildern gearbeitet, die Zahlen oder Buchstaben repraesentieren, da davon ausgegangen werden darf, dass der Nutzer solche Aufgaben loesen kann. Alles soz. eine Schnittstelle "Mensch".

                                Gruss,
                                Luddie

                                ---
                                "Wer nicht kaempft, hat schon gewonnen."

                                1. fuer's Archiv weise ich an dieser Stelle auch gerne darauf hin, dass es z.B. auch der Anforderungslage genuegen wuerde beispielsweise ein Bild aus einer Bildermenge beim Anmeldevorgang zur Ansicht zu bringen und den Nutzer aufzufordern dieses zu beschreiben. Beispiele: Ein Hundefoto kommt hoch: erwartete Nutzereingabe: 'Hund' oder eine bekannte politische Persoenlichkeit kommt als Foto hoch: erwartete Nutzereingabe 'Saddam'.

                                  da müsste man aber die einzelnen bilder auch als original irgendwo haben also sprich hund.jpg oder saddam.gif, obwohl man ja den quelltext der einzelnen bilder im script hinterlegen könnte und je nach zufallszahl dann das bild in bild.jpg schreiben was zufällig auserwählt wurde.

                                  beispiel:
                                  moegliche_bilder[]="
                                  GIF89aì ...";
                                  Der kopiert mir die zeichen nicht... hm - hoffentlich weiss jeder was ich mein. einfach mal ein bild in den editor ziehen.

                                  also ein array mit allen möglichen bilderquelltexten und am ende schriebe ich $qt = moegliche_bilder[$zufallszahl];

                                  und $qt wird einfach als bild.jpg abgespeichert.
                                  so ist das auch immer das selbe bild.

                                  nochmal zum 1. beispiel mit den 3 Scripten, kann man das jetzt letzendlich so wie ich es zusammen mit Raik geschrieben habe verwenden ohne das ein hacker "durch" kommt? und eben das machen kann worum es hier schon die ganze zeit geht? - massenhafte scherzanmeldungen.

                                  MfG Ulf

                                  1. Hi,

                                    nochmal zum 1. beispiel mit den 3 Scripten, kann man das jetzt letzendlich so wie ich es zusammen mit Raik geschrieben habe verwenden ohne das ein hacker "durch" kommt? und eben das machen kann worum es hier schon die ganze zeit geht? - massenhafte scherzanmeldungen.

                                    ich will mir nicht den Code anschauen, aber der Vorschlag von 'Raik' ist einfach gut, also fuer Deine Zwecke wie geschaffen.

                                    Und wenn doch ein Hacker "durchkommt", dann musst Du die "Raetsel" schwieriger machen (nicht fuer den Menschen, sondern fuer die IT-Routinen, also letztlich den "Hacker").

                                    Gruss,
                                    Lude

                                    ---
                                    "Bis Weihnachten brauchen wir Klarheit bei der Maut."

                                  2. Hallo Ulf,

                                    kann man das jetzt letzendlich so wie ich es zusammen mit Raik geschrieben habe verwenden ohne das ein hacker "durch" kommt?

                                    100%ig sicher ist _keine_ lösung. mit entsprechender rechenpower, speziellen ocr-programmen und etwas programierung kommt man auch da durch. allerdings wird jemand, der das hat/kann, in der regel seine resourcen für lohnendere ziele einsetzen.

                                    freundl. Grüße aus Berlin, Raik

                                    1. Hi Raik!

                                      Die frage ob das nun letztendlich so "perfekt" ist bezog sich eigentlich mehr auf die 3 Scripte. Hast du sie die mal angeschaut.

                                      Ich Registriere in der Session deine varible strng als secure und frage in action.php ab ob die benutzer eingabe $sc == $secure ist.
                                      kann man das so lassen?

                                      oder soll ich ausserdem noch abragen ob $sc == '' ist, oder brauche ich das nicht?

                                      MfG Ulf

                                      1. soll ja nur füs archiv gemeint sein, nicht das ich hier ein script poste das so aussieht als ob es das ist von was wir hier die ganzezeit schwätzen und dann sind da genau die fehler drin die man nicht machen sollte und alle denken es wäre richtig so und wenden es an und hacker kommen doch durch. deswegen schau es dir doch einfach mal kurz an.

                                        MfG und Danke an alle die sich bisjetzt an diesem Thread beteiligt haben! Ulf

                                        1. Hallo Ulf,

                                          soll ja nur füs archiv gemeint sein, nicht das ich hier ein script poste das so aussieht als ob es das ist von was wir hier die ganzezeit schwätzen und dann sind da genau die fehler drin die man nicht machen sollte und alle denken es wäre richtig so und wenden es an und hacker kommen doch durch.

                                          mit sessions hab ich noch nicht gearbeitet, weil ich solche sachen sowieso nur local entwickle. davon wurde noch nichts in einer produktiv-umgebung eingesetzt.

                                          ich würde auf den einsatz von cookies verzichten und die session-id in einem hidden-field übergeben.
                                          _zuerst_ muss eine gültige session angelegt werden, damit die bild.php später ihre kombination darin speichern kann.
                                          dann muss das formular mit der session-id ausgeliefert werden, was den aufruf der bild.php bewirkt.
                                          es sollte nur bei einem aufruf der action-php ohne gültige session-id eine neue session gestartet werden.
                                          es muss sichergestellt werden, das wärend des forganges die vorhandene session benutz und nicht eine neue angelegt wird.
                                          probier es einfach mal aus und lass dir dabei dir variablen mit anzeigen.
                                          und dann poste den code hier nochmal, damit wir alle zusammen nach eventuellen fehlern suchen können. viele augen sehen mehr ... ;-)

                                          freundl. Grüße aus Berlin, Raik

                                          1. ich musste den beitrag jetzt 5 mal lesen um ihn zu kapieren.
                                            ich glaube du meinst ich sollte um mich abzusichern die $PHPSESSID mit übergeben um sicherzustellen das kein Script action.php so einfach überlisten kann, so als zweite absicherung!?

                                            dann würde das so aussehen:

                                            index.php:
                                            <?php
                                            SESSION_START();
                                            ?>
                                            <FORM METHOD="POST" ACTION="action.php">
                                            <INPUT TYPE="hidden" NAME="sid" VALUE="<?php echo $PHPSESSID; ?>">
                                            <TABLE>
                                            <TR>
                                             <TD>Username</TD>
                                             <TD><INPUT TYPE="text" NAME="usr"></TD>
                                            </TR>
                                            <TR>
                                             <TD>Ect</TD>
                                             <TD><INPUT TYPE="text" NAME="ect"></TD>
                                            </TR>
                                            <TR>
                                             <TD>Sicherheits-Code</TD>
                                             <TD><INPUT TYPE="text" NAME="sc"></TD>
                                            </TR>
                                            <TR>
                                             <TD></TD>
                                             <TD><INPUT TYPE="submit"></TD>
                                            </TR>
                                            </TABLE>
                                            </FORM>
                                            <IMG SRC="bild.php" BORDER="0" ALT="Sicherheits-Code">
                                            --

                                            bild.php:
                                            <?
                                            SESSION_START();

                                            Textposition

                                            $tx     = 9;
                                            $ty     = 7;

                                            Dimension

                                            $MaxX   = 70;
                                            $MaxY   = 30;

                                            Bild erstellen

                                            header("Content-type: image/png");
                                            $im = @imagecreate($MaxX,$MaxY);

                                            Farben definieren

                                            $white = @ImageColorAllocate($im, 255,255,255);
                                            $red = @ImageColorAllocate($im, 255,0,0);
                                            $green = @ImageColorAllocate($im, 0,255,0);
                                            $gray = @ImageColorAllocate($im, 128,128,128);
                                            $lightgray = @ImageColorAllocate($im, 224,224,224);
                                            $lightblue = @ImageColorAllocate($im, 128,128,255);

                                            @ImageColorTransparent($im, $white); # weiß = transparent

                                            $tcol = explode(",",$tcolor);
                                            $text_color = @ImageColorAllocate($im, $tcol[0], $tcol[1], $tcol[2]);
                                            $bcol = explode(",",$bcolor);
                                            $border_color = @ImageColorAllocate($im, $bcol[0], $bcol[1], $bcol[2]);

                                            $strng='';
                                            for ($i=1; $i<=6;) # Anzahl der Zeichen
                                            {
                                            mt_srand((double)microtime()*1000000);
                                            $char = mt_rand(48,122);

                                            if($char>47 && $char<58 || $char>64 && $char<91 || $char>96 && $char<123)
                                             {
                                             $strng.=chr($char);
                                             $i++;
                                             }
                                            }

                                            $_SESSION['bildsid']=$PHPSESSID;
                                            $_SESSION['secure']=$strng;

                                            @imagefill($im, 0, 0, $lightgray);

                                            Rahmen und Logo setzen

                                            @imagerectangle($im, 0, 0, $MaxX-1, $MaxY-1, $border_color);
                                            @imagestring($im, 5, $tx, $ty, $strng, $text_color);
                                            @imagepng($im);
                                            ?>
                                            --

                                            action.php:
                                            <?php
                                            SESSION_START();
                                            $secure=$_SESSION['secure'];
                                            $bildsid=$_SESSION['bildsid'];

                                            if($usr=='')$stop=true;
                                            if($ect=='')$stop=true;
                                            if($sid!=$bildsid)$stop=true;
                                            if($sc!=$secure)$stop=true;

                                            if($stop!=true)
                                            {
                                             $qry = "INSERT INTO usrtbl (usr, ect) VALUES('$usr', '$ect')";
                                             print $qry; // :-)
                                            }
                                            else print "na stimmt was nicht :-o<br>";
                                            ?>

                                            so kontrolliere ich ausserdem das man meinen link benutzt.

                                            aber die SESSION_START(); in action.php brauche ich doch.

                                            MfG Ulf

                                            1. Hallo Ulf,

                                              ich glaube du meinst ich sollte um mich abzusichern die $PHPSESSID mit übergeben um sicherzustellen das kein Script action.php so einfach überlisten kann, so als zweite absicherung!?

                                              nein, nicht als zweite absicherung.

                                              (wie gesagt, ich weis nicht genau, wie sessions funktionieren, weil ich damit noch nicht gearbeitet habe.
                                              wird die session-id beim aufruf eines php-scriptes mit an den browser und von diesem nach ausfüllen des formulars wieder mit zurück an den server gegeben, auch wenn diese nicht im formular vorhanden ist?)

                                              in deinem vorherigen beispiel wurde index.html als erstes geladen.
                                              in der index.html wird bild.php aufgerufen.
                                              diese soll eigendlich beim aufruf ihre komination in einer gültigen session speichern.
                                              die ist aber zu diesem zeitpunkt noch garnicht angelegt.

                                              ich würde das ja so machen (weis allerdings nicht, ob das notwendig ist):

                                              index.php:
                                              <?php
                                              SESSION_START();
                                              ?>
                                              <FORM METHOD="POST" ACTION="action.php">
                                              <INPUT TYPE="hidden" NAME="sid" VALUE="<?php echo $PHPSESSID; ?>">
                                              <TABLE>
                                              <TR>
                                              <TD>Username</TD>
                                              <TD><INPUT TYPE="text" NAME="usr"></TD>
                                              </TR>
                                              <TR>
                                              <TD>Ect</TD>
                                              <TD><INPUT TYPE="text" NAME="ect"></TD>
                                              </TR>
                                              <TR>
                                              <TD>Sicherheits-Code</TD>
                                              <TD><INPUT TYPE="text" NAME="sc"></TD>
                                              </TR>
                                              <TR>
                                              <TD></TD>
                                              <TD><INPUT TYPE="submit"></TD>
                                              </TR>
                                              </TABLE>
                                              </FORM>
                                              IMG SRC="bild.php?sid="<?php echo $PHPSESSID; ?>" BORDER="0" ALT="Sicherheits-Code">

                                              ^^^^^^^^^^^^^^^^^^^^^^^^^
                                              muss das sein, oder "erfährt" bild.php auch so von der session-id, die es benutzen soll?

                                              --

                                              bild.php:
                                              <?
                                              SESSION_START();

                                              wenn die aktuelle session nicht automatisch mit übergeben wird, müsste hier erst mal abgefragt werden, ob eine session-id ("$sid") übergeben wurde und ob sie gültig ist. ohne session-id script einfach beenden (" ... or die();").

                                              Textposition

                                              $tx     = 9;
                                              $ty     = 7;

                                              Dimension

                                              $MaxX   = 70;
                                              $MaxY   = 30;

                                              Bild erstellen

                                              header("Content-type: image/png");
                                              $im = @imagecreate($MaxX,$MaxY);

                                              Farben definieren

                                              $white = @ImageColorAllocate($im, 255,255,255);
                                              $red = @ImageColorAllocate($im, 255,0,0);
                                              $green = @ImageColorAllocate($im, 0,255,0);
                                              $gray = @ImageColorAllocate($im, 128,128,128);
                                              $lightgray = @ImageColorAllocate($im, 224,224,224);
                                              $lightblue = @ImageColorAllocate($im, 128,128,255);

                                              @ImageColorTransparent($im, $white); # weiß = transparent

                                              $tcol = explode(",",$tcolor);
                                              $text_color = @ImageColorAllocate($im, $tcol[0], $tcol[1], $tcol[2]);
                                              $bcol = explode(",",$bcolor);
                                              $border_color = @ImageColorAllocate($im, $bcol[0], $bcol[1], $bcol[2]);

                                              $strng='';
                                              for ($i=1; $i<=6;) # Anzahl der Zeichen
                                              {
                                              mt_srand((double)microtime()*1000000);
                                              $char = mt_rand(48,122);

                                              if($char>47 && $char<58 || $char>64 && $char<91 || $char>96 && $char<123)
                                              {
                                              $strng.=chr($char);
                                              $i++;
                                              }
                                              }

                                              $_SESSION['bildsid']=$PHPSESSID;
                                              $_SESSION['secure']=$strng;

                                              @imagefill($im, 0, 0, $lightgray);

                                              Rahmen und Logo setzen

                                              @imagerectangle($im, 0, 0, $MaxX-1, $MaxY-1, $border_color);
                                              @imagestring($im, 5, $tx, $ty, $strng, $text_color);
                                              @imagepng($im);
                                              ?>

                                              action.php:
                                              <?php
                                              SESSION_START();

                                              hier muss bei fehlender oder gültiger session-id ein header-redirekt zur index.php rein.
                                              deshalb würde ich den inhalt der action.php auch mit in die index.php packen, weil dann statt eines requests an den browser einfach nur ein sprung an eine andere stelle des scriptes nötig wäre.

                                              $secure=$_SESSION['secure'];
                                              $bildsid=$_SESSION['bildsid'];

                                              if($usr=='')$stop=true;
                                              if($ect=='')$stop=true;
                                              if($sid!=$bildsid)$stop=true;
                                              if($sc!=$secure)$stop=true;

                                              if($stop!=true)
                                              {
                                              $qry = "INSERT INTO usrtbl (usr, ect) VALUES('$usr', '$ect')";
                                              print $qry; // :-)
                                              }
                                              else print "na stimmt was nicht :-o<br>";
                                              ?>

                                              der ablauf wäre also:
                                              1. prüfen auf _gültige_ session-id
                                              wenn nein, wieder anzeige des formulars (neue session wird gestartet), sonst weiter
                                              2. prüfen der vom formular übergebenen variablen
                                              wenn nicht i.o., formular mit den werten nochmal anzeigen mit korrektur-aufforderung
                                              (dabei automatisch neue kombination von bild.php in session gespeichert), sonst weiter
                                              3. alles ok, dann eintrag in datenbank und anzeige der erfolgsmeldung (hier wird kombination von bild.php aus der session gelöscht).

                                              jetzt kannst du mir ja was über sessions beibringen. ;-)

                                              freundl. Grüße aus Berlin, Raik

                                              1. [pref:t=66996&m=382727]

                                2. Hallo Lude,

                                  Ein Hundefoto kommt hoch: erwartete Nutzereingabe: 'Hund' oder eine bekannte politische Persoenlichkeit kommt als Foto hoch: erwartete Nutzereingabe 'Saddam'.

                                  das ist ein problem. warum nicht "bernhardiner" oder "hussein" eingeben? zumal du bei der auswahl der bilder darauf achten musst, das dieses wissen global verfügbar ist. einen "hund" werden die meisten erkennen, "hussein" mag grossen teilen der weltbevölkerung unbekannt sein. ich kenn ja selbst die meisten deutschen politiker auf bundesebene nicht mit bild, wenn sie nicht gerade, wie gerster, 77 mio verpulvern.

                                  Und dieses Beispiel gibt uns dann auch die Moeglichkeit diese Loesung etwas abstrakter zu betrachten. Dem Nutzer wird aufgegeben eine kleine Aufgabe zu loesen, die wahrscheinlich nur er loesen kann, also eine IT-Routine nicht. Aus diesem Grund wird also bevorzugterweise mit Bildern gearbeitet, die Zahlen oder Buchstaben repraesentieren, da davon ausgegangen werden darf, dass der Nutzer solche Aufgaben loesen kann. Alles soz. eine Schnittstelle "Mensch".

                                  genau darüber habe ich in benji's tread zum verstecken der email-adresse mit emu diskutiert, aber da war das "teufelszeug". :-/

                                  freundl. Grüße aus Berlin, Raik

                                  1. Hi,

                                    das ist ein problem. warum nicht "bernhardiner" oder "hussein" eingeben?

                                    war ja nur ein Beispiel fuer Zwecke der Eroerterung.

                                    Alles soz. eine Schnittstelle "Mensch".

                                    genau darüber habe ich in benji's tread zum verstecken der email-adresse mit emu diskutiert, aber da war das "teufelszeug". :-/

                                    Alles ist richtig mit dem man Geld verdienen kann. Sogar das "User Online"-Konzept oder das Ausschliessen bestimmter Browser unter bestimmten Bedingungen (nein, ich plaediere nicht dafuer).

                                    Gruss,
                                    Lude

                2. Hi,

                  die Loesung ist huebsch und mir relativ neu. - Wie heisst das Konzept?

                  Gruss,
                  Lude

                  1. Hallo Lude,

                    die Loesung ist huebsch und mir relativ neu. - Wie heisst das Konzept?

                    nö, is nich neu. guck mal bei vbulletin bei der anmeldung:
                    http://www.vbulletin.com/forum/register.php
                    da gibts das z.b.
                    hab ich vor ein paar jahren schon gesehen hier und da.

                    freundl. Grüße aus Berlin, Raik

              2. Hi,

                obwohl der schadenhinzufüger bekommt ja auch kein resultat also weiss er auch nicht ob es geklappt hat oder... hm.. doch er kann sich ja einfach mal anmelden. - das internet ist echt beschissen!5

                Moment, da werde ich hellhoerig. Immerhin erlaubt es Dir doch Dich in einer Form weiterzubilden, so dass ein Kenntnisstand erreicht wird, der Dich von Aussagen der o.g. Art abhalten wird. Also nutze, was Dir nuetzt.

                Gruss,
                Lude