Полезно ли использовать пустой URL-адрес для атрибута действия формы HTML? (Действие = «»)


279

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

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


7
Для этого нужно применить тег "best-Practices".
— Уилл Морган

Для двойного подтверждения оставьте действие пустым или просто не упоминайте действие вообще (например <form name="xyz" >). Он подаст действие самостоятельно.
— lwpro2

11
Если исключить атрибут действия, откроется страница с атаками клик-кликов iframe , например, когда злоумышленник упаковывает вашу страницу в iframe, а URL-адрес iframe содержит параметр запроса с тем же именем, что и у поля формы. Когда форма отправляется, значение запроса вставляется в базу данных, поэтому идентификационная информация пользователя (адрес электронной почты, адрес и т. Д.) Была скомпрометирована.
— Пол Свитт

Итак, каков действительный и безопасный способ отправить форму на текущую страницу?
— Коста

Ответы:


268

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

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

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

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

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

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

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


12
Возможно, это изменилось с тех пор, как вы ответили (прошло почти три года), но на сегодняшний день HTML5 не позволяет - action=""см. Мой ответ ...
— derobert

2
@ derobert Спасибо. Это, вероятно, не изменилось. Я изменил свой ответ, чтобы лучше отражать то, что говорится в спецификации.
— Mercator

73

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

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

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

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

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


Позволяет ли actionвообще полное отсутствие атрибута указывать, что форму следует отправлять на адрес документа? Кажется, так как он говорит, «если указано».
— Керрик

2
@Kerrick Да, я считаю, что HTML5 позволяет полностью исключить атрибут action и по умолчанию использовать его для пустой строки. HTML4 не сделал, он определяет действие как требуется.
— Дероберт

Я согласен с @Kerrick, разрешено опускать атрибут действия. При чтении в текущем проекте HTML5 кажется, что пустая строка не разрешена, но допускается отсутствие атрибута. Но в любом случае, из соображений совместимости, я рекомендую всегда включать атрибут «action» и заполнять его допустимым непустым URL-адресом (наилучший способ всегда лучший).
— serfer2

Одна потенциальная ошибка: AngularJS предотвратит отправку форм без атрибута действия. Возможно, это не обычная проблема, но мне потребовалось некоторое время, чтобы понять, почему части нашего старого сайта начали ломаться.
— Асмор

18

Не включая атрибут действия, вы открываете страницу для атак iframe clickjacking , которые включают в себя несколько простых шагов:

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

Ссылки


2
Разве в iframe URL не содержатся параметры GET, а формы обычно отправляются с использованием POST? Так что, если сайт имеет дело только с параметрами POST, тогда это не должно быть проблемой, не так ли? По крайней мере, я обычно использую массив $ _POST в PHP только при обработке форм.
— Кальмариус

2
@ Calmarius Да, используйте $_POSTвместо того, $_REQUESTчтобы избежать этого. Если код фреймворка использует $_REQUEST, используйте iframe buster .
— Пол Свитт

17

Это будет подтверждено HTML5.

<form action="#">

4
Я не пробовал, но концептуально не будет ли прокручиваться к началу страницы после отправки?
— Мэтт Митчелл

2
Не могли бы вы использовать action="."?
— s427

3
действие = "?" тоже хорошо работает Он проверяет текущую страницу и указывает на нее без данных строки запроса.
— Крис Броски

5
action="."это плохая идея для общего случая. URL-адрес, как example.com/loginотображается просто example.com/.
— Торстен Бронджер

1
Этот ответ действителен, только если пользователь хочет прокрутить до верхней части страницы.
— Buts

9

В 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="#">

Хотите понять, почему кто-то проголосовал за этот ответ?
— Buts

Вы опускаете атрибут action, форма все еще открыта для эксплойтов, подробно описаны на первой странице ссылки?
— Ричард Янг

@RichardYoung Извините, я не понимаю вашего вопроса. Пожалуйста, перефразируйте.
— Buts

1
Переменная $ _SERVER ["PHP_SELF"] может быть использована хакерами. Если на вашей странице используется PHP_SELF, то пользователь может ввести косую черту (/), а затем выполнить некоторые команды межсайтового скриптинга (XSS). Если вы пропустите атрибут действия, вы все еще уязвимы для этого?
— Ричард Янг

Да Вы. Атрибут action может быть добавлен обратно на стороне клиента и может иметь любое значение по выбору. Однако использование этой htmlspecialchars()функции не позволяет людям использовать ваш php-скрипт против вас.
— Buts

4

Я обычно использую action = "", который является допустимым XHTML и сохраняет данные GET в URL.


4
Редко, но, например, на моем форуме у меня был бы URL: thread.php? Id = 12 & page = 6, а внизу страницы есть форма POST для добавления комментариев, и мне нужны данные GET, чтобы PHP знает, в какую ветку добавить комментарий.
— Джадлинг

20
GET является методом по умолчанию для форм - это вряд ли плохо ;-) w3.org/TR/html401/interact/forms.html#adef-method
— NickFitz

5
Использование GET в формах - это плохо. Если пользователь перезагружает страницу после отправки, это может привести к непредвиденным последствиям. Однако, если используется POST, браузер предупредит о повторной отправке тех же данных.
— Уилл Шеппард

22
@WillSheppard Я не согласен. Вы не можете сделать такое общее заявление. Все зависит от того, что делает форма. Вы должны использовать POST для всего, что выполняет действие (например, вставка нового сообщения в форум), но GET для всего остального (например, окно поиска или использование форм для навигации). После успешного выполнения POST сценарий должен перенаправить браузер, чтобы пользователь не мог повторно отправить данные.
— Майк

3
PS Не все браузеры предупреждают пользователя о повторной отправке данных POST (например, Opera)
— Майк

4

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

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


2

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

?

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

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


Я не понизил голос, но ваш метод отбросит все getпараметры. Форма на следующий URL будет example.com/update_user?user_id=1example.com/update_user?
— нарушена,

1

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


1
почему нет? Я думаю, что это не связано. Я могу иметь форму для публикации данных на той же странице и построить эту страницу с надлежащим разделением контроллера и представления.
— Маркус

1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.