Головоломка безопасности JavaScript с XSS - PullRequest
1 голос
/ 20 августа 2010

Я работаю над реализацией веб-ошибки 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-код для их страницы.

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

EDIT

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 20 августа 2010

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

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

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

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

1 голос
/ 20 августа 2010

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

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

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

или

  • Зашифровать / подписать HTML-код перед его отправкой клиенту с использованием неизвестного ему ключа, чтобы клиентне может изменить его
...