XSS для изменения состояния сеанса ASP.NET - PullRequest
1 голос
/ 16 июня 2010

Я занимаюсь разработкой приложения, в котором текущий пользователь и роль пользователя хранятся в состоянии сеанса (System.Web.SessionState.HttpSessionState Page.Session).

        if (Session["username"] == null)
            Session.Add("username", User.Identity.Name);

        if (Session["isAdministrator"] == null)
            Session.Add("isAdministrator", User.IsInRole(domain + "\\Domain Admins"));

После того, как я проверил эти состояния сеанса в коде позади для предоставления разрешений на некоторое исключение:

    if ((bool)Session["isAdministrator"] || computer.Administrators.Contains(Session["username"].ToString()))

Мой вопрос следующий: насколько безопасен этот механизм? Можно ли изменить состояния сеанса, используя, например, какой-нибудь JavaScript или еще как?

Спасибо:)

Ответы [ 3 ]

2 голосов
/ 16 июня 2010

Если установлено User.Identity.Name, зачем вам его помещать в Session?Почему бы вам просто не позвонить User.IsInRole(domain + "\\Domain Admins") напрямую (или обернуть его помощником)?Мне кажется, что вы используете проверку подлинности Windows, поэтому установка имени пользователя в сеансе избыточна.

Что касается вашего вопроса XSS, то сеанс хранит идентификатор сеанса в файле cookie, поэтому теоретически злоумышленник можетперехватывать HTTP-трафик или вводить код JavaScript на свои страницы, взять cookie, а затем использовать его и выдавать себя за другого пользователя.

1 голос
/ 16 июня 2010

Невозможно изменить состояние сеанса , используя javascript или другие механизмы на стороне клиента, поскольку состояние сохраняется только на сервере.Однако, как указывали другие, злоумышленник может захватить сеанс, получив содержимое cookie сеанса.

ASP.NET разработан с учетом этой слабости: идентификатор сессии достаточно длинный и его трудно предсказать.Кроме того, cookie-файл сеанса помечается как ТОЛЬКО HTTP, что означает, что большинство современных браузеров не разрешают доступ к нему через JavaScript-код.

0 голосов
/ 16 июня 2010

В целом, я бы сказал, что это очень безопасно от атак XSS.ASP.Net по умолчанию отслеживает сеанс пользователя на основе файла cookie, который содержит идентификатор сеанса пользователя.Вы можете увидеть это, если откроете список файлов cookie вашего браузера и поищите их на своем сайте, там будет файл с именем ASP.Net Session что-то ... SessionID уникальный, а не инкрементный.Вероятно, некоторая разница в GUID.

Для дополнительной безопасности вы также можете указать в своем файле web.config, как долго поддерживать сеанс пользователя.Если вы имеете дело с конфиденциальной информацией, вы можете установить относительно короткий промежуток времени, например, 10 минут бездействия, по умолчанию это 20 минут.Вы можете найти больше информации @ http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.timeout.aspx.

<system.web>
    <sessionState timeout="10" />
</system.web>

- Питер

...