Получение выделенного текста с помощью межкадрового скриптинга - PullRequest
0 голосов
/ 13 марта 2009

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

У меня есть веб-приложение, которое берет выбранный текст (document.getSelection()) в качестве входных данных с произвольной веб-страницы. Хотя было бы возможно использовать букмарклет для выполнения таких сценариев довольно легко, для конечного пользователя будет лучше, если я смогу выполнить это с помощью iframe.

Родительский фрейм - мой сайт с этим скриптом:

$('#frame').load(function(){
    // this event won't be triggered
    $(window).mouseup(function(){
        doStuff(window.getSelection()); 
    });

    // this will throw a security error
    $(window.frames[0].document).mouseup(function(){
        doStuff(window.frames[0].document.getSelection()); 
    });                  
});

Произвольный сайт находится в дочернем фрейме. Если дочерний документ не принадлежит моему домену, доступ запрещен по соображениям безопасности XSS. Я пробовал несколько вариантов и попыток взлома, включая установку iframe src для моего домена с URL-адресом третьей стороны в качестве аргумента и последующим перенаправлением на URL-адрес третьей стороны. В некотором смысле, я рад, что это не сработало (потому что, если бы это сработало, то безопасности XSS еще предстояло пройти долгий путь ...)

Другим вариантом будет загрузка сторонней страницы и ее обслуживание с моего домена как прокси-сервера, но я уже столкнулся с кучей проблем с относительными путями к файлам, которые иногда легко сделать абсолютными, но иногда поручение дурака (например, когда к файлам обращаются через скрипт).

Я пришел к выводу, что мне может просто не повезти. Возможно, важным отличием для моего случая является то, что я хочу получить доступ только к методу .getSelection() для ребенка. Нет необходимости иметь доступ к файлам cookie или нажатиям клавиш или взаимодействовать с DOM. Может быть, это не имеет значения, но, возможно, это имеет значение.

Ответы [ 3 ]

0 голосов
/ 13 марта 2009

Одна из возможностей - написать документ iframe с текстом из XHR или использовать функцию jQuery load(), это работает только в том случае, если в iframe нет навигации.

0 голосов
/ 18 января 2011

Я не полностью прочитал ваш ответ :-) но, возможно, у меня есть решение, он включает в себя передачу данных между родительским и дочерним кадрами в обоих направлениях.

Вы можете ЗАПИСАТЬ (а не ЧИТАТЬ) хэш (хэш равен http://url # HASH_PART ) родительского элемента от дочернего элемента. Итак, в родительском iframe просто установите интервал для проверки значения, скажем, каждые 50 мс.

function checkHash() {
    if (window.location.hash == "#something") {
        // my child frame set this value using: 
        //parent.window.location.hash = "something";
        doSomething();
    }
}

Для получения более подробной информации, и, возможно, для связи между родителями и потом, тогда полная статья, объясняющая это (также имеет демонстрационную ссылку), может быть найдена здесь .

0 голосов
/ 13 марта 2009

Вы можете попробовать прокси-метод, но вставить тег base , который указывает на исходный домен. О путях следует позаботиться потом.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...