И у нас есть победитель, которому я сегодня отнесу приз. Поздравляем Bumbarashka!
Пара слов о проведении конкурса. Sergey Parashchenko был очень близок. Если бы он продолжил свой перебор еще на 4 варианта (с 292 до 296), то приз достался бы ему. Очень хорошо посчитал вначале Eugene Levchuk. Единственное, что он посчитал сам пост, но не посчитал Shoutbox и Фильмы1. Ну и цифры могли не сойтись на небольшие числа, так как два комментария были добавлены в другие ветки после начала конкурса.
Всем огромное спасибо за участие! Надеюсь, что вам понравилось.
Этого раздела больше нет
Пятница! Но не просто так какая-то пятница, а отличная пятница. А всё потому, что у меня есть дополнительный стимул праздновать и веселиться, ведь сегодня блогу исполняется 6 месяцев!
И чтобы счастье было общим, я объявляю небольшой, я бы даже сказал совсем маленький конкурс. Кто первым напишет мне, сколько комментариев было в блоге на момент написания этой заметки, тому достанется приз от полуименниника. Число я посчитал путем запроса к базе данных, поэтому оно может немного отличаться от фактического. Ну и вот скрин с запросом.
Когда число будет угадано, я заменю его нередактированной версией. Уже угадали.
Удачи!
UPD: Как мне сказали, подарок будет готов только завтра. У вас еще полно времени на угадывание. уже сегодня. Но время в любом случае не ограничено.
UPD2: К сожалению, я не сильно позаботился о безопасности, чем и воспользовались некоторые из участников. Пришлось применить «божественное вмешательство». Так что подарок еще не разыгран, и у вас есть все шансы.
UPD3: Приз был разыгран и будет доставлен вечером своему новому владельцу. Мои поздравления, Bumbarashka!
Как вы, должно быть, знаете, хранить пользовательские данные на клиентской стороне плохо: их ведь может подделать злостный хакер. Но сегодня я вам расскажу, как можно безопасно хранить сессионные данные, не волнуясь за их сохранность. Расскажу на примере Snap Framework, на котором и написан этот блог.
Суть метода — шифрование (кто бы мог подумать). Snap для своих сессий использует библиотеку Web.ClientSession, а поэтому что и как обрабатывается можно смело подсмотреть в документации:
- Шифруем данные куки с помощью AES в режиме CTR. Это позволяет хранить важные данные на стороне клиента, не беспокоясь о том, что их кто-нибудь украдет.
- Подписываем зашифрованные данные с помощью Skein-MAC-512-256. Кроме определения потенциальных ошибок в хранении и передачи данных (целостность), MAC предотвращает изменения данных и подтверждает, что они действительно были сгенерированны этим сервером (подлинность).
- Кодируем результат с помощью Base64, таким образом избавляемся от различных непечатных символов и отдаем браузеру простую строку.
Изучая всякие википедии о AES, я не особо понял, какие преимущества нам даст режим CTR в плане безопасности, но судя по описанию коммитов к библиотеке в этом режиме результат получается чуть более компактным и сам алгоритм чуть проще реализовывается. Про любой другой язык я могу сказать, что почти наверняка есть библиотека, которая уже реализует этот алгоритм за вас, так что сильно думать не придется.
Skein — это просто хороший алгоритм хеширования. К сожалению, он не победил в конкуре на замену SHA-2, и название SHA-3 получил другой алгоритм. Поэтому самое время заменить Skein на новоявленный SHA-3 — Keccak.
Ну и напоследок несколько мыслей. Во-первых, этот метод хранения несколько надежнее традиционных, т.к. никакой форс-мажор на сервере не позволит данным потеряться. А если что-нибудь произойдет со стороны клиента и кука исчезнет, то на сервере у нас не останется никаких мусорных данных об уже не существующей сессии. Во-вторых, таким образом не получится хранить большие объемы данных, т.к. размер куки ограничен, да и передача каждый раз пары десятков-сотен килобайт вполне может увеличить нагрузку на сервер. В-третьих, увести сессию можно точно так же, как и обыкновенную, поэтому увеличения безопасности тут не будет.
В общем, идея имеет право на жизнь. Особенно на небольших, как в моем случае, объемах хранимых данных. Лично я храню только одно поле: является ли текущий пользователь админом или нет.
Хозяйке на заметку: чтобы вашу сессию нельзя было увести с помощью JavaScript, добавьте в заголовок Set-Cookie
параметр HttpOnly
. Куки с таким параметром не появляются в document.cookie
.
Осталась одна загадка, связанная с моим сайтом. Кука _session
передается как сессионная и должна удаляться с закрытием браузера. Так и происходит в Opera, но не Google Chrome и Firefox. Может есть какая-то стандартизированная или неофициальная фича, которая не дает сессионным кукам удалиться?
Да-да, ваши глаза вас не подводят. Это именно надкушенное яблоко.
The Piano Guys выпустили, наверное, один из лучших своих каверов. Как обычно красивые пейзажи (и как они умудряются таскать с собой рояль?) и великолепная музыка. Если вы еще не видели их — самое время это сделать.