2013-08-01 3 views
13

Мне нужен метод хранения информации о клиенте, к которой можно получить доступ как с помощью SSL, так и с версии nonSSL моего сайта. localStorage - отличный механизм, но доступ к нему можно получить только по текущему протоколу.Share dom storage между http и https

Я хотел был бы иметь возможность хранить часть информации через javascript на части non-ssl (http) моего сайта и получить к нему доступ на участке SSL (https) моего сайта.

Кто-нибудь знает хороший способ обмена хранимой клиентской информацией между страницами ssl и non-ssl?

Я знаю, что всегда могу по умолчанию использовать файл cookie .. но я ненавижу идею отправки cookie туда и обратно для каждого отдельного запроса.

+2

Есть ли веская причина не просто SSL всего сайта? Это немного больше нагрузки, но решает проблему (и делает параноидальных людей счастливыми). – zebediah49

+0

не шутите правильно? Это была моя первая мысль, но власти считали, что должны быть две отдельные стороны сайта. Я снова спрошу ... – jeremysawesome

+2

К сожалению, «потому что управление» является веской причиной. Вы можете попробовать продать его на тему «дополнительная безопасность никогда не причиняйте вреда кому-либо» или что-то еще, но я полагаю, давайте найдем реальное решение. Было бы нецелесообразно дублировать хранилище DOM и использовать комбинацию cookie (с минимальными данными), AJAX и хеш-функцию, чтобы проверить, нужно ли обновлять хранилище DOM? – zebediah49

ответ

10

Составлено из комментариев, ведущих к этому вопросу; Я приветствую @jeremyisawesome редактировать в своих последних методов:


Кулак выбор: Использовать SSL, через все. Многие пользователи этого хотят, и это (за исключением несколько более высокого использования ресурсов) превосходный вариант почти во всех отношениях. Также это тривиальное решение.

К сожалению, «потому что управление» часто является веской причиной, и, хотя вы можете попробовать продать его на «лишней безопасности никогда не причиняйте вреда кому-либо» или что-то еще, было бы предпочтительным реальное решение.

Я предлагаю следующее: дублировать хранилище DOM и использовать комбинацию файлов cookie (с минимальными данными), AJAX и хеш-функции, чтобы проверить, нужно ли обновлять хранилище DOM.Точные детали реализации зависит от того, сколько у вас данных, как часто она меняется, и как часто пользователи перейти на другую сторону, но основная идея что-то вроде этого:

  1. сохранить данные в DOM, а также с его хэш.
  2. отправить хэш в cookie вместо полных данных.
  3. JS проверяет соответствие хэш-файла cookie и данных DOM.
  4. Если DOM определен как устаревший, используйте AJAX для получения новых данных для DOM и обновите его асинхронно.

Switching between HTTP and HTTPS pages with secure session-cookie - есть ряд уязвимостей, обсуждаемых с переключением, но там есть какой-то полезный материал.

+2

Это лучшее решение. Я решил использовать упомянутый хеш-метод. Я храню хэш в файле cookie и в хранилище DOM. Затем я проверяю, что хэш в файле cookie совпадает с хешем в хранилище DOM.Если они разные, я запрашиваю новую информацию с сервера с помощью AJAX. Это позволяет синхронизировать как SSL, так и не SSL-версии сайта без необходимости использования гигантского файла cookie или запроса AJAX для каждой загрузки одной страницы. – jeremysawesome

5

Это не технически возможно, так как http-схемы https считаются разными источниками, а также ограничениями контента для контента без содержания (теперь также в Firfox).

From the specs (Web Storage):

4.3.1 Безопасность

Агенты пользователей должны бросить исключение SecurityError всякий раз, когда какой-либо из членов объекта хранения первоначально возвращаемого LocalStorage атрибута, доступ к скриптами, эффективная подлинник сценария не то же, что и источник документа объекта Window, на который был получен доступ к атрибуту localStorage, .

Так что происхождение - позволяет смотреть на CORS (Cross-Origin Resource Sharing) which states:

... Происхождение состоит из [..] в схема, имя хоста и порт ,

And further:

HTTPS к HTTP не допускается.

+1

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

+0

@MarkKaplun, поэтому 99% людей имеют неисследованную жизнь. –

7

LocalStorage обмен/sessionStorage SSL/не SSL в производстве

То, как я сделал это использовать IFRAME, который делает PostMessage своему родителю. IFrame всегда находится на https, но родитель может быть либо http, либо https. Это решение предполагает, что модификации относятся к SSL только для хранения и синхронизируют его для не SSL, но вы можете адаптировать его для отправки изменений в обоих направлениях, чтобы родитель non ssl отправил изменения в ssl-child.

источник IFrame SSL (хранение-sync.html):

if (sessionStorage.cart) 
    try { 
    var obj = { cart: JSON.parse(sessionStorage.cart) }; 
    parent.postMessage(JSON.stringify(obj), 'http://yourdomain.com'); 
    } catch(ex) { 
    console.log(ex); 
    } 

SSL/не SSL родительская источник:

window.addEventListener('message', function(ev) { 
    if (ev.origin !== 'https://yourdomain.com') 
    return; 
    try { 
    var obj = JSON.parse(ev.data); 
    sessionStorage.cart = JSON.stringify(obj.cart); 
    cart.reload(); 
    } catch(ex) {}; 
}); 

$('body').append('<iframe style="display:none" src="https://yourdomain.com/storage-sync.html?r=' + Math.random() + '"></iframe>'); 

Размещение мишени происхождение правильных протоколов обеспечивает вас не будет отправлять сообщения неверным.

+0

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

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