Безопасность JavaScript пазл с XSS

Я работаю над реализацией веб-ошибки JavaScript, которая будет вставлена ​​в веб-страницы нашего клиента. Одна из возможностей, которую хотели бы видеть наши клиенты, - это способ передачи фрагментов HTML на своих веб-страницах на наш сервер через веб-баг. Мы используем JSONP, и сервер, на котором размещена веб-ошибка JavaScript, отличается от сервера, на котором размещена страница we. Основная идея заключается в следующем:

var element = document.getElementById(id);
var html = element.innerHTML;
//Encodes HTML into GET request www.example.com/script?html=encodedhtml
var url = getSrcUrl(html); 
document.write(unescape("%3Cscript src='" + url + "' type='text/javascript'%3E%3C/script%3E"));

Проблема безопасности заключается в том, что любой может отправить запрос на наш сервер с произвольным HTML-кодом, который не принадлежит веб-странице, на которой размещена веб-ошибка. Есть ли способ сделать это безопасным?

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

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

Спасибо за любую помощь!

РЕДАКТИРОВАТЬ

Чтобы быть понятным , наш клиент' Веб-страницы публикуются без защиты. Другими словами, любой пользователь Интернета может посетить страницу и выполнить ошибку JavaScript, которая передает фрагмент HTML.

РЕДАКТИРОВАТЬ 2

Приемлемый ответ: «это невозможно»! Если это так, и вы даете хорошее объяснение, почему, я выберу его в качестве принятого ответа.

РЕДАКТИРОВАТЬ 3

То, что мы создаем, является своего рода системой Google Analytics для наших клиентов. Мы пытаемся отследить посещения уникальных «предметов» каждым посетителем, а затем автоматически собираем информацию об этом предмете с помощью фрагмента HTML. Затем мы вставим информацию об элементе на другие страницы, вставив фрагмент HTML, который мы собрали из исходного элемента. Мы пытаемся сделать все это, не требуя от наших клиентов установки чего-либо на свои серверы и просто включив веб-ошибку JavaScript в их HTML.

1
задан Widor 21 December 2011 в 17:34
поделиться

2 ответа

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

Единственные способы сделать это безопасно:

  • Как вы предлагаете, получить соответствующую страницу на стороне сервера

или

  • Зашифровать / подписать HTML, прежде чем он перейдет к клиенту, используя ключ, неизвестный их, чтобы клиент не мог их изменить
1
ответ дан 2 September 2019 в 21:58
поделиться

Предполагая, что вы можете настроить клиентский веб-сервер для md5 чего-нибудь за вас, это кажется хорошим местом для использования хешированной md5-подписи. По сути, клиентский сервер определяет, какую информацию он хотел бы отправить вам, объединяет все это в строку, объединяет ее с секретным ключом, а затем md5 целиком и передает результат вместе со всеми остальными входными данными.

На вашем сервере вы берете все входные данные, кроме этой подписи, объединяете их вместе, объединяете с ним секретный ключ и md5 его. Если он соответствует подписи, вы знаете, что это действительный ввод.

К сожалению, похоже, что вы определяете HTML для отправки на стороне клиента (браузера). Из-за того, что JavaScript хорошо виден для всех, вы не можете использовать секретную строку.

Итак, если нет возможности перенести такую ​​обработку на серверную часть, я думаю, вам не повезло.

1
ответ дан 2 September 2019 в 21:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: