Ankündigung

Einklappen
Keine Ankündigung bisher.

Submit-Button ohne Button :)

Einklappen

Neue Werbung 2019

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

  • Submit-Button ohne Button :)

    Ich möchte ein Formular mit dem Klick auf einen Text absenden, also keinen regulären langweiligen Button durch <input type="submit">.

    Wie man das macht hab ich gegooglet. Es scheint aber, meine Javascript Funktion wird nicht gefunden. Ich zeig euch erstmal meinen Code.

    Code:
    function submit(building) {
      document.getElementById(building).submit();
      prompt("Test");
    }
    Wie ihr seht hab ich noch was mit eingefügt um das ganze zu testen und das Ergebnis ist, dass nicht mal das prompt() ausgeführt wird.
    Die Datei mit der JavaScript Funktion inkludiert später eine weitere Datei, wo dann das eigentliche Formular ist.

    In der inokulierten Datei habe ich eine PHP-Funktion:
    PHP-Code:
    function buildingRow($name$building) {
        global 
    $village$price$duration;
        echo 
    "<tr>
            <td>"
    .$name." (Stufe ".$village[$building].")</td>
            <td><img src='graphic/holz.png' height='16' style='vertical-align:middle;'>"
    .$price[$building]['holz']." <img src='graphic/stein.png' height='16' style='vertical-align:middle;'>".$price[$building]['stein']." <img src='graphic/eisen.png' height='16' style='vertical-align:middle;'>".$price[$building]['eisen']."</td>
            <td>"
    .gmDate("H:i:s"$duration[$building])."</td>
            <td><form name='"
    .$building."' method='post'><span onclick='submit(".$building.")'>Auf Stufe ".newLevel($building)." ausbauen</span></form></td>
            </tr>"
    ;

    Der Teil zwischen den <span>-Tags soll den Button ersetzen. Wenn ich nun auf den Text klicke, lädt die Seite neu. Mehr nicht.


  • #2
    ich verstehe nicht ganz, was du willst, aber wenn du einen link willst, nimm get, wenn du einen button willst, der wie ein link aussieht:

    http://stackoverflow.com/questions/4...play-as-a-link
    http://blog.natbat.net/post/46614475...ttons-as-links

    Kommentar


    • #3
      Hab mir schon gedacht, dass man es über CSS machen können müsste.
      Noch ne Frage nebenbei: Ich möchte nicht, dass wenn man F5 klickt die Anfrage vom Browser kommt, ob man das Formular nochmal gesendet haben möchte. Ich weiß es klingt eigentlich ziemlich banal. Aber es geht hier um ein Browsergame und die Formulare sind die Ausbau-Buttons im Hauptgebäude.

      Kommentar


      • #4
        http://php-de.github.io/jumpto/affenformular/

        Kommentar


        • #5
          Zitat von String Beitrag anzeigen
          Hab mir schon gedacht, dass man es über CSS machen können müsste.
          Noch ne Frage nebenbei: Ich möchte nicht, dass wenn man F5 klickt die Anfrage vom Browser kommt, ob man das Formular nochmal gesendet haben möchte. Ich weiß es klingt eigentlich ziemlich banal. Aber es geht hier um ein Browsergame und die Formulare sind die Ausbau-Buttons im Hauptgebäude.
          Dann mach aus den Buttons links, also mit GET. Wegen CSRF Attacken musst du sowieso ein Token machen, sodass man nichts ausversehen doppelt bauen kann.
          Fatal Error: Windows wird gestartet

          Wie administriert man ein Netzwerk: Beispiel

          Kommentar


          • #6
            Meinst du dass er erst auf url/?build=kaserne weiterleitet, wo ausgebaut wird und dann direkt wieder auf url/ weiterleitet, sodass beim Neuladen nicht wieder ausgebaut wird oder wie? Und was sind Tokens?

            Kommentar


            • #7
              http://de.wikipedia.org/wiki/Cross-Site-Request-Forgery

              Kommentar


              • #8
                Kann mir das nochmal jemand in eigenen Worten erklären? Ich hab verstanden, und das klingt schon mal sehr interessant, dass aufgrund selber Cookies und Links, Aktionen auf anderen geöffneten Seiten im Browsern ausgeführt werden kann.. Aber wie genau das ist mir nicht klar geworden. Was Tokens sind, weiß ich jetzt auch.. Daten, die versteckt im HTML-Teil sind, die ich abrufen kann. Wie die Idee nun aussieht, wozu ich jetzt Tokens brauche und wieso ich das Formular über GET vermitteln soll, leuchtet mir auch nicht ein :S

                Kommentar


                • #9
                  naja bei jedem Request erzeugst du ein Token und speicherst dies in der Session des nutzers. Wenn der User was machen will (Gebäude bauen) dann hängst du das Token an den Link an, oder an das Post Formular und prüfst ob das Token richtig ist. Dann am besten neues Token generieren und das alte in der Session überschreiben. Das ist der wirksamste Schutz und verhindert zusätzlich, dass ein Spieler mit dem Zurückbuttom im Browser Aktionen ungewollt doppelt ausführt, die per GET ausgeführt werden.
                  GET hat einfach den Vorteil, dass der User dieses "Willst du die Seite wirklich neuladen" nicht bekommt.
                  Fatal Error: Windows wird gestartet

                  Wie administriert man ein Netzwerk: Beispiel

                  Kommentar


                  • #10
                    Danke für den Erklärungsversuch Ich hoffe ich hab das jetzt verstanden.
                    Etwa so?

                    User klickt auf Hauptgebäude
                    -> $_SESSION["token"] = $random
                    User klickt auf "Gebäude ausbauen"
                    -> GET-Formular absenden mit $random
                    ---> if ($_GET["token"] == $_SESSION["token"]) { upgradeBuilding() }
                    ------> $_SESSION["token"] = $newRandom

                    Was ich immer noch nicht verstanden habe ist, wieso "Cross Side Requests" möglich sind. Ich meine, wie kann es sein, dass eine Aktion auf dem ersten Tab, wie das Löschen des Benutzeraccounts, auf einer anderen Seite in einem anderen Tab passiert.

                    Kommentar


                    • #11
                      Hallöchen,

                      Zitat von String Beitrag anzeigen
                      ---> if ($_GET["token"] == $random) {
                      Da sollte $_SESSION['token'] statt $random stehen.

                      Zitat von String Beitrag anzeigen
                      Was ich immer noch nicht verstanden habe ist, wieso "Cross Side Requests" möglich sind. Ich meine, wie kann es sein, dass eine Aktion auf dem ersten Tab, wie das Löschen des Benutzeraccounts, auf einer anderen Seite in einem anderen Tab passiert.
                      Das liegt daran, dass deine Session-Id an den Server übertragen wird - auch wenn der Request (bspw. um Gebäude zu löschen) über eine externe Website erzeugt wurde (durch ein manipuliertes Formular o.ä.). Da die externe Website dein Token aber nicht kennt, bleibt der Angriff auf diese Weise wirkungslos.

                      Viele Grüße,
                      lotti

                      Kommentar


                      • #12
                        Mhm... das ist mir immer noch nicht ganz klar. Gut ist nur, dass ich weiß wie ich das jetzt verhindere. Ich erinnere mich gut gelesen zu haben, dass das Token tatsächlich im HTML ausgegeben wird, bloß eben nicht sichtbar ist (display: none). Wieso das... reicht doch dass ich die Variable kenne, wozu noch ausgeben?

                        Kommentar


                        • #13
                          Hallöchen,

                          Zitat von String Beitrag anzeigen
                          Mhm... das ist mir immer noch nicht ganz klar. Gut ist nur, dass ich weiß wie ich das jetzt verhindere. Ich erinnere mich gut gelesen zu haben, dass das Token tatsächlich im HTML ausgegeben wird, bloß eben nicht sichtbar ist (display: none). Wieso das... reicht doch dass ich die Variable kenne, wozu noch ausgeben?
                          Üblicherweise wird das Token über ein hidden-Field in ein Formular integriert. Somit wird das Token beim Submit, samt den restlichen Formulardaten, an den Server übertragen. Dort wird bei jedem Request geprüft ob das Token korrekt ist und nur dann wird die gewünschte Aktion auch tatsächlich durchgeführt.

                          Viele Grüße,
                          lotti

                          Kommentar


                          • #14
                            Ich persönlich nutze eine Token Klasse, mit 2 statischen Methoden. getToken() und verifyToken(). Dabei gibt Token den token zurück und schreibt ihn in die Session. verifyToken kontrolliert ein $_REQUEST['token'] mit dem $_SESSION['token']. Hierbei am besten nicht die Session löschen, sonst funktioniert Ajax nicht mehr.
                            Fatal Error: Windows wird gestartet

                            Wie administriert man ein Netzwerk: Beispiel

                            Kommentar


                            • #15
                              Gut zu wissen.

                              Na dann setze ich das mal in die Praxis um und sehe wie weit ich komme. Danke euch

                              Kommentar

                              Lädt...
                              X