Новый CSRF на Яндексе

kruglov

Новичок
Это не безопасность аякса, это яндексоиды додумались выдавать .js с личными данными в зависимости от кук.
 

Фанат

oncle terrible
Команда форума
Ага, я тоже до этого допер только что.
Я правильно понимаю, что если бы там был XML, то XMLHTTPRequest не запросил бы его с чужого сервера, а яваскрипт не понял бы его?

кстати, в этом свете выходит, что Котеровский JsHttpRequest тоже дыряв?
 

kruglov

Новичок
Я правильно понимаю, что если бы там был XML, то XMLHTTPRequest не запросил бы его с чужого сервера, а яваскрипт не понял бы его?
Если бы там было что-то, загружаемое не через <script src="">, оно не загрузилось бы, да.

Я не пользовался котеровским скриптом, а что, он в себя js грузит?
 

Фанат

oncle terrible
Команда форума
он, собственно, и основан, если я ничего не путаю, на динамической подмене script src
 

kruglov

Новичок
Ммм, не думаю, вроде как там функциональность обычного "аякса" с кроссдревнебраузерностью и добавленными подпорками в лице загрузки файлов (input type=file) через ифреймы.

-~{}~ 21.09.08 17:20:

p.s. Но вообще, достаточно иметь в виду, что персонализированные javascript отдавать нельзя.
 
Объект XMLHTTPRequest может обмениваться данными только в пределах одного домена, как и iframe.

Тем не менее, внешние скрипты (подключенные через <script>) подчиняются другим правилам и могут быть загружены и выполнены с любого домена.

Так что сам по себе AJAX абсолютно безопасен, когда передача данных идем методами объекта XMLHTTPRequest. А в реализации Котерова (в серверной части) вполне можеть быть "дыра", когда эмулируется работа XHR через динамическое подключения скрипта.

Только сейчас это практически не актуально, ведь XHR поддерживается абсолютным большинством браузеров. А <script> используют только для кросс-доменной передачи данных, где должна быть предусмотрена безопасность передачи, чего, видимо, не сделали на Яндексе.
 

Фанат

oncle terrible
Команда форума
Её невозможно предусмотреть
получается, что Json можно использовать только для данных, не требубщих защиты.
 

phprus

Moderator
Команда форума
*****
он, собственно, и основан, если я ничего не путаю, на динамической подмене script src
Не путаешь. Для старых браузеров и кросдоменных запросов используется подмена script src, для загрузки файлов используется input type=file, а в остальных случаях XMLHTTPRequest.

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

Фанат

oncle terrible
Команда форума
То есть, в данном случае яндекс отдает не джейсон, а чистый яваскрипт? Я просто не очень знаком с клиентскими технологиями.
 
*****
Да, он передает ответ в виде верного JavaScript, а не JSON. Т.е. ответ примерно следующий:
PHP:
var someVar = {"property":"value"};
Следовательно, someVar становится доступен на странице. Если бы ответ был просто JSON:
PHP:
{"property":"value"};
То подключив такой скрипт через <script> - ничего бы невозможно было бы узнать.

Другой вопрос в том, что JSON используется для передачи данных объектом XHR, потому что в случае с <script> он становится бесполезен (по причине, описанной выше).
 

fixxxer

К.О.
Партнер клуба
по хорошему это "топик про реферер" вид сбоку, методы защиты те же (только проблема асинхронности более вероятная)

>>Если бы ответ был просто JSON:{"property":"value"};
То подключив такой скрипт через <script> - ничего бы невозможно было бы узнать.

а, точно.
ну лоханулись они, да :)
 

fixxxer

К.О.
Партнер клуба
да, тут же получается что при аудите бехопасности ajax-решений надо учесть все возмозжные баги в защите доступа к "чужому" js/DOM в браузерах.

был, например, способ "умышленного" обхода таких ограничений через буферный iframe с пустым src, но тут обе стороны должны хотеть такого обхода :)
 

Фанат

oncle terrible
Команда форума
Да, но ведь не обязательно обращаться через <script>
можно ведь обратиться через старый механизм отправки формы... но тогда мы никак не получим доступ к тексту ответа... так?
 

phprus

Moderator
Команда форума
*****
можно ведь обратиться через старый механизм отправки формы... но тогда мы никак не получим доступ к тексту ответа... так?
Если использовать iframe, то данные между доменами можно передавать используя #якорь в урле, так как браузеры позволят его поменять даже если iframe загружен с другого домена. Подробнее этот метод описан здесь - http://javascript.ru/ajax/cross-domain-scripting
 
Сверху