2012-01-23 7 views
2

Просто интересно, требуется ли для хэширования PHPSESSID для всех форм или скриптов действий для защиты CSRF? Я понимаю, что это может быть получено, если пользователь находится в одной физической сети (firesheep). Пример:CSRF Защита: Хешинг PHPSESSID достаточно?

http://site.com/deleteMessage.php?mid=22&token=MD5ed_PHPSESSID

Игнорирование в той же сети Выдайте PHPSESSID:

1) Is known only to the user doing the action 
2) Can not be guessed by an attacker crafting a malicious img or request (<img src="http://site.com/deleteMessage.php?mid=22&token=I_DONT_KNOW_IT_:() 
3) Can not be pulled on the same site assuming no XSS vulnerabilities exist. 
4) Can easily be pulled by the legitimate user (Javascript fills the form or GET var in the link) 

Количество 3 беспокоит меня, хотя у меня нет каких-либо уязвимостей XSS, что я знаю, как я htmlentities ($ string, ENT_QUOTES) все, я не люблю полагаться на предположения. Является ли это достаточной защитой CSRF или есть лучший способ?

+0

Чтобы избежать таких нападений, как Firesheep, вы должны заставить HTTPS использовать все, для чего вы хотите пройти аутентифицированные сеансы. –

+0

@ Lèse majesté правда, но это не имеет никакого отношения к его вопросу. Возможно, вам стоит поговорить с stackoverflow об использовании https (или отсутствовать там). – rook

+0

@Rook: Это не ответ на вопрос (следовательно, почему я сделал комментарий), но он конкретно упоминает о потенциале Firesheep, который фиксирует его токен CSRF, если он используется в ненадежной сети. –

ответ

1

Нет, вы должны использовать токен, не зависящий от идентификатора сеанса. Просто подумайте о случае, когда атакующий сайт может каким-то образом получить идентификатор сеанса жертвы (см. session fixation и session hijacking), но не может использовать сам сеанс из-за некоторых дополнительных мер защиты сеанса. Тогда все еще можно будет подделать аутентичные запросы, поскольку токен может быть получен из известного идентификатора сеанса.

Просто используйте случайный токен, как говорят все.

+3

Если у злоумышленника есть идентификатор сеанса, у него есть ключи от королевства. Ему не нужно прибегать к CSRF, потому что у него что-то намного лучше. Он может загружать страницу и читать токен CSRF прямо из формы или просто отправить форму в свой браузер. Курица или яйцо. – rook

+0

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

+0

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

0

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

+1

Вы должны менять его каждый раз. Особенно, если ваши страницы не доставляются SSL. (что они должны быть!) – DampeS8N

+2

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

+0

@blowdart: Почему использование одноразовых токенов ломает вкладку? Если вы отслеживаете более одного токена, вы все равно можете сделать их одноразовыми и не мешать нескольким вкладкам. –

1

Простейший способ защиты от CSRF состоит в том, чтобы добавить случайный хэш к сеансу всякий раз, когда вы загружаете страницу с формой, которую вы хотите защитить. Добавьте это значение в форму, чтобы, когда пользователь отправляет его, он приходит для поездки. Совместите его со значением сеанса на другом конце.

Восстановите это случайное значение каждый раз, когда отображается форма.

Это работает, потому что, если пользователь уходит и возвращается, переходит в новую форму, независимо от того, форма всегда будет соответствовать последнему созданному значению, которое в свою очередь будет тем же, что вы проверяете.

Что вы предлагаете, может помочь, но по-прежнему уязвимы в том, как вы упомянули. Зачем допускать любую уязвимость?

+0

Пользователь в той же сети всегда может перехватывать случайное значение, хотя и сеанс.Off network XSS на странице сможет захватить случайное значение из формы и отправить его. Я что-то упускаю? – user974896

+0

Вот почему вы меняете его каждый раз, когда пользователь загружает форму. Воровать сеанс можно с помощью SSL (https), который вы должны делать. Правило с безопасностью заключается в том, чтобы сделать его как можно более сложным, даже если одна защита нарушена, не отказывайтесь от всей игры. – DampeS8N

+0

При создании своего случайного токена, в случае использования md5() (и не только), добавьте в него немного соли. – Ronan

3

Если злоумышленник знает идентификатор сеанса, ему не нужно использовать CSRF для воздействия на сеанс жертвы. Его плохая практика использования идентификатора hashed session, но это не уязвимость. Вы даже можете использовать идентификатор сеанса, а его технически не уязвимый для CSRF. Но это увеличивает вероятность отказа и предотвращает этот отказ. Другой криптографический nonce легко сгенерирован.

XSS прерывает каждый способ защиты на CSRF prevention cheat sheet, за исключением использования capthca. При этом вы должны защитить свой идентификатор сеанса от XSS, используя флаг HTTP_Only cookie.

Имейте в виду, что флаг HTTP_only НЕ ПРЕДУСМОТРЕТ XSS!, это просто усложняет эксплуатацию. Часто злоумышленник прибегает к использованию XHR для чтения токена CSRF для «езды» на сеансе, а не для захвата идентификатора сеанса.

+1

Если это не уязвимость, то почему вы считаете, что использование хэшей сессии ID плохой практике? –

+2

@ Lèse majesté посмотреть на комментарии gumbo. Это может подорвать другие экзотические системы безопасности. Кроме того, другая криптографическая версия nonce бесплатна. – rook

+0

@Rook: я не понимаю, как хэшированный CSRF может увеличить вероятность сбоя (если использовать криптографически безопасный хеш). Не могли бы вы подробнее рассказать? Все сценарии атаки, о которых я могу думать, позволяют избежать защиты CSRF, если злоумышленник способен захватить сеанс. –

1

Согласно Robust Defenses for Cross-Site Request Forgery by Barth, Jackson and Mitchell, кажется, что HMAC идентификатора сеанса является лучшим общим решением.

В соответствии с этим документом независимое от сеанса значение, которое не совпадает с идентификатором сеанса в хранилище состояний сервера, уязвимо к активным сетевым атакам даже при использовании TLS/SSL/HTTPS. HMAC идентификатора сеанса не имеет такой же уязвимости. Независимо от сеанса nonce, все равно, если вы сопоставляете nonce с идентификатором сеанса на сервере, а не с математическими параметрами POST с заголовком Cookie.

+0

hmac значительно лучше, чем прямой хэш, но я все равно буду использовать/dev/urandom, потому что hmac может быть принудительно отключен. – rook

+0

@Rook: вы действительно утверждаете, что грубая форсировка HMAC-SHA1 (при условии, что ключ имеет по крайней мере 128 бит энтропии) является реальной угрозой? –