Это немного запутанный, но может быть более законными, чем прямой раствор XSS:
Вы не имеете никакого контроля над сервером А кроме написания JavaScript для документа А. Но вы открывающий IFRAME внутри документа A, который предполагает, что у вас есть только доступ на запись к документу A. Это немного сбивает с толку. Вы пишете js для документирования A или впрыскивания его каким-то образом?
В любом случае, вот что я придумал. Это не сработает, если у вас нет доступа к серверу, на котором размещена страница с iframe.
Пользователь обращается к форме в пределах iframe. Форма, после завершения которой, скорее всего, что-то изменяет на сервере, на котором размещена эта форма. Таким образом, у вас есть функция AJAX в документе A, которая запрашивает серверный скрипт, чтобы проверить, была ли еще представлена форма. Если это так, скрипт возвращает «отправленное» значение функции AJAX, которая запускает другую функцию js для закрытия iframe.
выше требует несколько вещей:
Функция Iframe должна быть на страницу, размещенную на сервере, где вы можете написать дополнительный серверный скрипт (это позволяет избежать проблемы кросс-временной области, так AJAX указывает на тот же каталог, теоретически).
Сервер в пределах iframe должен иметь URL-адрес, который может быть запрошен, который вернет какое-то подтверждение о том, что форма была отправлена.
Скрипт «check-for-submit» должен знать как вышеупомянутый URL-адрес, так и что искать при загрузке указанного URL-адреса.
Если у вас есть все вышеизложенные, Аякс функция вызывает серверный скрипт, сервер-скрипт использует Curl идти URL, который отражает, если форма будет сделана, сервер-скрипт выглядит для " форма была представлена «индикаторами», и, в зависимости от того, что она находит, возвращает ответ «не представлен» или «отправлен» функции ajax.
Например, возможно, форма предназначена для регистрации пользователя. Если ваш внешний документ знает, какое имя пользователя будет введено в форму, скрипт на стороне сервера может перейти в http://example.org/username
, и если он появится с «пользователем не найденным», вы знаете, что форма еще не отправлена.
Все, что выходит за рамки того, что возможно в приведенном выше примере, вероятно, находится вне того, что безопасно и безопасно в любом случае. Хотя было бы очень удобно автоматически закрывать iframe, когда пользователь отправил его, подумайте о том, что я отправил вам электронное письмо, в котором вам нужен ваш банковский счет. В электронном письме есть ссылка на страницу, которую я создал, на которой установлен сайт iframe вашего банка, чтобы заполнить всю просматриваемую часть моей страницы. Вы входите в систему как обычно, потому что вы очень доверяете. Если бы у меня был доступ к тому факту, что вы нажали кнопку «Отправить» на странице, это означало бы, что у меня также был доступ к тому, что вы отправили или, по крайней мере, к URL-адресу, к которому перенаправлен iframe (который может иметь идентификатор сеанса или всевозможные другие данные, которые банк не должен включать в URL-адрес).
Я вовсе не хочу озвучивать проповедь. Вы должны просто подумать, что для того, чтобы узнать об одном событии, вам часто предоставляется доступ к другим данным, которых вы не должны иметь.
Я думаю, что немного менее изящное решение вашей проблемы было бы иметь ссылку над iframe, которая говорит «Закончена» или «Закрыть», которая убивает iframe, когда пользователь закончил с формой. Это не только закроет iframe, когда пользователь представит форму, но и предоставит им возможность сказать «oops! Я не хочу заполнять эту форму в любом случае. Nevermind!» Прямо сейчас с вашим желаемым автоматическим решением, нет способа избавиться от iframe, если пользователь не попадет в submit.
Как явствует из ответов ниже, что, если я хочу изменить дА, то JS должен прийти из дА - так подобный вопрос: могу ли я иметь кнопку на dA представить форму в дБ? – Mala
Нет, все еще невозможно без доступа к dA/sA. – Mark