Является ли хорошей практикой использовать пустой URL-адрес для атрибута действия HTML-формы? (действие =)

Мне интересно, может ли кто-нибудь дать ответ "передовой практики" на использование пустых действий HTML-формы для отправки на текущую страницу.

Есть сообщение с вопросом, что здесь делает пустая HTML-форма, а также некоторые страницы, такие как этот предполагаю, что это нормально, но я бы хотел знаю, что думают люди.


person Matt Mitchell    schedule 15.07.2009    source источник
comment
К этому должен быть применен тег рекомендаций.   -  person Will Morgan    schedule 17.09.2009
comment
Чтобы дважды подтвердить, оставьте действие пустым или просто не упоминайте действие вообще (например, <form name="xyz" >). Он отправит действие самостоятельно.   -  person engineer    schedule 20.06.2011
comment
Без атрибута action страница открывается до кликджекинга iframe атаки, например, при которой злоумышленник помещает вашу страницу в iframe, а URL iframe включает параметр запроса с тем же именем, что и поле формы. Когда форма отправляется, значение запроса вставляется в базу данных, поэтому идентификационная информация пользователя (электронная почта, адрес и т. Д.) Была скомпрометирована.   -  person Paul Sweatte    schedule 17.08.2012
comment
Итак, какой же действительный и безопасный способ отправить форму на текущую страницу?   -  person Costa Michailidis    schedule 16.01.2015
comment
Отсутствие атрибута действия также является недопустимым HTML. Он указан в спецификации как обязательный атрибут. У пустых действий также есть свои особенности: stackoverflow.com/a/617197/1307074.   -  person Suncat2000    schedule 08.01.2021


Ответы (10)


Лучшее, что вы можете сделать, - это вообще не использовать атрибут действия. Если вы его не укажете, форма будет отправлена ​​по адресу документа, то есть на той же странице.

Также можно оставить его пустым, и любой браузер, реализующий алгоритм отправки HTML-формы будет рассматривать его как эквивалент адреса документа, что происходит главным образом потому, что в настоящее время браузеры работают следующим образом:

8. Пусть действие будет элемента submitter. действие.

9. Если действие - это пустая строка, пусть действие будет адрес документа.

Примечание. Этот шаг представляет собой умышленное нарушение RFC 3986, которое потребует здесь обработки базового URL. Это нарушение мотивировано стремлением к совместимости с устаревшим контентом. [RFC3986]

Это определенно работает во всех текущих браузерах, но может не работать должным образом в некоторых старых браузерах (браузеры делают странные вещи с пустым атрибутом action =), поэтому в спецификации настоятельно не рекомендуется оставлять его пустым:

Атрибуты содержимого action и formaction, если они указаны, должны иметь значение, которое является действительный непустой URL-адрес, потенциально окруженный пробелами.

person mercator    schedule 15.07.2009
comment
Возможно, это изменилось с момента вашего ответа (прошло уже почти три года), но на сегодняшний день HTML5 не позволяет action="" - см. Мой ответ ... - person derobert; 13.03.2012
comment
@derobert Спасибо. Вероятно, это не изменилось. Я изменил свой ответ, чтобы лучше отразить то, что говорится в спецификации. - person mercator; 13.03.2012

Фактически, подраздел "Отправка формы" текущего черновика HTML5 не позволяет action="". Это противоречит спецификации.

Атрибуты содержимого action и formaction, если они указаны, должны иметь значение, которое является допустимым непустым URL-адресом, потенциально окруженным пробелами. (курсив добавлен)

Цитируемый раздел в ответе меркатора является требованием для реализаций, а не для авторов . Авторы должны соблюдать требования автора. Чтобы процитировать Как читать эту спецификацию :

В частности, существуют требования соответствия, которые применяются к производителям, например, авторам и документам, которые они создают, и есть требования соответствия, которые применяются к потребителям, например веб-браузерам. Их можно различать по тому, что они требуют: в требовании к производителю указывается, что разрешено, а в требовании к потребителю указывается, как должно действовать программное обеспечение.

Изменение с HTML4, которое допускало пустой URL-адрес, было сделано потому, что « браузеры делают странные вещи с пустым атрибутом action="" ». Учитывая причину изменения, вероятно, лучше не делать этого и в HTML4.

person derobert    schedule 13.03.2012
comment
Допускает ли это полное отсутствие атрибута action, чтобы указать, что форма должна быть отправлена ​​на адрес документа? Кажется, так оно и есть, если указано. - person Kerrick; 01.06.2012
comment
@Kerrick Да, я считаю, что HTML5 позволяет полностью опустить атрибут действия и по умолчанию использует пустую строку. HTML4 этого не сделал, он определяет действия по мере необходимости. - person derobert; 01.06.2012
comment
Я согласен с @Kerrick, разрешено опускать атрибут действия. При чтении текущей HTML5-версии кажется, что пустая строка недопустима, но допускается отсутствие атрибута. Но в любом случае из соображений совместимости я рекомендую вам всегда включать атрибут action и заполнять его действительным непустым URL-адресом (хорошие практики всегда являются лучшим способом). - person serfer2; 20.06.2014
comment
Одна потенциальная проблема: AngularJS предотвратит отправку форм без атрибута действия. Вероятно, это не обычная проблема, но мне потребовалось время, чтобы понять, почему некоторые части нашего устаревшего сайта начали ломаться. - person Asmor; 24.05.2018

Без атрибута action страница открывается до кликджекинга iframe атаки, которые включают несколько простых шагов:

  • Злоумышленник помещает вашу страницу в iframe
  • URL-адрес iframe включает параметр запроса с тем же именем, что и поле формы.
  • При отправке формы значение запроса вставляется в базу данных.
  • Идентификационная информация пользователя (электронная почта, адрес и т. Д.) Была скомпрометирована

Ссылки

person Paul Sweatte    schedule 17.08.2012
comment
Разве URL-адрес iframe не содержит параметров GET, в то время как формы обычно отправляются с помощью POST? Так что, если сайт имеет дело только с параметрами POST, это не должно быть проблемой, не так ли? По крайней мере, я обычно использую массив $ _POST в PHP только при обработке форм. - person Calmarius; 20.03.2015
comment
@Calmarius Да, используйте $_POST вместо $_REQUEST, чтобы избежать этого. Если в коде фреймворка используется $_REQUEST, используйте прерыватель iframe. - person Paul Sweatte; 22.03.2015

Это будет подтверждено с помощью HTML5.

<form action="#">
person Community    schedule 25.04.2012
comment
Я не пробовал, но концептуально не будет ли это прокручиваться к началу страницы после отправки? - person Matt Mitchell; 26.04.2012
comment
@Graphain Да, браузер будет прокручивать страницу вверх после публикации, поскольку URL-адрес теперь имеет #. - person ; 26.04.2012
comment
Не могли бы вы использовать action="."? - person s427; 07.01.2013
comment
действие =? тоже хорошо работает. Он проверяет и указывает на текущую страницу без данных строки запроса. - person Chris Broski; 26.04.2013
comment
action="." - плохая идея для общего случая. URL-адрес типа example.com/login отображается просто на example.com/. - person Torsten Bronger; 26.11.2014
comment
Собственно я нашел второй способ действия =. становится недействительным: если у вас установлен ‹base href = /› ... тогда действие будет выполняться по указанному здесь URL! Очень раздражает, и потому что многие люди не знают, столько пакетов, которые имеют формы и включают шаблоны, имеют тенденцию ломаться :( - person gabn88; 23.07.2015
comment
Этот ответ действителен только в том случае, если пользователь хочет прокрутить страницу до верха. - person Buts; 08.09.2016

В HTML 5 action="" НЕ ПОДДЕРЖИВАЕТСЯ, ПОЭТОМУ НЕ ДЕЛАЙТЕ ЭТО. ПЛОХАЯ ПРАКТИКА.

Если вместо этого вы полностью откажетесь от действия, оно по умолчанию отправится на ту же страницу, я считаю, что это лучшая практика:

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

Если вы заполняете форму с помощью php, вы можете рассмотреть следующее. подробнее об этом здесь.

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

В качестве альтернативы вы можете использовать #, но имейте в виду, что это будет действовать как якорь и прокручивать страницу до верха.

<form action="#">
person Buts    schedule 08.09.2016
comment
Хотели бы понять, почему кто-то не проголосовал за этот ответ? - person Buts; 09.09.2016
comment
Вы опускаете атрибут действия, форма все еще открыта для эксплойтов, подробно описанных на первой странице по ссылке? - person Richard Young; 21.11.2016
comment
@RichardYoung Извините, я не понимаю ваш вопрос. Пожалуйста, перефразируйте. - person Buts; 22.11.2016
comment
Переменная $ _SERVER [PHP_SELF] может использоваться хакерами. Если на вашей странице используется PHP_SELF, пользователь может ввести косую черту (/), а затем выполнить несколько команд межсайтового скриптинга (XSS). Если вы опустите атрибут действия, вы все еще уязвимы для этого? - person Richard Young; 22.11.2016
comment
Да Вы. Атрибут действия можно добавить обратно на стороне клиента и присвоить любое значение по выбору. Однако использование функции htmlspecialchars() не позволяет людям использовать ваш php-скрипт против вас. - person Buts; 23.11.2016
comment
Я знал о функции htmlspecialchars (), но просто надеялся, что если я пропущу действие, я смогу обойти это. Спасибо, что прояснили это для меня. - person Richard Young; 23.11.2016
comment
@Buts Ваш ответ, вероятно, был отклонен, поскольку пропуск атрибута действия required является нарушением спецификации HTML. - person Suncat2000; 08.01.2021

Я думаю, что лучше явно указать, где публикуется форма. Если вы хотите быть в полной безопасности, введите тот же URL-адрес, что и форма, в атрибуте действия, если вы хотите, чтобы она отправлялась сама себе. Хотя основные браузеры оценивают "" одну и ту же страницу, вы не можете гарантировать, что это будут делать неосновные браузеры.

И, конечно же, весь URL-адрес, включая данные GET, как указывает Джаддлинг.

person Will Morgan    schedule 15.07.2009

Просто используйте

?

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

Это не нарушает стандарты HTML5.

person M_R_K    schedule 08.09.2015
comment
Я не голосовал против, но ваш метод сбросит все get параметры. Форма по следующему URL-адресу будет повреждена example.com/update_user?user_id=1, потому что форма будет отправлена ​​на example.com/update_user? - person vikki; 17.10.2016

Я часто делал это, когда работал с Classic ASP. Обычно я использовал его, когда для ввода требовалась какая-то проверка на стороне сервера (до дней AJAX). Главный недостаток, который я вижу, заключается в том, что он не отделяет логику программирования от презентации на уровне файлов.

person busse    schedule 15.07.2009
comment
Почему нет? Думаю, это не связано. Я могу разместить данные в форме на той же странице и построить эту страницу с надлежащим разделением контроллера и представления. - person markus; 15.07.2009

Я использую, чтобы вообще не указывать атрибут действия. На самом деле так устроен мой фреймворк: все страницы отправляются обратно по одному и тому же адресу. Но сегодня я обнаружил проблему. Иногда я заимствую значение атрибута действия, чтобы сделать фоновый вызов (я думаю, некоторые люди называют их AJAX). Итак, я обнаружил, что IE сохраняет значение атрибута действия как пустое, если атрибут действия не был указан. В моем понимании это немного странно, поскольку, если атрибут действия не указан, аналог JavaScript должен быть как минимум неопределенным. В любом случае, я хочу сказать, что прежде чем вы выберете лучшую практику, вам нужно лучше понять контекст, например, будете ли вы использовать атрибут в JavaScript или нет.

person Singagirl    schedule 13.04.2013

Когда вы ставите пустое действие, некоторые фильтры безопасности считают его вредоносным или фишинговым. Следовательно, они могут заблокировать вашу страницу. Поэтому рекомендуется не оставлять action = blank.

person Ayush Kurlekar    schedule 14.10.2020