Предотвратите взлом iFrame, опустив ссылку
У меня есть страница, которая встраивает iFrame с внешним доменом. Так что я не могу ничего вставить в его DOM. Страница запускается с помощью Node-Webkit (на основе Chromium), но, поскольку это поведение одинаково для любого браузера, я считаю, что это общая проблема JavaScript.
Я хочу, чтобы пользователи не "сбрасывали ссылки" на мою страницу и в iFrame.
Для моей страницы я могу встроить небольшой фрагмент JavaScript, который прослушивает определенные события, например "drop" или "dragend":
// prevent dragging & dropping links into this application:
function handleDragEvent(e) {
e.preventDefault();
e.stopPropagation();
return false;
}
var dragEvents = ['dragend', 'drop', 'dragenter', 'dragleave', 'dragover'];
for (var i = 0; i < dragEvents.length; i++) {
window.removeEventListener(dragEvents[i], handleDragEvent);
window.addEventListener(dragEvents[i], handleDragEvent);
}
Пока что все работает нормально: ссылки на мою страницу переходить не будут. Ссылки, перетаскиваемые изнутри моей страницы в iFrame, не будут перемещаться, но их все равно можно будет перетаскивать во внешнее окно браузера (что можно предотвратить с помощью "dragstart", но это нормально для меня).
Но если пользователь перетаскивает ссылку из внешнего браузера непосредственно в iframe, он "захватывает" все окно, а не только iframe. Это то, что я хочу предотвратить.
Я установил небольшой jsfiddle, который демонстрирует это странное поведение (протестировано с Firefox и Chrome).
Вопрос: Как я могу запретить браузеру менять верхнее местоположение, если кто-то перетаскивает ссылку на iFrame из внешнего окна?
2 ответа
Здесь есть проблема, связанная с nw.js: https://github.com/nwjs/nw.js/issues/4914
Кажется, единственная возможность изменить поведение перетаскивания в iframe - это добавить прослушиватель событий в загруженный iframe (прослушивать событие "load") и переопределить поведение по умолчанию, например, для события "dragover":
// identify the iframe element
var frameElem = document.getElementById('main');
frameElem.contentWindow.addEventListener('dragover', function(e){
e.preventDefault();
e.stopPropagation();
}, false);
Я не могу сказать, беспокоитесь ли вы об этом в обычных браузерах или в node-webkit?
Если вы спрашиваете о node-webkit (теперь он называется nwjs), то пытались ли вы использовать nwfaketop
на вашем фрейме?
Я думаю, что информация на этой странице может быть вашей после: https://github.com/nwjs/nw.js/wiki/Mini-browser-in-iframe