Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Как запретить meta - http-equiv="refresh"? (https://javascript.ru/forum/events/62426-kak-zapretit-meta-http-equiv%3D-refresh.html)

Маэстро 09.04.2016 17:51

Как запретить meta - http-equiv="refresh"?
 
HTML-код типа
<meta http-equiv="refresh" content="10;URL=http://site.net">
заставляет перегрузиться страницу (в данном примере) через 10 секунд.
Можно ли с помощью javascript пресечь эту перезагрузку?

Как известно, в теге meta content устанавливает значение атрибута, заданного с помощью name или http-equiv, а
http-equiv предназначен для конвертирования метатега в заголовок HTTP.

Но я не пойму, чей это атрибут "refresh"? То есть, можно ли его очистить, убить напрочь, чтобы перезагрузка не произошла?

Решение с обработкой события onbeforeunload мне видится бестолковым.

laimas 09.04.2016 18:53

Цитата:

Сообщение от Маэстро
Но я не пойму, чей это атрибут "refresh"?

А страница чья?

Alexander Belov 09.04.2016 19:08

Маэстро,
Решали подобную задачу путём заворачивания в noscript
<noscript>
    <meta http-equiv="refresh" content="10;URL=http://site.net">
</noscript>


Насчёт JS решения не в курсе

Маэстро 09.04.2016 20:23

Цитата:

Сообщение от laimas (Сообщение 413666)
А страница чья?

Страница моя, сайт мой. Не вдаваясь в причины, просто представьте, что кто-то каким-то образом может вписать в мою страницу тег "meta" с рефрешем страницы (просто в DIV). И мне надо это локально (без привлечения сервера) остановить. Как говорится, по нажатию button.
К сожалению, как только сделано
DIV.innerHTML = '<meta http-equiv="refresh" content="10;URL=http://site.net">';
, так браузер запускает таймер до взрыва...

Маэстро 09.04.2016 20:56

Цитата:

Сообщение от Alexander Belov (Сообщение 413667)
Решали подобную задачу путём заворачивания в noscript
<noscript>
    <meta http-equiv="refresh" content="10;URL=http://site.net">
</noscript>

Вы меня обрадовали и опечалили. Для начала спасибо за гениалное решение. Мне бы такое и в голову не пришло, т.к. я не понимаю, какая связь между тегом запрета выполнения сценариев <noscript> и HTML-тегом <meta> (в котором как бы нет никакого скрипта)? Можете объяснить?
Да это работает. Проверил только что в IE 11 и FireFox. К моему удивлению это не работает в Gooogle Chrome. :(

Alexander Belov 09.04.2016 21:18

Маэстро,
Noscript - это не запрет выполнения сценария. Содержимое тега отобразится / сработает, если браузер не поддерживает скрипты или они отключены. Значит, если подключены, то содержимое игнорируется.
MDN

Насчёт Chrome пишут, что это известный баг. Иногда это "лечат" путём перезагрузки, но в Вашем случае, получается, это не выход совсем.

laimas 09.04.2016 22:00

Цитата:

Сообщение от Маэстро
просто представьте, что кто-то каким-то образом может вписать в мою страницу тег "meta" с рефрешем страницы (просто в DIV).

Даже так, разрешить пользователям вставлять подобное на свои страницы? А об htmlspecialchars что не слышали? А если не разрешать, то не эту проблему решать надо, а искать "дыру" в своем коде.

Маэстро 09.04.2016 22:17

Цитата:

Сообщение от laimas (Сообщение 413685)
Даже так, разрешить пользователям вставлять подобное на свои страницы?

-Да. Но система контроля должна ликвидировать потенциально вредные.

Цитата:

Сообщение от laimas (Сообщение 413685)
А об htmlspecialchars что не слышали?

Слышали. Но в предыдущем сообщении я написал "без привлечения сервера". То есть без PHP, без отправки на сервер. Как я и просил решить задачу локально на javascript.

Цитата:

Сообщение от laimas (Сообщение 413685)
А если не разрешать, то не эту проблему решать надо, а искать "дыру" в своем коде.

Именно этим я и занимаюсь. Все дыры перекрыты за исключением. этого рефреша.
Кстати, в одном из продуктов Гугла есть именно эта уязвимость. Но в Гугл я писать не буду.

laimas 09.04.2016 22:21

Цитата:

Сообщение от Маэстро
Но в предыдущем сообщении я написал "без привлечения сервера". То есть без PHP, без отправки на сервер. Как я и просил решить задачу локально на javascript.

А позвольте вас спросить каким же образом минуя сервер эта пакость появляется на ВАШИХ страницах? А если не минуя сервер и страницы ваши, а значит и обработкой входных данных рулите Вы. А если вы рулевой, то какого извините хрена эту проблему должен решать клиент?

Madzal 09.04.2016 22:57

как вариант
<meta http-equiv="refresh" content="10;URL=http://site.net">
<script>window.stop();</script>
:D


Часовой пояс GMT +3, время: 14:12.