- PVSM.RU - https://www.pvsm.ru -

Почему не нужно использовать RJS

У jQuery есть встроенная фича — если сервер ответит с content-type=text/javascript библиотека выполнит ответ автоматически.

jQuery.ajaxSetup({
	accepts: {
		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
	},
	contents: {
		script: /(?:java|ecma)script/
	},
	converters: {
		"text script": function( text ) {
			jQuery.globalEval( text );
			return text;
		}
	}
}); 

Поэтому в рельсах довольно распространена тактика «ответь строчкой Javascriptа вместо правильного JSON, который придется обрабатывать».

Т.е. ответ от index.js.erb может выглядить так:


$('#content').html('Hello, id123123')

image

А вот тут такая проблема — если я на стороннем сервере вставлю script-тэг с src="/profile.js" то этот запрос вернет валидный джаваскрипт, который выполнится в контексте моей страницы. Чтобы украсть данные достаточно только переобъявить функцию $={html:function(data){ LEAK(data) }};

Баг присутствовал например на Gitlab, Basecamp, Redmine, Spree, Diaspora. Он мог слить полную форму, которая в свою очередь хранит input type=hidden name=authenticity_token (csrf_token юзера).

Этот баг по сути перевоплощение JSONP-слития, только менее очевидный для девелоперов.

Автор: Chikey

Источник [1]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/rails/53103

Ссылки в тексте:

[1] Источник: http://habrahabr.ru/post/209618/