Formular soll nicht weiterleiten bei deaktiviertem JavaScript
Tobi
- javascript
0 Felix Riesterer0 Rouven0 Tobi0 Felix Riesterer0 EKKi
Hallo liebe Helfer!
ich habe ein Problem mit meinem Formular.
Ich überprüfe die Richtigkeit der Eingaben mit JS. Wenn JS allerdings deaktiviert ist, leitet mich das Formular trotzdem zur Antwortseite. Kann mir jemand sagen, wie ich das verhindern kann?
Vielen Dank schon mal,
Tobi
Lieber Tobi,
ich habe ein Problem mit meinem Formular.
so? Was tut denn damit/daran nicht?
Ich überprüfe die Richtigkeit der Eingaben mit JS.
Das ist unzuverlässig. Eine serverseitige Prüfung sollte zwingende Voraussetzung, eine clientseitige Prüfung optional (für z.B. höheren Bedienkomfort) sein.
Wenn JS allerdings deaktiviert ist, leitet mich das Formular trotzdem zur Antwortseite.
So ist das auch richtig.
Kann mir jemand sagen, wie ich das verhindern kann?
Ja: Verzichte auf das Formular. Ist es vorhanden, kann es auch abgeschickt werden.
Liebe Grüße,
Felix Riesterer.
Hello,
Ja: Verzichte auf das Formular. Ist es vorhanden, kann es auch abgeschickt werden.
nur um Tobi die Dringlichkeit der serverseitigen Prüfung zu zeigen würde ich sogar noch einen Schritt weiter gehen: auch ein Formular, das NICHT da ist, kann abgeschickt werden, sprich man kann entsprechende Parameter trotzdem zum Server übertragen, wenn man weiß welche.
MfG
Rouven
Ok, ich bin begeistert von den schnellen, qualifizierten Nicht-Antworten. Heißt das jetzt, dass es nicht geht, oder dass ihr hier nur zu schlau seid um mir das, aus Sicherheitsgründen, zu beantworten?
Ich bin normalerweise überhaupt kein Fan von JS, zumal ich es selbst sogar die meiste Zeit deaktiviert habe. In diesem Fall ist mir nur leider nichts anderes eingefallen, darum werde ich jetzt mal das Problem genauer beschreiben:
Ich wollte mir einiges an Arbeit sparen, in dem ich einen Formmailer benutze (Und bitte jetzt nicht sagen: "Benutz ihn einfach nicht". Es muss ja auch irgendwie so gehen).
Dadurch kann ich nicht, wie sonst bei action die Formularseite selbst aufrufen um die Eingaben zu prüfen.
Gleichzeitig sollen aber, da es sich um ein Registrierungsformular handelt, einträge in eine Datenbank gemacht werden.
Daraus Folgt:
Mir fallen nur ein paar Möglichkeiten ein.
1. Erst auf eine Prüfseite leiten. Also wie immer Eingaben mit PHP prüfen und auf Bestätigungsseite weiterleiten. Hier Formular mit Hidden-Fields und von dort aus dann den Formmailer ansprechen.
Problem: Wie leite ich weiter und übertrage gleichzeitig die Daten mit POST? Standartmäßig würde sich das Formular ja selbst aufrufen und es ginge nur mit Weiterleitung (Mal abgesehen davon brauche ich hier auch immer wieder JS, da header nie funktioniert, weil der header immer schon von anderen Funktionen abgeschickt wird. Falls mir da jemand helfen könnte...)
2. Action dynamisch ändern. Also die Seite sich so lange selbst aufrufen lassen, bis alle Eingaben richtig sind und dann das action-Ziel ändern. Da müsste der User das Formular allerdings 2 mal abschicken.
3. Mit JS prüfen und erst wenn alle eingaben korrekt sind abschicken.
So, ihr seht also es gibt viele Stellen, an denen ich an meine Grenzen stoße. Wenn ihr mir nur an einer weiter helfen könntet, würde ich mich sehr freuen.
Lieber Tobi,
Ok, ich bin begeistert von den schnellen, qualifizierten Nicht-Antworten.
Du hast Dich soeben disqualifiziert. Ist Dir schoneinmal eingefallen, dass Du etwas weniger Durchblick haben könntest, als die Dir Antwortenden? Warum fragst Du eigentlich, wenn Du es anscheinend doch besser weißt?
Heißt das jetzt, dass es nicht geht, oder dass ihr hier nur zu schlau seid um mir das, aus Sicherheitsgründen, zu beantworten?
Das heißt, dass Du genauer die Antworten lesen und überdenken solltest, bevor Du emotional reagierst. Das ist ein Fachforum, kein Streichelzoo.
In diesem Fall ist mir nur leider nichts anderes eingefallen, darum werde ich jetzt mal das Problem genauer beschreiben:
Warum hast Du das Problem dann nichtg gleich von Anfang an genauer beschrieben? Die Antworten unsererseits hätten dann noch hilfreicher ausfallen können. Aus exakt diesem Anlass heraus habe ich meine Antwort ja so "launisch" begonnen - mir fehlte eben das Problem an sich!
Dadurch kann ich nicht, wie sonst bei action die Formularseite selbst aufrufen um die Eingaben zu prüfen.
Du sprichst von einem Affenformular. Das ist bei entsprechender Programmierung so gut wie immer möglich. Ich sehe jedenfalls keinen Grund, warum das in Deinem Falle nicht so sein sollte.
- Erst auf eine Prüfseite leiten.
Was ist eine Prüfseite? Du kannst Doch das Formular auf sich selbst leiten und Dein Script prüft, ob etwas abgeschickt worden war (dann steht etwas in $_POST), oder nicht. Im ersteren Falle werden eben die Eingaben geprüft und entsprechend wieder ausgegeben (oder gespeichert, gemailt oder sonstwas), im zweiten Falle das Formular "einfach so" ausgegeben.
Also wie immer Eingaben mit PHP prüfen und auf Bestätigungsseite weiterleiten.
Was ist eine Bestätigungsseite? Kann Dein Script nicht nach erfolgreicher Bearbeitung einfach eine entsprechende Meldung ausgeben? Warum musst Du immer andere URLs aufrufen? Das geht doch auch unter ein-und-derselben!
(Mal abgesehen davon brauche ich hier auch immer wieder JS, da header nie funktioniert, weil der header immer schon von anderen Funktionen abgeschickt wird. Falls mir da jemand helfen könnte...)
Du sprichst von "Cookie-Daten senden" nachdem Du bereits HTML-Code an den Browser geschickt hast? Ein übliches Problem, wenn jemand mit Sessions noch nicht umzugehen gelernt hat... Bei meinem GB-Script haben Anfänger auch jedesmal das Problem, daher habe ich dort dafür eine kleine Hilfe geschrieben. Vielleicht hilft sie Dir zumindest beim Verständnis...?
- Mit JS prüfen und erst wenn alle eingaben korrekt sind abschicken.
Kann man umgehen. Rouven hat ja erklärt, dass sich jeder Kundige selbst ein Formular zusammenbasteln kann, um es an Deinen Server zu schicken. Das tun üblicherweise Bots...
So, ihr seht also es gibt viele Stellen, an denen ich an meine Grenzen stoße.
Und warum reagierst Du dann so pampig, wenn Du die erste Hilfestellung nicht gleich begriffen hast?
Wenn ihr mir nur an einer weiter helfen könntet, würde ich mich sehr freuen.
Wenn Du mit unserer Hilfe umgehen gelernt hast, dann wirst Du merken, dass wir Dich schon auf die richtige Richtung lenken. Du bekommst hier nicht immer das, was Du willst, aber immer das, was Du brauchst. Erkenne den Unterschied!
Liebe Grüße,
Felix Riesterer.
Hallo Felix,
mal wieder vielen dank für die rasante Antwort. Entschuldige, wenn meine letzte Antwort so pampig rüber gekommen ist. Das qualifiziert war durchaus nicht ironisch gemeint. Ich habe an euren Antworten gemerkt, dass ihr schon versteht, wovon ihr redet (im gegensatz zu vielen anderen Foren, wo erst mal 100 Leute ihren Senf abgeben, obwohl sie selbst keine Anhung haben).
Dennoch war es für mich leider keine Antwort. Also nichts, womit ich auch nur das geringste anfangen konnte. Ganz im Gegensatz zu deiner jetzigen Antwort. Sie gibt mir zwar auch nicht die endgültige Lösung des Problems, gibt mir aber Zielführende Hinweise (Entschuldige, wenn mir die vorherigen Hinweise nichts gebracht haben. Ihr habt ja schon bemerkt, dass ich erst in den Anfängen stecke). Ein einfaches: "Sorry, aber du musst dein Problem schon genauer beschreiben, damit wir dir helfen können", hätte beim ersten mal auch gereicht. Ich, der ich ja nicht bescheid weiß, kann ja nicht genau wissen, welche Informationen man braucht.
Aber jetzt zu deiner Antwort:
Unter einer Prüfseite verstehe ich eine Seite, auf der der User seine Eingaben nochmal prüfen kann. (Und nebenher bietet sie mir eine Möglichkeit mehr Eingaben zu prüfen. Ich weiß, nicht die schönste Methode)
Ok, so weit, dass ich nicht immer ne neue URL aufrufen muss, hab ich bis ich meine letzte Antwort geschrieben hatte noch nicht gedacht. Ich bin gerade dabei diesen Weg zu versuchen. Das ist auf jeden Fall eine gute Idee, die ich noch nicht ausprobiert hatte.
Ja, das header-Problem ist natürlich eins in der Art, wie du es auf deiner Seite beschreibst. Und natürlich hast du auch recht, dass ich mit sessions nicht umgehen kann. Aber auf die klassischen Fehler, wie Leerzeilen und co. hab ich das ganze schon geprüft. Was passiert denn genau, wenn ich mit header() die andere Seite aufrufe? Wie kann es da überhaupt sein, dass schon ein header abgeschickt wurde? Oder muss ich eher auf die Seite schauen, die aufgerufen wird? Liegt da dann die Funktion, die ein zweites mal den Header verschicken will? Hier benutze ich am Anfang session_start().
Also vielen, vielen Dank noch mal für deine letzte Antwort (und auch an Rouven, auch wenn ich noch nicht in der lage bin mit dieser Antwort umzugehen) und vielleicht hast du ja sogar noch die Geduld mir noch etwas mehr zu erklären.
Tobi
Lieber Tobi,
hast Du Dir das von mir verlinkte Beispiel zu einem Affenformular überhaupt angesehen? Darin sollten bereits einige Fragen Deinerseits geklärt werden.
Zusätzlich kannst Du versteckte Eingabefelder in ein Formular einbauen - je nachdem, was Dein Script gerade braucht.
<input type="hidden" name="geheim" value="secret" />
Mit solchen Feldern kannst Du zum einen bereits eingegebene Werte "mitführen", oder z.B. vermerken, dass Du eine Vorschau bereits bestätigen hast lassen. Der User sieht das nicht, klickt auf bestätigen, und der Server "weiß" nun, dass der User das schon zum zweiten Mal abschickt. Zur Sicherheit vor Bots kannst Du das mit einer Session begleiten, in der z.B. der Wert für name und value zufällig gewählt wird. In meinem GB-Script mache ich das so. Damit stellst Du sicher, dass der User das Eingegebene bestätigt.
Ein einfaches: "Sorry, aber du musst dein Problem schon genauer beschreiben, damit wir dir helfen können", hätte beim ersten mal auch gereicht.
Nö, dazu haben wir unsere Tipps für Fragende, die man über die FAQ erreichen kann. Als routinierter Forenbenutzer weißt Du ja, dass man tunlichst sich diese durchlesen und beherzigen sollte... ;-)
Ich, der ich ja nicht bescheid weiß, kann ja nicht genau wissen, welche Informationen man braucht.
Und wir, die wir nicht wissen, was Dir im Geiste vorschwebt, können ja nicht ahnen, dass Deine Problembeschreibung ungenau war, denn zu Deinem OP habe ich Dir im Grunde genommen vollständig geantwortet.
Ok, so weit, dass ich nicht immer ne neue URL aufrufen muss, hab ich bis ich meine letzte Antwort geschrieben hatte noch nicht gedacht.
Lies Dir bitte nocheinmal den von mir verlinkten Thread zu einem Affenformular durch! Die beiden Beispiele solltest Du unbedingt durcharbeiten!
Ja, das header-Problem ist natürlich eins in der Art, wie du es auf deiner Seite beschreibst. Und natürlich hast du auch recht, dass ich mit sessions nicht umgehen kann.
Alles Übung und Erfahrung. Da musste ich auch ganz klein und von vorne anfangen.
Aber auf die klassischen Fehler, wie Leerzeilen und co. hab ich das ganze schon geprüft. Was passiert denn genau, wenn ich mit header() die andere Seite aufrufe?
Du rufst überhaupt nix auf. Du sagst nur dem Browser, er solle nach dem Erhalt der Seite eine neue Seite anfordern (was möglicherweise ein weiteres Script aufruft), und zwar nach x Sekunden. Außerdem kannst Du mit der header()-Funktion alle möglichen HTTP-Kopfdaten senden, nicht nur die refresh-Angabe, sondern auch Cookie-Daten (wird vom Session-Mechanismus benötigt), MIME-Typ, Zeichensatzkodierung und noch viel mehr.
Wie kann es da überhaupt sein, dass schon ein header abgeschickt wurde?
In dem Moment wo Daten an den Browser gesendet werden (also das, was zum HTML-Dokument oder Bilddatei oder, oder, oder gehört), muss diesen der HTTP-Header vorausgehen. In dem Moment wo das geschehen ist, können natürlich nachträglich keine weiteren Header-Daten mehr gesendet werden. In diesem Falle ist der Aufruf der header()-Funktion sinnfrei und PHP quittiert das auch mit einer entsprechenden Warnung.
Oder muss ich eher auf die Seite schauen, die aufgerufen wird?
Nein, Du musst nur Dein Konzept überdenken - und gegebenenfalls vereinfachen.
Liebe Grüße,
Felix Riesterer.
Lieber Felix,
Du musst nur Dein Konzept überdenken - und gegebenenfalls vereinfachen.
ich bin mir nicht ganz sicher, ob ich rüber gebracht habe, dass der Formmailer ein Service einer anderen Seite ist. Das ist eigentlich das, was mir die meisten Probleme macht. Wenn alles auf meinen Seiten bleiben würde, dann wär es nicht so schwer gleichzeitig die SQL-Befehle und die Mail zu schicken. Da aber das Mail schicken auf der fremden Seite stattfindet, kann ich die Post-Daten nicht auswerten.
Soviel nur zum Verständnis. Kann sein, dass das für deine Antworten keinen Unterschied macht, aber das ist das, womit ich mich die ganze Zeit rum schlage. Insofern hab ich mien Konzept schon 100 mal überdacht und 200 mal umgeworfen. Ich komm aber einfach auf keine Lösung.
Dein Beispiel Affenformular hab ich beim ersten mal tatsächlich überlesen. Leider hilft es mir aber trotzdem nicht weiter.
Vielen Dank für deine Geduld,
Tobi
Hello,
Rouven, auch wenn ich noch nicht in der lage bin mit dieser Antwort umzugehen) und vielleicht hast du ja sogar noch die Geduld mir noch etwas mehr zu erklären.
Wenn du im Browser eine HTML-Seite mit einem Formular anzeigen lässt, dann ist dein Browser darauf getrimmt dir die entsprechenden Formularelemente anzuzeigen, damit du Einstellungen/Einträge vornehmen kannst. Irgendwann bestimmst du, per Click auf einen Button o.ä., dass du fertig bist und diese Informationen jetzt gerne verschicken würdest.
Bildlich gesprochen geht der Browser jetzt hin, nimmt einen Briefumschlag, schreibt die Adresse drauf, die im Formular angegeben ist, nimmt sich einen Zettel, schreibt alle Formularinhalte drauf, packt den Zettel in den Umschlag und gibt das ganze bei der Post ab, die daraufhin den Zustellprozess einleitet.
Irgendwann schaut der Server in seinen Briefkasten, findet den Zettel und beginnt die Informationen zu verarbeiten.
Deine Validierung setzt dabei an zu sagen, der Browser möge den Umschlag nicht zur Post bringen, wenn ihm die Angaben nicht passen. Das hindert aber niemanden daran einen Umschlag zu machen mit einem Zettel voller Falschinformationen und ihn direkt beim Server im Briefkasten einzuwerfen.
Übertragen auf das Web heißt das: ich brauche kein Formular in einem Browser um die Daten an den Server zu schicken. Es muss sichergestellt sein, dass der Server keine falschen Daten verarbeitet, der andere Ansatz ist nur in einer perfekten Welt zielführend.
MfG
Rouven
Super!!!
Vielen Dank, jetzt hab ichs verstanden. Programmieren ist wie das leben: Man fängt halt immer mit Bilderbüchern an. ;)
PS:
Ok, gleich noch eine Frage:
Also das mit dem "einfach keine neue URL aufrufen" klappt super. Wenn alle Eingaben korrekt waren wird etwas anderes angezeigt.
Kann ich dem User jetzt auch noch einen Bestätigungsklick ersparen? Ich muss ja jetzt erst ein Affenformular machen und dann den Formmailer ansprechen. Weiteres Problem ist, dass Formmailer und SQL-Eintrag nicht gleichzeitig funktionieren. Das heißt, wenn der User nicht bestätigt, dann würden bei meinem derzeitigen Vorgehen die Daten in der Datenbank stehen, der User aber nicht angemailt und auch nie aktiviert werden.
Lieber Tobi,
Das heißt, wenn der User nicht bestätigt, dann würden bei meinem derzeitigen Vorgehen die Daten in der Datenbank stehen, der User aber nicht angemailt und auch nie aktiviert werden.
dann musst Du Dein Konzept nocheinmal gründlich überdenken und gegebenenfalls abändern.
Liebe Grüße,
Felix Riesterer.
Hi,
Kann ich dem User jetzt auch noch einen Bestätigungsklick ersparen?
natürlich. Ein Affenformular kann die Daten auswerten und ggfls. das vorausgefüllte Formular zur Korrektur wieder ausgeben.
Weiteres Problem ist, dass Formmailer und SQL-Eintrag nicht gleichzeitig funktionieren.
was ich nicht verstehe: warum willst Du unbedingt einen externen Formmail-Service nutzen? Wenn Dein Webspace PHP und SQL zur Verfügung stellt, dann sollte doch auch ein Mailserver dabei sein, oder?
Das heißt, wenn der User nicht bestätigt, dann würden bei meinem derzeitigen Vorgehen die Daten in der Datenbank stehen, der User aber nicht angemailt und auch nie aktiviert werden.
Nein. Selbst wenn Du einen Grund für einen externen Formmailer haben solltest, könnte auch Dein Script an diesen POST-Daten versenden.
Und nur der Vollständigkeit halber: natürlich kann man auch Über Javascript ein Formular manipulieren, z.B. das action-Attribut ändern.
freundliche Grüße
Ingo
Hi Ingo,
was ich nicht verstehe: warum willst Du unbedingt einen externen Formmail-Service nutzen? Wenn Dein Webspace PHP und SQL zur Verfügung stellt, dann sollte doch auch ein Mailserver dabei sein, oder?
Das ist genau der Punkt. Es ist nicht mein Webspace.
Nein. Selbst wenn Du einen Grund für einen externen Formmailer haben solltest, könnte auch Dein Script an diesen POST-Daten versenden.
Versenden kann ich sie auch. Und sogar abrufen. Und zwar nach der syntax ##feldname##, aber damit kann php ja nix anfangen. Schön wäre es, wenn etwas in der Richtung $variable = ##feldname## ginge.
Viele Grüße,
Tobi
Lieber Tobi,
Nein. Selbst wenn Du einen Grund für einen externen Formmailer haben solltest, könnte auch Dein Script an diesen POST-Daten versenden.
Versenden kann ich sie auch. Und sogar abrufen. Und zwar nach der syntax ##feldname##, aber damit kann php ja nix anfangen. Schön wäre es, wenn etwas in der Richtung $variable = ##feldname## ginge.
wenn Du jetzt noch genauer beschreiben könntest, wie Du den fremden Maildienst ansprechen musst, dann könnte man Dir in dieser Hinsicht weiterhelfen.
Es ist in PHP z.B. möglich, den Aufruf einer fremden Website zu "simulieren", und dabei so tun, als ob man im Browser ein Formular ausgefüllt und abgesendet hätte - nur tut das eben ein PHP-Script stattdessen (übrigens einer der Gründe, auf den Rouven in seinem ersten Posting angespielt hat).
Insofern kannst Du lässig mit einem Affenformular die Usereingaben prüfen, bestätigen lassen und danach in die Datenbank speichern, um dann zum Schluss an den externen Maildienst den Auftrag zu schicken.
Wo genau hängst Du jetzt?
Liebe Grüße,
Felix Riesterer.
Lieber Felix,
wenn Du jetzt noch genauer beschreiben könntest, wie Du den fremden Maildienst ansprechen musst, dann könnte man Dir in dieser Hinsicht weiterhelfen.
jetzt bin ich begeistert. Euren Antworten zufolge wusste ich ja, dass das möglich ist, aber ich hätte nicht gedacht, dass ich mir das auch selbst zu Nutzen machen könnte.
Also, es handelt sich hier um den Formmailer von formular-chef.de.
Ich muss hier ein Formular anlegen mit dem action-Befehl "http://www.formular-chef.de/fc.cgi" und das ist auch der Punkt wo ich hänge. Mit meinem Wissen ist es mir nicht möglich ein Affenformular zu erstellen und am Ende trotzdem die Informationen an formular-chef zu übergeben.
Alle wichtigen Informationen (Mailempfänger, -absender...) nimmt formular-chef aus hidden-fields.
Reicht das an Informationen?
Und noch eine Frage hätte ich:
Kannst du mir vielleicht eine Seite empfehlen, wo ich noch detailiertere Infos über Sessions bekomme?
Vielen Dank mal wieder für deine Hilfe,
Tobi
Lieber Tobi,
Ich muss hier ein Formular anlegen mit dem action-Befehl "http://www.formular-chef.de/fc.cgi" und das ist auch der Punkt wo ich hänge.
Das bedeutet, Du musst einen POST-Request per PHP an ebendiese URL absetzen, in dem die benötigten name-value-Paare enthalten sind.
Alle wichtigen Informationen (Mailempfänger, -absender...) nimmt formular-chef aus hidden-fields.
Das sind eben besagte name-value-Paare. Du kennst doch unter PHP die superglobalen $_POST und $_GET? Diese Arrays enthalten eben das, was im Formular an Eingabefeldern (egal in welcher Form, ob type="hidden" oder type="text" o.ä.) enthalten war. Das name-Attribut enthält da einen Weret, den Du später wider in $_POST['name-Wert'] bzw. $_GET['name-Wert'] findest. Je nach method des Formulars.
Und der Inhalt der jeweiligen Array-Felder entspricht dann dem Wert des value-Attributs der Formularfelder. Soweit klar?
Jetzt musst Du nur das tun, was sonst der Browser eigentlich macht, wenn man ein Formular abschickt: einen Request an einen Server senden. In Deinem Falle sollte das wohl ein POST-Request sein. Den musst Du nun "künstlich" mittels PHP nachbilden.
Und noch eine Frage hätte ich:
Kannst du mir vielleicht eine Seite empfehlen, wo ich noch detailiertere Infos über Sessions bekomme?
Google ist Dein Freund, oder reicht Dir die PHP-Doku zu diesem Thema, oder das hiesige Archiv nicht? Stichworte sollten nun genügend gefallen sein...
Liebe Grüße,
Felix Riesterer.
Hi,
Also, es handelt sich hier um den Formmailer von formular-chef.de.
und warum willst/musst Du diesen nutzen? Das leuchtet mir nicht ein, denn wenn Dein Webspace PHP und eine Datenbank unterstützt, dann sollte doch wie gesagt auch ein Mailserver dabei sein, so dass Du auf externe Dienste verzichten kannst.
freundliche Grüße
Ingo
Mahlzeit Tobi,
Ok, ich bin begeistert von den schnellen, qualifizierten Nicht-Antworten. Heißt das jetzt, dass es nicht geht, oder dass ihr hier nur zu schlau seid um mir das, aus Sicherheitsgründen, zu beantworten?
Das hat mit "zu schlau" nichts zu tun. Ein Formular wird beim Abschicken an das Formularziel gesendet. Falls Javascript im Browser eingeschaltet ist, kann man das ggf. manipulieren. Wenn es aber nicht vorhanden oder ausgeschaltet ist, wird das Formular ganz normal abgeschickt ... wie willst Du das verhindern?
- Mit JS prüfen und erst wenn alle eingaben korrekt sind abschicken.
Grundsätzlich sehe ich alle anderen Punkte ähnlich wie Du, allerdings ist diese Alternative keine Lösung. Eine wirkliche, echte und verlässliche Prüfung kann beim Client nicht durchgeführt werden. Punkt.
MfG,
EKKi