#javascript #json #html #eval #local-storage
#javascript #json #HTML #оценка #локальное хранилище
Вопрос:
Я нашел хорошую функцию «localStorage» в HTML5. Как я понял, это позволяет сохранять только строки, поэтому нам также нужно использовать eval() / JSON для сохранения объектов / функций.
Теперь я хочу знать, возможно ли сохранить строку, которая может быть удалена с помощью eval(), но не может быть прочитана.
Итак, я хочу использовать localStorage.setItem только один раз, полностью отключите localStorage.GetItem и замените его чем-то вроде «localStorage.evalItem».
Это был бы безопасный способ защиты от XSS / MITM (после сохранения функций).
Редактировать:
Подробности: идея заключалась в том, чтобы сохранить что-то похожее на:
function aes_encode(string) {
var salt='unique_salt';
// aes encoding...
return salty_encoded_string
}
в не (исходном) читаемом хосте хранилища на стороне посетителя.
И поскольку уникальная соль создается один раз для каждого посетителя, можно было бы проверить данные клиента.
Но, как сказали Джеймс и nwellcome (спасибо!), Избежать чтения источника невозможно.
Я не думаю, что понижение голосов является правильным или вопрос был настолько неясным ?!
Комментарии:
1. строка, которая может быть извлечена с помощью eval(), но не может быть прочитана — такой вещи не существует. Вы можете сделать его трудным для чтения, но никогда невозможным.
Ответ №1:
Как правило, чтобы предотвратить XSS, не доверяйте данным, поступающим от клиентов.
Это включает в себя все, что находится в локальном хранилище. localStorage не имеет флага HttpOnly, такого как cookies, чтобы сделать его недоступным для Javascript. Даже если бы это произошло, пользователь мог бы использовать инструмент отладки для его изменения. По этой причине я бы предостерег от использования eval()
во всем, что вы получаете от localStorage. Я рекомендую вам использовать JSON без eval для чтения объектов JSON и вообще не использовать его для функций. Вы должны быть в состоянии выполнить все, что сможете, поместив функции в localStorage, вместо этого используя соответствующее кэширование и автономные приложения.
Кроме того, как вы это описали
localStorage.evalItem(key).toSource() == localStorage.getItem(key);
Поэтому я не верю, что ваш подход может помешать кому-либо читать, если он может оценить.
Комментарии:
1. Я не буду доверять. Идея состояла в том, чтобы сохранить
function aes_encode(var salt='unique_string';return salty_encoded_string)
в недоступном для чтения (исходном) хранилище на стороне посетителя. И уникальная строка создается один раз для каждого посетителя, поэтому можно проверить данные клиента. Но, как вы сказали, невозможно избежать чтения источника. Облом!