Ist es empfehlenswert, eine leere URL für das Aktionsattribut eines HTML-Formulars zu verwenden? (Aktion = "")

279

Ich frage mich, ob jemand eine "Best Practices" -Antwort auf die Verwendung leerer HTML-Formularaktionen geben kann, um auf die aktuelle Seite zurückzukehren.

In einem Beitrag wird gefragt, was eine leere HTML-Formularaktion hier bewirkt, und einige Seiten wie diese schlagen vor, dass dies in Ordnung ist, aber ich würde gerne wissen, was die Leute denken.

Matt Mitchell
quelle
7
Hier wird vorgeschlagen, das Tag "Best Practices" vorzuschlagen.
Will Morgan
Um dies doppelt zu bestätigen, lassen Sie die Aktion leer oder erwähnen Sie einfach überhaupt keine Aktion (wie <form name="xyz" >). Es wird die Aktion selbst einreichen.
lwpro2
11
Ohne das Aktionsattribut wird die Seite für Iframe-Clickjacking- Angriffe geöffnet , z. B. für Angriffe, bei denen ein Angreifer Ihre Seite in einen Iframe einschließt und die Iframe-URL einen Abfrageparameter mit demselben Namen wie ein Formularfeld enthält. Wenn das Formular gesendet wird, wird der Abfragewert in die Datenbank eingefügt, sodass die identifizierenden Informationen des Benutzers (E-Mail, Adresse usw.) kompromittiert wurden.
Paul Sweatte
Was ist dann die gültige und sichere Möglichkeit, ein Formular an die aktuelle Seite zu senden?
Costa

Antworten:

268

Das Beste, was Sie tun können, ist, das Aktionsattribut ganz wegzulassen. Wenn Sie es weglassen, wird das Formular an die Adresse des Dokuments gesendet, dh an dieselbe Seite.

Es ist auch möglich, es leer zu lassen, und jeder Browser, der den Formularübermittlungsalgorithmus von HTML implementiert, behandelt ihn als äquivalent zur Adresse des Dokuments. Dies geschieht hauptsächlich, weil Browser derzeit so funktionieren:

8.Die Aktion sei die Aktion des Übermittlerelements .

9.Wenn action die leere Zeichenfolge ist, sei action die Adresse des Dokuments .

Hinweis: Dieser Schritt stellt eine vorsätzliche Verletzung von RFC 3986 dar, für die hier eine Verarbeitung der Basis-URL erforderlich wäre. Diese Verletzung ist durch den Wunsch nach Kompatibilität mit älteren Inhalten motiviert. [RFC3986]

Dies funktioniert definitiv in allen aktuellen Browsern, funktioniert jedoch möglicherweise nicht wie erwartet in einigen älteren Browsern ( " Browser machen seltsame Dinge mit einer leeren Aktion =" "Attribut " ), weshalb die Spezifikation Autoren stark davon abhält, sie leer zu lassen :

Die Attribute actionund formactioncontent müssen, falls angegeben, einen Wert haben, der eine gültige nicht leere URL ist, die möglicherweise von Leerzeichen umgeben ist .

Mercator
quelle
12
Möglicherweise hat sich dies seit Ihrer Antwort geändert (es sind fast drei Jahre action=""
vergangen
2
@derobert Danke. Das hatte sich wahrscheinlich nicht geändert. Ich habe meine Antwort geändert, um besser zu reflektieren, was die Spezifikation sagt.
Mercator
73

Tatsächlich erlaubt der Unterabschnitt Formularübermittlung des aktuellen HTML5-Entwurfs dies nicht action="". Es ist gegen die Spezifikation.

Die Attribute actionund formactioncontent müssen, falls angegeben, einen Wert haben, der eine gültige nicht leere URL ist, die möglicherweise von Leerzeichen umgeben ist. (Betonung hinzugefügt)

Der in der Antwort des Mercators zitierte Abschnitt ist eine Anforderung an Implementierungen , nicht an Autoren . Autoren müssen die Autorenanforderungen befolgen. So zitieren Sie diese Spezifikation :

Insbesondere gibt es Konformitätsanforderungen, die für Hersteller gelten, z. B. Autoren und die von ihnen erstellten Dokumente, und es gibt Konformitätsanforderungen, die für Verbraucher gelten, z. B. Webbrowser. Sie können dadurch unterschieden werden, was sie benötigen: Eine Anforderung an einen Hersteller gibt an, was zulässig ist, während eine Anforderung an einen Verbraucher angibt, wie Software zu handeln ist.

Die Änderung von HTML4, die eine leere URL zuließ, wurde vorgenommen, weil " Browser seltsame Dinge mit einem leeren action=""Attribut tun ". In Anbetracht des Grundes für die Änderung ist es wahrscheinlich am besten, dies auch nicht in HTML4 zu tun.

derobert
quelle
Ermöglicht es das völlige Fehlen des actionAttributs insgesamt, anzugeben, welches Formular an die Dokumentadresse gesendet werden soll? Es scheint, da es sagt, "wenn angegeben".
Kerrick
2
@Kerrick Ja, ich glaube, HTML5 erlaubt das vollständige Weglassen des Aktionsattributs und standardmäßig eine leere Zeichenfolge. HTML4 nicht, es gibt die Aktion nach Bedarf an.
Derobert
Ich stimme @Kerrick zu, es ist erlaubt, das Aktionsattribut wegzulassen. Beim Lesen des aktuellen HTML5-Drafs scheint es, dass eine leere Zeichenfolge nicht zulässig ist, das Fehlen des Attributs jedoch zulässig ist. Aus Kompatibilitätsgründen empfehle ich Ihnen jedoch, immer das Attribut "action" anzugeben und es mit einer gültigen, nicht leeren URL zu füllen (bewährte Methoden sind immer der beste Weg).
Serfer2
Ein mögliches Problem: AngularJS verhindert das Senden von Formularen ohne Aktionsattribut. Wahrscheinlich kein häufiges Problem, aber ich habe eine Weile gebraucht, um herauszufinden, warum Teile unserer Legacy-Site kaputt gingen.
Asmor
18

Ohne das Aktionsattribut wird die Seite für Iframe-Clickjacking- Angriffe geöffnet , die einige einfache Schritte umfassen:

  • Ein Angreifer verpackt Ihre Seite in einen Iframe
  • Die iframe-URL enthält einen Abfrageparameter mit demselben Namen wie ein Formularfeld
  • Wenn das Formular gesendet wird, wird der Abfragewert in die Datenbank eingefügt
  • Die identifizierenden Informationen des Benutzers (E-Mail, Adresse usw.) wurden kompromittiert

Verweise

Paul Sweatte
quelle
2
Enthält die iframe-URL nicht GET-Parameter, während Formulare normalerweise per POST gesendet werden? Wenn sich die Site also nur mit den POST-Parametern befasst, sollte dies kein Problem sein, nicht wahr? Zumindest verwende ich das $ _POST-Array in PHP normalerweise nur bei der Verarbeitung von Formularen.
Calmarius
2
@Calmarius Ja, verwenden Sie $_POSTstattdessen $_REQUEST, um dies zu vermeiden. Wenn Framework-Code verwendet wird $_REQUEST, verwenden Sie einen Iframe-Buster .
Paul Sweatte
17

Dies wird mit HTML5 validiert.

<form action="#">

quelle
4
Ich habe es nicht ausprobiert, aber würde das konzeptionell nach dem Einreichen nicht zum Anfang der Seite scrollen?
Matt Mitchell
2
Könnten Sie nicht verwenden action="."?
S427
3
action = "?" funktioniert auch gut. Es überprüft und zeigt auf die aktuelle Seite ohne und fragt Zeichenfolgendaten ab.
Chris Broski
5
action="."ist eine schlechte Idee für den allgemeinen Fall. Eine URL wie example.com/loginwird lediglich zugeordnet example.com/.
Torsten Bronger
1
Diese Antwort ist nur gültig, wenn der Benutzer zum Anfang der Seite scrollen möchte.
Buts
9

IN HTML 5 action=""WIRD NICHT UNTERSTÜTZT, TUN SIE DAS NICHT. SCHLECHTE PRAXIS.

Wenn Sie stattdessen die Aktion vollständig negieren, wird sie standardmäßig auf derselben Seite angezeigt. Ich glaube, dies ist die beste Vorgehensweise:

<form>This will submit to the current page</form>

Wenn Sie das Formular mit PHP bearbeiten, sollten Sie Folgendes berücksichtigen. Lesen Sie hier mehr darüber.

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

Alternativ können Sie auch #bedenken, dass dies wie ein Anker wirkt und zum oberen Rand der Seite scrollen.

<form action="#">
Aber
quelle
Möchten Sie verstehen, warum jemand diese Antwort abgelehnt hat?
Buts
Sie lassen das Aktionsattribut aus. Ist das Formular für Exploits noch offen, finden Sie es auf der ersten Seite des Links?
Richard Young
@ RichardYoung Sorry, ich verstehe deine Frage nicht. Bitte umformulieren.
Buts
1
Die Variable $ _SERVER ["PHP_SELF"] kann von Hackern verwendet werden. Wenn PHP_SELF auf Ihrer Seite verwendet wird, kann ein Benutzer einen Schrägstrich (/) und anschließend einige XSS-Befehle (Cross Site Scripting) eingeben, die ausgeführt werden sollen. Wenn Sie das Aktionsattribut weglassen, sind Sie dennoch dafür anfällig?
Richard Young
Ja, das bist Du. Das Aktionsattribut kann auf der Clientseite wieder hinzugefügt und mit einem beliebigen Wert versehen werden. Die Verwendung der htmlspecialchars()Funktion verhindert jedoch, dass Personen Ihr PHP-Skript gegen Sie verwenden.
Buts
4

Normalerweise verwende ich action = "", was XHTML-gültig ist und die GET-Daten in der URL behält.

Durcheinander
quelle
4
Selten, aber zum Beispiel in meinem Forum, hätte ich die URL: thread.php? Id = 12 & page = 6 und es gibt ein POST-Formular am Ende der Seite zum Hinzufügen von Kommentaren, und ich benötige die GET-Daten, damit PHP weiß, zu welchem ​​Thread der Kommentar hinzugefügt werden soll.
Juddling
20
GET ist die Standardmethode für Formulare - es ist kaum eine schlechte Sache ;-) w3.org/TR/html401/interact/forms.html#adef-method
NickFitz
5
Die Verwendung von GET in Formularen ist eine schlechte Sache. Wenn der Benutzer die Seite nach dem Absenden neu lädt, kann dies unbeabsichtigte Folgen haben. Wenn jedoch ein POST verwendet wird, warnt der Browser vor einer erneuten Übermittlung derselben Daten.
Will Sheppard
22
@ WillSheppard Ich bin anderer Meinung. Sie können so eine pauschale Aussage nicht machen. Es hängt alles davon ab, was das Formular tut. Sie sollten POST für alles verwenden, was eine Aktion ausführt (z. B. Einfügen eines neuen Beitrags in ein Forum), aber GET für alles andere (z. B. ein Suchfeld oder die Verwendung von Formularen für die Navigation). Nach einem erfolgreichen POST sollte das Skript den Browser umleiten, um zu verhindern, dass der Benutzer die Daten erneut sendet.
Mike
3
PS Nicht alle Browser warnen den Benutzer vor erneuter Übermittlung von POST-Daten (z. B. Opera)
Mike
4

Ich denke, es ist am besten, explizit anzugeben, wo das Formular veröffentlicht wird. Wenn Sie absolut sicher sein möchten, geben Sie im Aktionsattribut dieselbe URL ein, auf der sich das Formular befindet, wenn Sie möchten, dass es an sich selbst zurückgesendet wird. Obwohl Mainstream-Browser ""dieselbe Seite auswerten , können Sie nicht garantieren, dass Nicht-Mainstream-Browser dies tun.

Und natürlich weist die gesamte URL einschließlich GET-Daten wie Juddling darauf hin.

Will Morgan
quelle
2

Benutz einfach

?

<form action="?" method="post" enctype="multipart/form-data" name="myForm" id="myForm">

Es verstößt nicht gegen HTML5-Standards.

M_R_K
quelle
Ich habe nicht abgelehnt, aber Ihre Methode wird alle getParameter löschen. Ein Formular auf der folgenden URL würde brechen, example.com/update_user?user_id=1weil das Formular anexample.com/update_user?
Vikki
1

Ich habe das oft gemacht, als ich mit Classic ASP gearbeitet habe. Normalerweise habe ich es verwendet, wenn für die Eingabe eine serverseitige Validierung erforderlich war (vor den Tagen von AJAX). Der Hauptnachteil, den ich sehe, ist, dass die Programmierlogik auf Dateiebene nicht von der Präsentation getrennt wird.

Busse
quelle
1
warum nicht? Ich denke, es ist nicht verbunden. Ich kann die Daten in einem Formular auf derselben Seite veröffentlichen und diese Seite mit der richtigen Trennung von Controller und Ansicht erstellen.
Markus
1

Ich benutze, um überhaupt kein Aktionsattribut anzugeben. Es ist tatsächlich so, wie mein Framework gestaltet ist. Alle Seiten werden genau an dieselbe Adresse zurückgesendet. Aber heute habe ich ein Problem entdeckt. Manchmal leihe ich mir einen Aktionsattributwert aus, um einen Hintergrundaufruf zu tätigen (ich denke, einige Leute nennen sie AJAX). Daher habe ich festgestellt, dass der IE den Wert des Aktionsattributs leer hält, wenn kein Aktionsattribut angegeben wurde. Nach meinem Verständnis ist dies etwas seltsam, da das JavaScript-Gegenstück mindestens undefiniert sein muss, wenn kein Aktionsattribut angegeben ist. Bevor Sie sich für eine bewährte Methode entscheiden, müssen Sie mehr Kontext verstehen, z. B. ob Sie das Attribut in JavaScript verwenden oder nicht.

Singagirl
quelle