HTML-инъекция на чужой сайт?
У меня есть продукт, который встраивается в веб-сайты аналогично Paypal (клиенты добавляют мою кнопку на свой веб-сайт, пользователи нажимают на эту кнопку, и после завершения обслуживания я перенаправляю их обратно на исходный веб-сайт).
Я хотел бы продемонстрировать свои технологии клиентам, не внося изменений в их живой сайт. Для этого можно ли настроить http://stackru.myserver.com/ таким образом, чтобы он отражал http://www.stackru.com/ при одновременном плавном введении моей кнопки?
Это означает, что я хочу продемонстрировать опыт использования моей кнопки на живом веб-сайте без фактического повторного размещения базы данных клиента на моем сервере.
Я знаю, что здесь есть проблемы с безопасностью, поэтому не стесняйтесь упоминать их, пока мы отвечаем требованиям. Мне не нужно демонстрировать это для веб-сайта, который использует HTTPS.
Более конкретно, я хотел бы продемонстрировать идею финансовых вознаграждений по вопросам Stackru, введя кнопку Paypal на страницу. Как бы мне продемонстрировать это на http://stackru.myserver.com/ без изменения https://stackru.com/?
ЗАПРОС, ЧТОБЫ ОТКРЫТЬ: Я перефразировал вопрос, чтобы он был более конкретным для вашего запроса. Если вы все еще считаете, что он слишком широк, пожалуйста, помогите мне понять ваши аргументы, разместив комментарий ниже.
ОБНОВЛЕНИЕ: я опубликовал последующий запрос на Как переписать URL-адреса, на которые ссылается код Javascript?
ОБНОВЛЕНИЕ 2: Я отказался от идеи букмарклетов и Greasemonkey, потому что они требуют установки / модификации на стороне клиента. Нам нужно сделать процесс как можно более плавным, иначе многие из них будут отключены процессом и не позволят нам сделать это.
3 ответа
После долгой игры с этим я сделал следующее:
- Перепишите файлы HTML и JS на лету. Все остальные ресурсы размещены на оригинальном веб-сайте.
- Для файлов HTML введите
<base>
тег, указывающий на перенаправляемый сайт. Это заставит браузер автоматически перенаправлять относительные ссылки (в HTML-файле, CSS-файлах и даже Flash!) На исходный веб-сайт. - Для файлов JS примените регулярное выражение для исправления определенных разделов кода, которые указывают на записанный URL-адрес. Я загружаю перенаправленную страницу в браузере, ищу неработающие ссылки и выясняю, какой раздел JS нужно исправить, чтобы исправить проблему.
Это звучит намного сложнее, чем есть на самом деле. В среднем исправление каждой страницы занимает менее 5 минут работы.
Большое открытие было <base>
тег! Это исправило подавляющее большинство ссылок от моего имени.
Я бы предложил создать прокси с помощью обработчика HTTP.
в ProcessRequest
ты можешь сделать HttpWebRequest
чтобы получить контент с другой стороны, измените его и верните настроенный HTML-код в браузер. Вы можете переписать URL-адреса внутри, чтобы разрешить загрузку изображений и т. Д. Из исходного источника.
public void ProcessRequest(HttpContext context)
{
// get the content using HttpWebRequest
string html = ...
// alter it
// write back the adjusted html
context.Response.Write(html);
}
Если вы демонстрируете на клиентской стороне и хотите просто быстро его взломать, вы можете выполнить его с помощью некоторого jQuery. Я нажал кнопку после логотипа SO просто для демонстрации. Вы могли бы напечатать это в своей консоли:
$('head').append('<script src="https://www.paypalobjects.com/js/external/dg.js" type="text/javascript"></script>')
$('#hlogo').append('<form action="https://www.sandbox.paypal.com/webapps/adaptivepayment/flow/pay" target="PPDGFrame" class="standard"><label for="buy">Buy Now:</label><input type="image" id="submitBtn" value="Pay with PayPal" src="https://www.paypalobjects.com/en_US/i/btn/btn_paynowCC_LG.gif"><input id="type" type="hidden" name="expType" value="light"><input id="paykey" type="hidden" name="paykey" value="insert_pay_key">')
var embeddedPPFlow = new PAYPAL.apps.DGFlow({trigger: 'submitBtn'});
Теперь я не уверен, что я сделал что-то не так или нет, потому что я получил эту ошибку в последней части:
Expected 'none' or URL but found 'alpha('. Error in parsing value for 'filter'. Declaration dropped.
Но, во всяком случае, если вы демо-версию, вы могли бы просто сделать это, возможно, как план Б. (Вы могли бы также написать для этого скрипт пользователя, чтобы вам не приходилось открывать консоль, я полагаю?)