подання форми GET з парами рядків запиту та прихованими парамами зникають


231

Розглянемо цю форму:

<form action="http://www.blabla.com?a=1&b=2" method="GET">
    <input type="hidden" name="c" value="3" /> 
</form>

При подачі цієї форми (форма GET) параметри a і b зникають. Чи є причина в цьому? Чи є спосіб уникнути такої поведінки?


3
Ваш елемент дії неправильно сформований.
Адріан Годонг

Вони не повинні зникати, тому, я думаю, нам потрібно побачити вашу форму.
UnkwnTech

2
Привіт, Ось повна форма, ви можете просто створити HTML за допомогою цієї форми і побачити, що параметри, які я передаю в дії, розходяться: <form action = " example.com?e=4&f=5 " method = "GET"> <input type = "hidden" name = "a" value = "1" /> <input type = "hidden" name = "b" value = "2" /> <input type = "hidden" name = "c" value = "3" /> <input type = "submit" /> </form>

1
До речі, ви знаєте, що вам не вистачає кінцевої цитати про це значення дії? Зовсім осторонь основного випуску, але ...
Джей

Я опублікував можливе рішення за допомогою JavaScript тут: stackoverflow.com/questions/3548795/…
Дженні О'Рейлі

Відповіді:


263

Хіба це не те, з чого приховані параметри починаються з ...?

<form action="http://www.example.com" method="GET">
  <input type="hidden" name="a" value="1" /> 
  <input type="hidden" name="b" value="2" /> 
  <input type="hidden" name="c" value="3" /> 
  <input type="submit" /> 
</form>

Я б не розраховував, що жоден веб-переглядач збереже в URL-адресі дії будь-який рядок запиту.

У специфікаціях ( RFC1866 , стор. 46; HTML 4.x, розділ 17.13.3) зазначено:

Якщо метод "отримати", а дія - це URI HTTP, агент користувача приймає значення дії, додає "?" до нього потім додає набір даних форми, закодованих за допомогою типу вмісту "application / x-www-form-urlencoded".

Можливо, можна відсотково кодувати URL-адресу дії, щоб вставити знак питання та параметри, а потім схрестити пальці, сподіваючись, що всі браузери залишать цю URL-адресу як таку (і підтверджують, що і сервер її розуміє). Але я ніколи на це не покладався.

До речі: для не прихованих форм форм це не відрізняється. Для POST URL-адреса дій може містити рядок запиту.


71

У HTML5 це специфічна поведінка.

Дивіться http://www.w3.org/TR/2011/WD-html5-20110525/association-of-controls-and-forms.html#form-submission-algorithm

Подивіться на "4.10.22.3 Алгоритм подання форми", крок 17. У випадку форми GET до URI http / s з рядком запиту:

Нехай призначення - це нова URL-адреса, яка дорівнює дії, за винятком того, що її <query>компонент замінюється запитом (додаючи символ U + 003F QUESTION MARK (?), Якщо доречно).

Отже, ваш веб-переглядач переробить існуючу "? ..." частину вашого URI і замінить її новою на основі вашої форми.

У HTML 4.01 специфікація створює недійсні URI-адреси - більшість браузерів насправді цього не робили ..

Див. Http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3 , крок четвертий - URI матиме? додається, навіть якщо воно вже містить його.


це означає: все за ?URL-адресою дії видалено? Що таке, якщо параметр GET в URL-адресі містить ціль, де форма повинна бути оброблена? подобається: action="index.php?site=search". Я не впевнений, що якщо розміщення параметра GET у прихованих полях введення є божою ідеєю.
The Bndr

що ви розумієте під per-spec @xyphoid?
АміНадімі

@AmiNadimi: Це означає "відповідно до специфікації".
рекурсивна

14

Що ви можете зробити, це використовувати простий підказку на таблиці, що містить інформацію про GET. Наприклад у php:

foreach ($_GET as $key => $value) {
    echo("<input type='hidden' name='$key' value='$value'/>");
}

23
Примітка: ніколи не використовуйте цей приклад коду так, як написано. Це було б дуже небезпечно. Значення GET надходять від користувача, тому не слід записувати їх на сторінку, не забуваючи їх спочатку.
Малюнок

16
Здійснення посилань, поки помилка XSS у цьому коді не буде виправлена.
spookylukey

1
Ця відповідь дає подібне рішення, але не є вразливим для XSS.
ввж

це не обробляє параметри масиву
Ендрю

5

Ви повинні включити два пункти (a і b) як приховані вхідні елементи, а також C.


Так, звичайно, я би зробив це, якщо можливо. Але скажемо, що у мене є параметри в рядку запиту та прихованих входах, що я можу зробити?

Я думаю, що ваш єдиний варіант - проаналізувати пари рядків імен / значень рядка запиту та створити приховані поля введення. Можливо, якщо ви трохи детальніше описали контекст сторінки та URL-адреси, ми могли б запропонувати робоче рішення.
Бернхард Хофманн

Крім того, візьміть дані з прихованих елементів форми та додайте їх до URL-адреси та додаткових параметрів запиту, а потім замініть кнопку подання форми простим прив’язним посиланням або Location:переадресацією сервера, якщо ви не хочете взаємодії з кінцевим користувачем. .
Джейсон

1

У мене була дуже схожа проблема, коли для дії форми у мене було щось на кшталт:

<form action="http://www.example.com/?q=content/something" method="GET">
   <input type="submit" value="Go away..." />&nbsp;
</form>

Кнопка призведе користувача до сайту, але інформація про запит зникла, тому користувач перейшов на домашню сторінку, а не на потрібну сторінку вмісту. У моєму випадку рішенням було з’ясувати, як кодувати URL-адресу без запиту, який приведе користувача до потрібної сторінки. У цьому випадку моєю ціллю був Drupal-сайт, тому, як виявилося, /content/somethingтакож працював. Я також міг би використовувати номер вузла (тобто /node/123).


0

Якщо вам потрібно вирішити, оскільки ця форма може бути розміщена в сторонніх системах, ви можете використовувати Apache mod_rewrite так:

RewriteRule ^dummy.link$ index.php?a=1&b=2 [QSA,L]

тоді ваша нова форма буде виглядати приблизно так:

<form ... action="http:/www.blabla.com/dummy.link" method="GET">
<input type="hidden" name="c" value="3" /> 
</form>

і Apache додасть 3-й параметр до запиту


-3

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

"Але скажемо, що у мене є параметри в рядку запиту та прихованих входах. Що я можу зробити?" Що ви можете зробити - це виправити помилку. Не бути чистим, але це трохи схоже на запитання: "Але скажімо, що моя URL-адреса використовує знаки відсотків замість косої риси, що я можу зробити?" Єдина можлива відповідь - ви можете виправити URL-адресу.


Вся ця відповідь технічно правильна ("її неправильно, тому виправте"), але нічого б корисного. ОП вже знає, що щось не так, і тут задається питанням, як це виправити.
Джейсон

Вибачте, не все було так ясно? "Ви не можете включати параметри у значення дії форми." Щоб виправити це, вийміть параметри зі значення дії форми.
Джей

@Jay Проблема в тому, що користувачеві потрібні параметри URL-адреси, щоб залишитися, тому сказати "видалити їх" не допоможе
Чак Ле

@ChuckLeButt Казати: "але мені потрібно робити цю річ, яка не працює" - це не корисна річ. Якщо хтось скаже мені: "Я продовжую повертати ручку радіо, але моя машина не рухатиметься", єдиною реакцією, про яку я можу придумати, буде те, щоб сказати: "Поворот ручки не змушує машину рухатись. Ви повинні повернути. ключ запалювання та натисніть на педаль газу ". Відповісти: "але мені потрібно змусити машину рухатись, повертаючи ручку радіо" - це непродуктивна відповідь. Це не працює. Це не спрацює.
Джей

-3

Це відповідає у відповідь на вищезгаданий пост Efx:

Якщо URL-адреса вже містить змінну, яку ви хочете змінити, вона знову додається як приховане поле.

Ось модифікація цього коду, щоб запобігти дублюванню vars в URL-адресі:

foreach ($_GET as $key => $value) {
    if ($key != "my_key") {
        echo("<input type='hidden' name='$key' value='$value'/>");
    }
}

-4
<form ... action="http:/www.blabla.com?a=1&b=2" method ="POST">
<input type="hidden" name="c" value="3" /> 
</form>

змінити метод запиту на "POST" замість на "GET".


-4

Я зазвичай пишу щось подібне:

foreach($_GET as $key=>$content){
        echo "<input type='hidden' name='$key' value='$content'/>";
}

Це працює, але не забувайте санітувати свої дані від атак XSS!

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