Как переписать URL-адреса, на которые ссылается код Javascript?
Это продолжение моей популярной и технически сложной HTML-инъекции на чужой сайт? вопрос.
Напомним: я хотел бы продемонстрировать свою технологию клиентам без фактического изменения их живого веб-сайта (например, демонстрация идеи финансовых вознаграждений Stackru без модификации живого сайта). По сути, я пытаюсь создать серверную версию Greasemonkey.
Я реализовал зеркало следующим образом:
- Запрос приходит в
http://myserver.com/forward?uri=[remote]
- Мой сервер открывает соединение с
[remote]
, опускает данные и возвращает их тело / заголовки к запросу из #1.
Я выбрал этот синтаксис, потому что мне нужно было обрабатывать запросы от нескольких доменов (то есть, если stackru.com
ссылки на meta.stackru.com
Мне нужно обрабатывать оба домена с одного сервера пересылки).
Мне удалось переписать ссылки в файлах HTML и CSS, чтобы они относились к моему серверу. Последним препятствием является перезапись URL-адресов, на которые ссылаются файлы Javascript.
Каков наилучший способ программно переписать URL-адреса, на которые ссылается чужой код Javascript? Это даже технически выполнимо?
обсуждение
Я приведу пример технического препятствия, с которым я столкнулся. Взять хотя бы http://www.honda.com/. Они встраивают элемент Flash на страницу, но вместо встраивания <object>
напрямую, они используют Javascript для document.write()
<object>
тег, содержащий URL.
Первая попытка
- Используйте /questions/38258025/obnaruzhit-izmeneniya-v-dom/38258049#38258049 для прослушивания событий изменения DOM. Вместо того чтобы пытаться переписать URL-адреса в коде Javascript, подождите, пока он изменит DOM, и переписайте URL-адреса на лету.
- Перехватывайте все запросы XmlHttpRequest, используя https://stackru.com/a/629782/14731
В идеале мы хотим перехватить изменения DOM до того, как они будут отрисованы, поэтому браузер не запрашивает URL-адреса, пока у нас не будет возможности переписать их.
Связанные ресурсы:
Вторая попытка
Решение на стороне сервера не будет работать. Даже если я могу переписать все URL-адреса DOM, я видел пример, когда встроенное приложение Flash ссылается на URL-адреса, хранящиеся в переменных Javascript. Нет никакого программного способа обнаружить, что эти переменные представляют URL-адреса, потому что приложение Flash непрозрачно.
Далее я планирую попробовать решение на стороне клиента. Я буду загружать исходный сайт в один фрейм и манипулировать его содержимым с помощью Javascript во втором (скрытом) фрейме. Я надеюсь, что смогу внедрить новые элементы DOM (для демонстрации моего продукта) без необходимости перезаписывать существующие элементы.
2 ответа
Отвечая на мой собственный вопрос.
После долгих исследований я считаю, что этот метод работает лучше всего: /questions/33307225/html-inektsiya-na-chuzhoj-sajt/33307232#33307232
Другими словами, похоже, что не существует общего алгоритма переписывания ссылок. Патчить их вручную не так много работы, как вы ожидаете.
Очень сложное и интересное задание. Я хотел бы сначала сохранить файлы javascript на моем сервере и ссылаться на них из обслуживаемого HTML. Затем я бы нашел URL-адреса в файлах (используя регулярные выражения или что-то еще) и заменил их на требуемое значение. Я знаю, что это не очень быстро, не очень динамично и все такое, но я верю, что это будет легче реализовать.
Надеюсь, я помог!