Чи корисно використовувати порожню URL-адресу для атрибута дії форми HTML? (дія = “”)


279

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

Існує публікація із запитанням про те, що тут робить порожня форма HTML, а деякі сторінки, як ця, напрошують це добре, але я хотів би знати, що думають люди.


7
До цього можна застосувати тег "кращих практик".
Буде Морган

Щоб подвійно підтвердити, залиште дію порожнім або просто зовсім не згадуйте дії (як <form name="xyz" >). Він подасть дію самостійно.
lwpro2

11
Якщо не включати атрибут дії, відкривається сторінка аж до атак, що вмикають клік iframe , наприклад, коли зловмисник загортає вашу сторінку в рамку iframe, а URL-адреса iframe містить параметр запиту з тим самим іменем, що і поле форми. Після подання форми значення запиту вставляється в базу даних, тому ідентифікаційна інформація користувача (електронна адреса, адреса тощо) була порушена.
Пол Sweatte

Тож, який дійсний, безпечний спосіб подати форму на поточну сторінку?
Коста

Відповіді:


268

Найкраще, що ви можете зробити, це взагалі опустити атрибут дії. Якщо ви не залишите його, форма буде надіслана на адресу документа, тобто на ту саму сторінку.

Можна також залишити його порожнім, і будь-який веб-переглядач, що реалізує алгоритм подання форми HTML, буде вважати його еквівалентним адресі документа, що це робиться головним чином, оскільки саме так працюють браузери:

8.Нехай дію буде подавець елемента дії .

9.Якщо дія - порожній рядок, нехай дія буде адресою документа .

Примітка. Цей крок є навмисним порушенням RFC 3986, що вимагає тут обробки базової URL-адреси. Це порушення мотивоване прагненням до сумісності зі старим вмістом. [RFC3986]

Це безумовно працює у всіх поточних браузерах, але може не працювати, як очікувалося, у деяких старих браузерах ( " браузери дивні речі з порожньою дією =" "атрибут " ), саме тому специфікація сильно заважає авторам залишати його порожнім :

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


12
Можливо, це змінилося після вашої відповіді (минуло майже три роки), але на сьогодні HTML5 не дозволяє action=""—дивіться моєї відповіді ...
derobert

2
@derobert Дякую Це, мабуть, не змінилося. Я змінив свою відповідь, щоб краще відобразити те, що говорить специфікація.
меркатор

73

Насправді підрозділ подання форми для поточного проекту HTML5 не дозволяє action="". Це проти спец.

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

Цитований розділ у відповіді Меркатора є вимогою до реалізацій , а не авторам . Автори повинні виконувати вимоги автора. Цитувати Як читати цю специфікацію :

Зокрема, є вимоги відповідності, що стосуються виробників, наприклад, авторів та створені ними документи, а також є вимоги відповідності, що стосуються споживачів, наприклад веб-браузери. Їх можна розрізнити по тому, що вони вимагають: вимога до виробника вказує, що дозволено, тоді як вимога до споживача визначає, яким чином діє програмне забезпечення.

Зміна HTML4, яка дозволила пусту URL-адресу, була внесена через те, що " браузери дивні речі мають порожній action=""атрибут ". Враховуючи причину зміни, можливо, найкраще також цього не робити в HTML4.


Чи дозволяє actionвзагалі відсутність атрибуту вказувати на форму, яку слід подати на адресу документа? Здається, оскільки йдеться, "якщо вказано".
Керрік

2
@Kerrick Так, я вважаю, що HTML5 дозволяє повністю опустити атрибут дії, а за умовчанням - порожній рядок. HTML4 цього не зробив, він визначає необхідні дії.
дероберт

Я погоджуюся з @Kerrick, атрибут дії не можна опускати. Читаючи поточний чорновий HTML5, видається, що порожній рядок не дозволений, але відсутність атрибута дозволена. Але в будь-якому випадку, з міркувань сумісності я рекомендую вам завжди включати атрибут "action" і заповнювати його дійсною не порожньою URL-адресою (хороші практики завжди найкращий спосіб).
serfer2

Один з потенційних можливостей: AngularJS запобігає надсиланню форм без атрибуту дії. Напевно, це не є загальною проблемою, але мені знадобилося певний час, щоб з'ясувати, чому частини нашого застарілого сайту почали ламатись.
Асмор

18

Якщо не включати атрибут дії, відкривається сторінка до атак, що виконують кліки iframe , які включають кілька простих кроків:

  • Зловмисник загортає вашу сторінку в кадр
  • URL-адреса iframe містить параметр запиту з тим самим іменем, що і поле форми
  • Після подання форми значення запиту вставляється в базу даних
  • Ідентифікаційна інформація користувача (електронна адреса, адреса тощо) була порушена

Список літератури


2
Чи URL-адреса iframe не містить параметрів GET, тоді як форми зазвичай надсилаються за допомогою POST? Отже, якщо сайт має справу лише з параметрами POST, то це не повинно бути проблемою, чи не так? Принаймні, я зазвичай використовую масив $ _POST в PHP лише при обробці форм.
Кальмарій

2
@Calmarius Так, використовуйте $_POSTзамість цього, $_REQUESTщоб уникнути цього. Якщо використовується рамковий код $_REQUEST, використовуйте програвач iframe .
Пол Sweatte

17

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

<form action="#">

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

2
Ви не можете використовувати action="."?
s427

3
дія = "?" також добре працює. Він перевіряє і вказує на поточну сторінку без запиту рядкових даних.
Кріс Броскі

5
action="."є поганою ідеєю для загального випадку. Така URL-адреса example.com/loginвідображається просто example.com/.
Торстен Бронгер

1
Ця відповідь справедлива лише в тому випадку, якщо користувач хоче прокрутити вгору сторінки.
Буц

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

Хотіли б зрозуміти, чому хтось проголосував за цю відповідь?
Буц

Ви опускаєте атрибут дії, чи форма, яка все ще відкрита для подвигів, детально описана на першій сторінці за посиланням?
Річард Янг

@RichardYoung Вибачте, я не розумію вашого запитання. Будь ласка, перефразовуйте.
Буц

1
Зміну $ _SERVER ["PHP_SELF"] можуть використовувати хакери. Якщо на вашій сторінці використовується PHP_SELF, то користувач може ввести косу рису (/), а потім виконати кілька команд крос-скриптування (XSS). Якщо ви опустите атрибут дії, ви все ще вразливі до цього?
Річард Янг

Так і є. Атрибут дії можна додати ще на стороні клієнта і надати будь-яке значення на вибір. Однак використання цієї htmlspecialchars()функції не дозволяє людям використовувати ваш php-скрипт проти вас.
Буц

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=1оскільки форма надсилається доexample.com/update_user?
vikki

1

Раніше я це робив багато, коли працював з Classic ASP. Зазвичай я використовував його, коли для введення даних (до днів AJAX) потрібна була певна перевірка на стороні сервера. Основна недоліка, яку я бачу, - це те, що вона не відокремлює логіку програмування від презентації на рівні файлів.


1
чому ні? Я думаю, що це не пов'язано. Я можу мати форму розміщення даних на тій самій сторінці і створити цю сторінку з належним розділенням контролера та перегляду.
markus

1

Я використовую, щоб взагалі не вказувати атрибут дії. Насправді, як розроблено мою основу, всі сторінки надсилаються в точності на ту саму адресу. Але сьогодні я виявив проблему. Іноді я запозичую значення атрибуту дії, щоб здійснити деякий фоновий дзвінок (я думаю, деякі люди називають їх AJAX). Тож я виявив, що IE зберігає значення атрибута дії як порожнє, якщо атрибут дії не вказаний. На мій погляд, це трохи дивно, оскільки якщо не вказаний атрибут дії, аналог JavaScript повинен бути принаймні невизначеним. У будь-якому разі, я висловлюю думку, перш ніж вибрати кращу практику, вам потрібно зрозуміти більше контексту, як ви будете використовувати атрибут у JavaScript чи ні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.