Ключ сеанса ASP.NET для безопасности веб-службы? - PullRequest
0 голосов
/ 05 августа 2011

У меня есть веб-сервис (ASP.NET 2.0), который я вызываю из javascript, используя jQuery's $.ajax(). Мне сказали, что сеансовый ключ часто используется как одноразовый номер в такой ситуации в целях безопасности; веб-служба принимает ключ в качестве одного из своих параметров и возвращает данные только в том случае, если он соответствует ключу текущего сеанса.

Я пытаюсь добиться этого, устанавливая значение скрытого поля для текущего SessionID на каждом Page_Load (т.е. каждый постбэк), а затем захватывая его в javascript для передачи в качестве параметра. Но он никогда не совпадает с текущим ключом веб-службы (Context.Session.SessionID).

Возможно ли это решить, или я должен делать это по-другому?

РЕДАКТИРОВАТЬ: код для установки сеанса в скрытом поле в соответствии с запросом.

hfSession.Value = Context.Session.SessionID;

Это в Page_Load элемента управления .ascx, без каких-либо условий (т. Е. Не заключено в if (!Page.IsPostBack).

Ответы [ 3 ]

2 голосов
/ 05 августа 2011

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

String GetCSRFToken()
{
    String token = (String)Session["CSRFToken"];
    if( token == null )
    {
        token = GenerateLongRandomString();
        Session["CSRFToken"] = token;
    }
    return token;
}

void AssertValidCSRFToken(String token)
{
    if( token != GetCSRFToken() )
    {
        throw new Exception("Invalid Request!")
    }
}

Вот ссылка на другой вопрос с дополнительной информацией о предотвращении такого рода атак:

Токен проверки CSRF: идентификатор сеанса безопасен?

2 голосов
/ 05 августа 2011

Asp.net фактически генерирует новый идентификатор сеанса для каждого запроса, пока вы не используете состояние сеанса для хранения какого-либо значения. Это может быть причиной того, что значения разные. Попробуйте сохранить что-нибудь в сессии. Может быть,

Session["SessionID"] = Context.Session.SessionID;
hfSession.Value = Context.Session.SessionID;
0 голосов
/ 05 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...