Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.03.2018, 13:54
Аватар для brizing
Интересующийся
Отправить личное сообщение для brizing Посмотреть профиль Найти все сообщения от brizing
 
Регистрация: 08.02.2014
Сообщений: 23

Отключить History API
На беке проверяется реферер, который указан в ajax запросе.
На фронте посетители могут исполнять JS.
Я заметил, что на фронте можно сделать history.pushState() и обратиться к серверу с нужным реферером.

Я знаю, что на этой странице History никогда не понадобится.

History = function() {};
history.__proto__.pushState = function() {};
history.__proto__.replaceState = function() {};
history.__proto__.back = function() {};
history.__proto__.forward = function() {};
history.__proto__.go = function() {};


После этого кода History API восстановить не получится?
Ответить с цитированием
  #2 (permalink)  
Старый 30.03.2018, 16:10
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

Клиенту доверять нельзя. Если у сторонних скриптов есть доступ к вашему домену - вам можно только смириться.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 30.03.2018, 19:26
Аватар для brizing
Интересующийся
Отправить личное сообщение для brizing Посмотреть профиль Найти все сообщения от brizing
 
Регистрация: 08.02.2014
Сообщений: 23

Aetae, тема не посвящена защите от XSS Но я пока уверен, что мы нашли защиту от любого способа атаки.
А входные данные очень простые:
1) есть страница /project/123, вы можете разместить на ней скрипт.
2) есть страница /account, с этой страницы админ может выполнить запрос по адресу /del с параметром {id: 123}
Вопрос: что сделает ваш скрипт, чтобы я (админ) при посещении страницы /project/123 случайно её удалил?

Сабж актуален. History API можно восстановить?
Ответить с цитированием
  #4 (permalink)  
Старый 30.03.2018, 21:11
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

document.body.append( document.createElement('iframe') );
history.__proto__.pushState = window.frames[0].history.pushState;
Ответить с цитированием
  #5 (permalink)  
Старый 30.03.2018, 22:07
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

Вариантов куча на самом деле. Под чужие скрипты - только заводить отдельный домен.
__________________
29375, 35
Ответить с цитированием
  #6 (permalink)  
Старый 31.03.2018, 03:01
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

Вообще, стандартная защита - сессионные токены: https://learn.javascript.ru/csrf
А свои велосипеды лучше не изобретать если не являешься эскпертом в данной области.
Ответить с цитированием
  #7 (permalink)  
Старый 31.03.2018, 09:55
Аватар для brizing
Интересующийся
Отправить личное сообщение для brizing Посмотреть профиль Найти все сообщения от brizing
 
Регистрация: 08.02.2014
Сообщений: 23

Белый шум, сессионный токен есть на другой странице.
Но с помощью JS можно получить код другой страницы и спарсить хеш

Против этого сервер отфутболивает все запросы, которые приходят от страницы с пользовательским скриптом.
Судя по всему, есть только один способ подменить referer в запросах.

Против вашего кода я попробовал сделать так:
function overrideContentAccess(iface) {

    var contentWindowDescriptor = Object.getOwnPropertyDescriptor(iface.prototype, "contentWindow");

    // По-видимому, в HTMLObjectElement.prototype.contentWindow не существует
    // в более ранних версиях Chrome, таких как 42.
    if (!contentWindowDescriptor) {
        return;
    }

    var getContentWindow = Function.prototype.call.bind(contentWindowDescriptor.get);

    contentWindowDescriptor.get = function () {
        return false;
    };

    Object.defineProperty(iface.prototype, "contentWindow", contentWindowDescriptor);
}

var interfaces = [HTMLFrameElement, HTMLIFrameElement, HTMLObjectElement];
for (var i = 0; i < interfaces.length; i++) {
    overrideContentAccess(interfaces[i]);
}

var iframe = document.createElement('iframe');
document.body.append( iframe );
console.log('iframeWindow:', iframe.contentWindow);


Но frames[0] по прежнему возвращает объект.
Ответить с цитированием
  #8 (permalink)  
Старый 31.03.2018, 10:39
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

brizing,
Это как можно спарсить код другой вкладки? Пример покажите, а то я не в курсах.
Ответить с цитированием
  #9 (permalink)  
Старый 31.03.2018, 10:47
Аватар для brizing
Интересующийся
Отправить личное сообщение для brizing Посмотреть профиль Найти все сообщения от brizing
 
Регистрация: 08.02.2014
Сообщений: 23

Белый шум,
$.get('/account', function(data) {
  console.log(data);
});
Ответить с цитированием
  #10 (permalink)  
Старый 31.03.2018, 10:48
Аватар для brizing
Интересующийся
Отправить личное сообщение для brizing Посмотреть профиль Найти все сообщения от brizing
 
Регистрация: 08.02.2014
Сообщений: 23

Я же не о вкладке говорю.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
XMLHttpRec + History API Ариан AJAX и COMET 0 12.12.2016 14:17
Посоветуйте как улучшить код для работы с history api [ jquery + js + history api ] Geo Ваши сайты и скрипты 0 12.01.2014 00:41
Проблемы с пониманием History API Flaker AJAX и COMET 5 06.02.2013 15:28
History API. Помогите решить проблему InviS Events/DOM/Window 2 16.10.2011 14:34
Фиксирование событий History API Bebarr Swallow Events/DOM/Window 1 20.06.2011 01:49