2010-08-20 4 views
1

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

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")); 

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

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

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

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

EDIT

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

EDIT 2

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

EDIT 3

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

+0

Что вы делаете с HTML? – Quentin

+0

HTML-фрагменты в конечном итоге будут добавляться в другие веб-страницы. Настоящий рецепт катастрофы XSS, если мы не сделаем это безопасно! – user27478

+0

При каких условиях? Вероятно, это поможет нам понять проблему, если вы сделаете шаг назад и объясните, чего вы пытаетесь достичь, а не просто, как вы пытались ее достичь. – Quentin

ответ

1

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

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

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

или

  • Зашифровать/подписать HTML, прежде отправляется клиенту с использованием неизвестного им ключа, так что клиент не может его изменить
+0

Ваша вторая идея умна. Мне нужно подумать о том, как это может работать в нашей системе ... – user27478

1

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

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

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

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

+0

Почему люди все еще предлагают md5 для защищенных хэшей? – Borealid

+0

Потому что это то, к чему мы привыкли. Если это недостаточно безопасно для вас, используйте другое. –

+0

Это действительно очень неправильно понято. MD5 в этом случае прекрасен. Поскольку было продемонстрировано, что вы можете преднамеренно создать два документа с одним и тем же хэшем MD5, вы не должны доверять хэшам MD5 для проверки документов, которые вы сами не создали (авторы, возможно, создали две версии файла, одну хорошую и другое зло). Но если вы сами создали как строку, так и хэш, этот риск в основном равен нулю. Если вы используете достаточно соли, вы можете защищаться от радужных атак. И если вы включите временную метку и регулярно меняете соль, вы можете противостоять атакам грубой силы. – Andrew

Смежные вопросы