Czy dobrą praktyką jest używanie pustego adresu URL dla atrybutu action formularza HTML? (akcja="")

Zastanawiam się, czy ktoś może dać odpowiedź "najlepsze praktyki" do korzystania z pustych działań formularza HTML, aby dodać z powrotem do bieżącej strony.

Jest post z pytaniem, co robi tutaj pusta akcja formularza HTML i niektóre strony jak Ta sugerują, że jest w porządku, ale chciałbym wiedzieć, co ludzie myślą.

Author: Community, 2009-07-15

11 answers

Najlepszą rzeczą, jaką możesz zrobić, to całkowicie pominąć atrybut action. Jeśli go pominiesz, formularz zostanie przesłany na adres dokumentu, tj. na tę samą stronę.

Możliwe jest również pozostawienie go pustego, a każda przeglądarka implementująca algorytm przesyłania formularzy HTML potraktuje go jako odpowiednik adresu dokumentu, co dzieje się głównie dlatego, że obecnie tak działają przeglądarki:

8. niech akcja będzie elementem przekazującym akcja .

9. jeśli akcja jest pustym łańcuchem, niech akcja będzie adresem dokumentu .

Uwaga: Ten krok jest umyślnym naruszeniem RFC 3986, które wymagałoby podstawowego przetwarzania URL tutaj. Naruszenie to jest motywowane chęcią zgodności ze starszymi treściami. [RFC3986]

To zdecydowanie działa we wszystkich obecnych przeglądarkach, ale może nie działać zgodnie z oczekiwaniami w niektórych starszych przeglądarkach ("przeglądarki rób dziwne rzeczy z pustym atrybutem action="" "), dlatego spec zdecydowanie zniechęca autorów do pozostawienia go pustego :

Atrybuty zawartości action i formaction, jeśli są określone, muszą mieć wartość poprawny niepusty adres URL potencjalnie otoczony spacjami.

 279
Author: mercator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Właściwie, podsekcja składania formularzy obecnego szkicu HTML5 nie pozwala action="". To wbrew specyfikacji.

Atrybuty action i formaction content, jeśli są określone, muszą mieć wartość, która jest poprawnym niepustym adresem URL potencjalnie otoczonym spacjami. (podkreślenie dodane)

Cytowany fragment w odpowiedzi Mercatora jest wymogiem implementacji, a nie autorów. Autorzy muszą podążać za autorem wymagania. Cytując Jak odczytać tę specyfikację :

W szczególności, istnieją wymagania zgodności, które mają zastosowanie do producentów, na przykład autorów i dokumentów, które tworzą, i istnieją wymagania zgodności, które mają zastosowanie do konsumentów, na przykład przeglądarki internetowe. Można je odróżnić po tym, czego wymagają: wymóg nałożony na producenta określa, co jest dozwolone, natomiast wymóg nałożony na konsumenta określa, w jaki sposób oprogramowanie ma działać.

The zmiana z HTML4-który zezwalał na pusty adres URL-została dokonana, ponieważ " przeglądarki robią dziwne rzeczy z pustym atrybutem action="" ". Biorąc pod uwagę powód zmiany, prawdopodobnie najlepiej nie robić tego w HTML4 albo.

 75
Author: derobert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:07

Nie wliczając atrybutu action otwiera stronę do ataków iframe clickjacking , które obejmują kilka prostych kroków:

  • atakujący zawija Twoją stronę w ramkę iframe
  • adres URL iframe zawiera param zapytania o tej samej nazwie, co pole formularza
  • Po przesłaniu formularza, wartość zapytania jest wstawiana do bazy danych
  • Dane identyfikacyjne użytkownika (e-mail, adres itp.) zostały skompromitowany

Referencje

 18
Author: Paul Sweatte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-12 20:13:04

Zostanie to potwierdzone za pomocą HTML5.

<form action="#">
 17
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-26 15:01:15

W HTML 5 {[3] } NIE JEST OBSŁUGIWANE, WIĘC NIE RÓB TEGO. KIEPSKA PRAKTYKA.

Jeśli zamiast tego całkowicie negujesz działanie, to domyślnie zgłosi się do tej samej strony, uważam, że jest to najlepsza praktyka:

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

Jeśli sumujesz formularz za pomocą php, możesz rozważyć następujące kwestie. Czytaj więcej na ten temat tutaj.

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

Alternatywnie możesz użyć # pamiętaj jednak, że będzie to działać jak kotwica i przewiń do góry strona.

<form action="#">
 10
Author: Buts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-08 16:34:08

Zwykle używam action="", który jest poprawny w XHTML i zachowuje dane GET w adresie URL.

 4
Author: Juddling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-15 14:41:50

Myślę, że najlepiej jest jawnie podać, gdzie posty formularza. Jeśli chcesz być całkowicie bezpieczny, wprowadź ten sam adres URL, na którym znajduje się formularz w atrybucie akcji, jeśli chcesz, aby został przesłany z powrotem do siebie. Chociaż główne przeglądarki oceniają "" Na tej samej stronie, nie możesz zagwarantować, że przeglądarki spoza głównego nurtu będą.

I oczywiście cały URL, w tym GET data, jak Juddling wskazuje.

 4
Author: Will Morgan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-15 15:39:50

Po prostu użyj

?

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

Nie narusza standardów HTML5.

 2
Author: M_R_K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-08 12:29:54

Robiłam to często, kiedy pracowałam z klasyczną ASP. Zwykle używałem go, gdy Walidacja po stronie serwera była potrzebna jakiegoś rodzaju dla wejścia(przed dniami AJAX). Głównym rysunkiem, jaki widzę, jest to, że nie oddziela on logiki programowania od prezentacji, na poziomie plików.

 1
Author: busse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-15 14:44:06

Używam, aby w ogóle nie podawać atrybutu action. W rzeczywistości tak jest zaprojektowany mój framework wszystkie strony są przesyłane z powrotem dokładnie pod ten sam adres. Ale dzisiaj odkryłem problem. Czasami pożyczam wartość atrybutu action, aby wykonać jakieś wywołanie w tle(chyba niektórzy nazywają je AJAX). Znalazłem więc, że IE zachowuje wartość atrybutu akcji jako pustą, jeśli atrybut akcji nie został określony. Jest to trochę dziwne w moim rozumieniu, ponieważ jeśli nie podano atrybutu action, odpowiednik JavaScript musi bądź co najmniej nieokreślony. W każdym razie, chodzi mi o to, zanim wybierzesz najlepszą praktykę, musisz zrozumieć więcej kontekstu, na przykład czy użyjesz atrybutu w JavaScript, czy nie.

 1
Author: Singagirl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-13 01:59:29

Gdy umieścisz pustą akcję, niektóre filtry bezpieczeństwa uznają ją za złośliwą lub phishingową. Dzięki temu mogą zablokować Twoją stronę. Więc wskazane jest, aby nie zachować action = blank.

 0
Author: Ayush Kurlekar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-14 04:49:41