Полезно ли использовать пустой 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.

derobert
источник
Позволяет ли 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.

Juddling
источник
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.

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

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

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

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

Singagirl
источник