Кнопка "Назад" Safari и Chrome изменяется скрытый, и отправьте значения в формах

Следующая проблема происходит и на Safari и на Chrome, так вероятно, проблема WebKit.

Страница A: страница, которая требует, чтобы Вы вошли в систему для наблюдения, содержит форму, которая имеет type=submit кнопку с name=submit и value=a

Страница B: некоторая другая страница

Страница C: спросите пользователя к странице входа в систему, содержит форму с type=submit кнопкой, с name=submit и value=c

Пользователь посещает страницу A, затем страницу B. Затем бездействует, и сессия входа в систему пользователя испытывает таймаут. Пользователь поражает кнопку "Назад" для возвращения к странице A. Браузер перенаправляет пользователя к странице C.

На Safari и Chrome, когда C представляется, форма на странице C имеет type=submit кнопку, name=submit, но значение обнаруживается как "a".

Если Вы перезагружаете, в то время как на странице C, "c" появляется как значение name=submit кнопки.

Та же проблема появляется с type=hidden полями ввода; когда пользователь поражает кнопку "Назад", их значения также изменяются на некоторое другое значение от некоторой другой формы. Кроме того, эта проблема также разоблачает w/o, который перенаправление, только с отправляют затем обратно. В этом случае рендеринг предыдущей страницы с неправильными значениями для скрытого и отправляет переменные CGI.

До сих пор единственная фиксация, которую я могу придумать, является использованием JavaScript, чтобы сбросить type=hidden и type=submit значения переменных после загрузок страницы C, удостовериться, что значения правильны. Но это не чисто и универсально применимо.

За исключением WebKit, устраняющего эту ошибку, кто-либо имеет, столкнулся с лучшим обходным решением?

Спасибо.

6
задан OverClocked 3 March 2010 в 18:25
поделиться

3 ответа

После долгих поисков я нашел ответ на этот вопрос. Ну не ответ, но почему так происходит. Я надеюсь, что это сэкономит время другим людям.

Текущие браузеры на основе WebKit (по состоянию на 16.03.2010), например Safari и Chrome обнаруживают следующие ошибки. Возможно, кто-нибудь сможет взглянуть. Спасибо.

Ошибка 1. Если на странице A есть несколько элементов формы F1 и F2, а в первой (в порядке появления в HTML) форме F1 автозаполнение установлено на «выключено» (т. Е.), Но для F2 автозаполнение установлено на «on» (поведение по умолчанию), затем после перехода со страницы A и последующего нажатия кнопки браузера «Назад» для возврата на страницу A, F1 и F2 могут быть автоматически заполнены неправильно. В частности, если F1 и F2 имеют входные элементы с одинаковым именем и типом, скажем N и T (т.е.), то при переходе обратно на страницу A с помощью кнопки «назад» значение F1.N будет автоматически дополнено значением F2.N. .

Ошибка 2: сначала браузер открывает страницу A, а сервер возвращает HTML-страницу с элементами формы F1 и F2 (для обеих форм включено автозаполнение). Затем пользователь уходит со страницы A и затем возвращается на страницу A с помощью кнопки возврата в браузере. При втором посещении страницы A WebKit отправляет еще один запрос A серверу (это отличается от поведения FireFox, когда на кнопку «Назад» сервер не отправляет никаких дополнительных запросов). Если сервер возвращает другую HTML-страницу (например,поскольку пользовательский сеанс вышел из системы), с элементами формы F3 и F4, которые отличаются от F1 и F2, но состоят из элементов ввода с тем же именем и типом, тогда F3 и F4 будут автоматически заполнены значениями элементов ввода F1 и F2, даже для типа входного элемента скрытый и отправить.

ПОВТОРНАЯ РАБОТА

Ошибка 1: никогда не используйте autocomplete = "off", если вы не установили этот параметр для ВСЕХ форм на одной HTML-странице.

Ошибка 2: конкретный случай, нет хорошего универсального решения. Мы нашли приемлемый обходной путь, включив скрытые формы, чтобы убедиться, что две версии страницы A имеют похожие формы; первая версия имеет F1, F2, F3, а вторая - F1, F2 'и F3, где F2' - это скрытая версия F2. Если мы не включаем F2 ', тогда вторая версия страницы A - это F1, и F3, и F3 будет автоматически заполняться значениями элементов F2, даже для скрытых и отправленных элементов в F3.

АНАЛИЗ КОДА WebKit

Эти две ошибки возникают в одной и той же части кода, но, вероятно, их можно рассматривать как две отдельные ошибки. Код находится в подкаталоге WebCore дерева кода WebKit.

Ошибка 1: в Document :: formElementsState элементы ввода, для которых включено автозаполнение (проверяется с помощью HTMLInputElement :: saveFormControlState), сохраняют свое состояние в векторе. Однако в HTMLFormControlElementWithState :: finishParsingChildren каждый элемент формы, независимо от того, включено ли автозаполнение или нет, восстанавливает состояние из вышеупомянутого вектора. Это приводит к ошибке 1.

Исправление ошибки 1: это должно быть довольно простое исправление - finishParsingChildren не должно восстанавливать состояние, если автозаполнение элемента отключено.

Отказ от ответственности: я не занимаюсь разработкой для Mac. Я только им пользуюсь, а мы разрабатываем сайт. Я просто просматриваю код WebKit сегодня. Следовательно, я не создавал и не тестировал патч.

Ошибка 2. Это намного сложнее.

Я предполагаю, что в дизайнерском решении, не связанном с автозаполнением, WebKit предназначен для повторного получения страницы A, если пользователь использует кнопку «Назад», чтобы вернуться в историю на страницу A.

(мне было бы интересно услышать об этом тоже)

По сути,WebKit делает неверное предположение, что вторая выборка страницы A приводит к тому же HTML или, по крайней мере, к тому же набору форм, что и первая выборка. Если это не так, то логика автозаполнения больше не дает правильного / ожидаемого поведения.

Когда WebKit сохраняет состояние страницы, он вызывает Document :: formElementsState, который просто создает карту пар и помещает в карту имя каждого элемента ввода + тип и пару значений. Если два элемента ввода в двух отдельных формах имеют одинаковое имя и тип, сохраняются оба значения.

Например, скажем, страница A имеет формы F1 и F2, а F1 имеет входные элементы с именами a1 и a2, с типами t1 и t2, со значениями v1 и v2 соответственно. F2 имеет входные элементы с именами a3 и a2, с типами t1 и t2 и значениями v3 и v4 соответственно. WebKit сохраняет состояние этой страницы как (в уведомлении JSON)

{"a1, t1": [v1], "a2, t2": [v2, v4], "a3, t1": [v3]}

Если пользователь повторно посещает страницу A с помощью кнопки возврата в браузере, WebKit попытается автоматически заполнить формы на новой версии страницы A, полученной с сервера, используя указанное выше состояние. Если новая версия страницы A имеет точно такие же формы, как и предыдущая, то все работает. В противном случае WebKit ведет себя некорректно. Например, предположим, что во второй раз выбирается страница A, сервер возвращает только одну форму F3, а F3 имеет входные элементы с именами a4 и a2, с типами t1 и t2, тогда элемент a2 F3 будет заполнен v2, сохраненным из предыдущего страница.

(Примечание: фактическая логика сохранения состояния и восстановления состояния, используемая в коде, немного отличается, но идея та же самая)

Эта проблема проявляется на веб-сайтах, когда пользовательские сеансы могут истекать, и после сеанс истекает, нажатие на страницу A может привести к появлению немного другого HTML. Например. может предоставить вам форму «Пожалуйста, войдите» или может предоставить вам примерно то же самое содержание, но вместо формы поиска данных пользователя вверху появится форма входа в систему. В этих случаях значения видимого элемента ввода текста, скрытого элемента ввода и элементов ввода отправки могут быть изменены с помощью WebKit.

Ошибка 2: это сложно, потому что WebKit повторно выбирает страницу A, когда пользователь нажимает кнопку «Назад». Если новая версия страницы A отличается от старой версии, WebKit не может легко сопоставить состояние формы из старой версии страницы с какой-либо формой, если она даже существует, в новой версии. Вы не можете реально требовать, чтобы все формы имели один и тот же идентификатор DOM, и даже если вы это сделаете, это все равно не совсем правильно, поскольку идентификаторы DOM должны быть уникальными в пределах HTML-страницы, но не обязательно должны быть уникальными для отдельных HTML-документов.

Единственное исправление, о котором я могу думать, это следующее: когда вы сохраняете состояние с первого посещения страницы A, берете хэш MD5 или SHA1 страницы и сохраняете его вместе с состоянием элемента ввода. Когда вы вернетесь на страницу A, восстанавливайте состояние только в том случае, если хэш MD5 или SHA1 совпадает.

17
ответ дан 8 December 2019 в 05:54
поделиться

Я не уверен, но попробуйте добавить autocomplete = 'off' во все формы.

<form .... autocomplete = 'off'>
4
ответ дан 8 December 2019 в 05:54
поделиться

autocomplete = "off"

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

DIV style = "display: none"

и добавьте поля input_type = "text" value = "s" в тег DIV

1
ответ дан 8 December 2019 в 05:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: