CG ([info]cgvictor) wrote,
@ 2008-10-27 20:31:00
Previous Entry  Add to memories!  Tell a Friend  Next Entry
Entry tags:development, ifyoudontknow

10 web security don't
Чего нельзя делать в системе безопасности онлайн-ресурса

10. Нельзя: доверять сторонним системам авторизации как своей собственной (родной для сервиса). OpenID, LiveID – лесом; исключение только если пользователь сознательно закрепил соответствие профилей и доверяет обоим;

9. Нельзя: разрешать для public менять собственный пароль без ввода предыдущего – даже с валидной сессией. Существует N+1 способов подменить сессию, особенно если они раздаются кому попало;

8. Нельзя: делать сессию неустаревающей. Нет, ну если у вас кейс требует таймаута в операциях в неделю – тогда пожалуйста; в остальных случаях это очередная дырень;

7. Нельзя: сознательно укорачивать длину пароля. Ну какая тебе разница, 16 у меня символов пароль, или 25? Особенно актуально с использованием аппаратных кей-генераторов.

6. Нельзя: выдавать пароли обратно в html-форму при «подтверждении данных». Звездочки – звездочками, а ничего, что он в коде открытый лежит?

5. Нельзя: ставить требования к «контрольному вопросу» ниже, чем к паролям; и особенно - подсказывать вопросы из общеизвестных данных. 95% юзеров туда «4 цифры ИНН» и вобьют;

4. Нельзя: генерить ссылки с ID сессии. Всё, хватит, это было актуально 10 лет назад;

3. Нельзя: удалять профиль пользователя с освобождением его маркера в системе. Не только из требований целостности данных, но и с точки зрения технической/социальной подмены маркера в задачах безопасности;

2. Нельзя: по запуску «вспоминалки пароля» без вопросов заменять хранимые данные случайными. Элементарно заблокировать аккаунт, раз в 5 минут дергая «вспоминалку»;

1. Нельзя: нельзя, я сказал! хранить пароли с обратимым шифрованием. Равно как и с хешем без вставки (salt) – кто ломал, меня поймет. Уже 10 лет про это и говорено, и написано, и хоть бы хрен..


Пусть это послужит референс-листом.



(8 comments) - (Post a new comment)


[info]korchasa
2008-10-27 06:04 pm UTC (link)
8. Почему? Совпадение SID'ов?
7. символов много. Лучше словарь увеличивать, чем длину пароля. Всякие js-проверки защищенности бибикающие пользователю, что год рождения - не лучший пароль.
6. А если https? Кого боимся?
1. да и вообще соль лучше динамической делать

А еще нельзя авторизацию без https, в наш век беспроводных технологий. Ну или хотя бы пусть пользователь выбирает.

2 и 9 удобно объединяются в "нельзя ничего существенного менять у пользователя, без валидации через email + пароль"

(Reply to this) (Thread)


[info]cgvictor
2008-10-27 06:26 pm UTC (link)
Почему? Совпадение SID'ов?
Не, всё проще: чем больше время ее жизни, тем выше вероятность ее успешного сниффа.

символов много
Ну вот у меня на хост - 25, и я их вбиваю из головы. Остальные похожие.
Стоимость хранения этих самых доп.символов - исчезающе мала, так откуда эти ограничения? А встречаются еще довольно часто.
Про проверки на очевидные - да, верно.

А если https
А даже если и https. Во-первых, это всякие шпиёны клиентской стороны; во-вторых - а куда этот https брошен? (IIS SSL proxy); в третьих - просто хорошая практика.

соль лучше динамической делать
При обновлении исходных данных (пароля) - да, несомненно

авторизацию без https
У https пока бывают глюки, в т.ч. с мобильными устройствами.
На мой взгляд, лучше целиком дублировать доступность сервисов (http/https), чтобы для юзера взамодействие отличалось только буковкой в урле.

без валидации через email + пароль
Ну, наверное, все-таки только для самого аккаунта и бизнес-критичных данных (платежных, например), а то избыточно получается.

2 и 9
А при чем здесь 2? Вспоминалка работает же без пароля/мыла.
Есть на этот счет удачная схема с хранением двух паролей, но о ней многие забывают...

(Reply to this) (Parent)(Thread)


[info]korchasa
2008-10-27 11:15 pm UTC (link)
>>А если https
>А даже если и https. Во-первых, это всякие шпиёны клиентской стороны; во-вторых - а куда этот https брошен? (IIS SSL >proxy); в третьих - просто хорошая практика.
Четсно говоря не очень понял, как в этих двух случаях поможет то, что я не отправлю поле назад. Шпиен и прокся (подмененная и злая) могут снять данные еще в момент отправки запроса, до получения ответа.

>>без валидации через email + пароль
>Ну, наверное, все-таки только для самого аккаунта и бизнес-критичных данных (платежных, например), а то избыточно >получается.
Ну да, не день рождения менять. "Угон" аккаунта это тоже критичные данные.

>>2 и 9
>А при чем здесь 2? Вспоминалка работает же без пароля/мыла.
Ну про это я говорил. Нормальный способ - пользователь тыкает в напоминалку. На мыло ему отправляется уникальная ссылка. Пользователь переходит по ссылке и вводит новый пароль. Ну и, конечно, ссылка должна быть разной, даже для одного пользователя (например, включить туда старый пароль).

>Есть на этот счет удачная схема с хранением двух паролей, но о ней многие забывают...
Тяжело забыть то, о чем не знаешь. Пали схему :)

(Reply to this) (Parent)(Thread)


[info]cgvictor
2008-10-28 05:19 am UTC (link)
>>могут снять данные еще в момент отправки запроса
Не-а. На снифферы ввода с консоли, например, легко возбуждаются всякие антивирусы. А на какой-нибудь плагинчик/bho/js, который распарсит исходник и что-то куда-то коннектом легонько скинет - нет, всё спокойно будет.
А "проксю" - я имею в виду ssl-gate на iis, когда в интранете этого самого https по сути уже и нет. Есть у него такой вариант работы.

>>например, включить туда старый пароль
Эээ?

>>Пали схему
Да всё просто, на самом-то деле.
- в системе хранится, помимо хеша основного пароля и его salt, некоторое дополнительное значение, инициализированное null;
- когда отрабатывает вспоминалка, доп.значение получает хеш от некоего random, а значение random отправляется на мыло. Это - новый пароль. Salt у хешей общий;
- когда юзер вводит учетные данные, проверяем не только совпадение hash1, но и hash2. Если совпадает hash2 - то пишем его на место hash1, второй обнуляем, все счастливы.
- ну а пока hash2 не востребован (например, законный владелец о нем и не знает) - всё ок и никто не страдает.
* по уму - еще нужно время expire для hash2

(Reply to this) (Parent)


[info]rikku_grey
2008-10-28 03:52 am UTC (link)
8,4,1 поясни плизз) не догнал)

(Reply to this) (Thread)


[info]cgvictor
2008-10-28 05:26 am UTC (link)
8. Сессия авторизации (ее маркер) обязана иметь конечное и "не затянутое" время устаревания. В практическом смысле - это время, пока сервис считает пользователя залогиненным. Особенно временем устаревания грешат всякие сервисы, на которых через джопу сделан механизм поддержания контекста (или не сделан вообще: отвалилась сессия - потерялись данные..)

4. ID сессии в ссылке - решение, которое 10 лет назад заменяло отключенные cookies. Переданная ссылка с SID, соответственно, дает возможность имперсонироваться под юзером, который эту ссылку скопипастил. Вроде бы уже давно можно убить такую логику за ненадобностью - ан нет, 2 мес назад ящики на mail.ru по этому поводу опять кто-то жостко имел...

1. Ну классика же ж. Только хеширование, только со вставками (salt), только с уникальными...

(Reply to this) (Parent)


[info]dotcypress
2008-10-28 06:02 am UTC (link)
Насчёт первого пункта: я искренне удивляюсь, когда "вспоминалка" присылает мне мой пароль, а не предлагает новый? Они там что, научились хеши в обратную сторону считать что ли :)
И насчёт соли тоже правильно, сейчас только у ленивого нет базы тех же MD5 хешей распространённых паролей :)

(Reply to this) (Thread)


[info]cgvictor
2008-10-28 06:07 am UTC (link)
>>присылает мне мой пароль
Вот-вот. Только я вот уже не удивляюсь - просто хочется убивать по-тихому.

(Reply to this) (Parent)


(8 comments) - (Post a new comment)

Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…