4

私の Web サイトは ASP.NET のフォーム認証を使用しており、認証チケット/Cookie の UserData 部分にユーザー固有の情報を挿入しています。UserData は認証チケット内にあるため、そのように暗号化されます

authCookie.Value = FormsAuthentication.Encrypt(newTicket);

データは暗号化されているため、この時点でデータが危険にさらされる心配はありません。しかし、データがこのように暗号化されていない形式で利用できることに気付きました

FormsIdentity fid = User.Identity as FormsIdentity;
string plainTextUserData = fid.Ticket.UserData;

データ自体はそれほど重要ではありません。他人に見られても大丈夫。しかし、人々がこの情報を乗っ取って自分のものとして使い始めることを許すことはできません。たとえば、あるユーザーが別のユーザーになりすましてログインすることは望ましくありません (UserData に含まれるユーザー ID に基づく)

これは私が心配しなければならないことですか?

編集1:

これを行う理由は、セッションの使用を停止し、Cookie と Ticket.UserData のみを使用できるようにするためです。

編集2:

Ticket.UserData のデータは変更されていません。ユーザーがログインすると一定になります。

4

3 に答える 3

5

ユーザーの行動に応じて、特定のページでより多くのデータが必要です。現在、セッションを使用していますが、すべてをCookieに移動したいと思います。それは多くのデータではないので、私はすべてを認証チケット/クッキーに便乗させることができると思いました

@Portmanへの称賛に基づく@jorsh1、Ticket.UserDataは、変化するデータを保存する場所ではありません。あるページから別のページに移動するときに、認証チケットを常に再作成する必要はありません。

セッションサービスまたはSQLServerでセッションデータを使用します。セッション中のデータが不要で、データが小さく機密性が低い場合は、Cookieを使用してください。(*)

UserDataを使用したMSの標準的な例は、ロールのリストなどを保存して、「このユーザーは管理者だと思いますか」などと言うことができるようにすることですが、管理者ロールのようなものであれば、データベースにアクセスして確認することになるでしょう。 Cookieの内容を暗黙的に信頼する前に。

文字列plainTextUserData=fid.Ticket.UserData;

これは、Asp.Netが既にチケットを復号化しているため、アプリ内でのみ機能します。ただし、データIIRCを設定する場合は、フォーム認証Cookieを再作成して再添付する必要があります。

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
    currentTicket.Version + 1,
    currentUser.UserName,
    now,
    now.Add(formsAuthentication.Timeout),
    false,
    "new user data string",
    FormsAuthentication.FormsCookiePath);

string hash = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(
    FormsAuthentication.FormsCookieName,
    hash);

Response.Cookies.Add(cookie);

別のアプリは、復号化キーを認識していないか、ブルートフォース攻撃を受けていない限り、このチケットをデコードできません。アプリの負荷分散を行ったり、Webガーデンを使用したりする場合は、キーの同期を維持する必要もあります。

*私はセッションで物事を保存することを支持していません。通常、そのデータを永続化する別の方法があります。


[編集]私がセッションを使用する目的:

私がよく行う唯一のことは、セッションサーバーベースのセッションにユーザーの重要なデータのライトバージョンを保存することです。ただし、透過的に読み込まれるようにし、チケットの内容を複製しないように注意してください。

そうすれば、Cookieに機密性の高いものを公開したり、セッションに依存したりすることはありません。また、積極的なセッション再生を設定しました。セッションに保存されている少量のデータと組み合わせると、セッションで問題が発生することはありません。また、セッションの内容を認識しているコードは1つだけなので、簡単にリファクタリングできます。

それ以外の場合、セッションは悪です。ビューステートを必要とするページ内に維持するか、データベースに一時的な状態を保持することを好みます。

于 2009-02-19T02:03:53.167 に答える
2

認証チケットと同じくらい安全です。まったく同じ目的で使用しているので、気にしないでください。

于 2009-02-19T01:18:38.953 に答える
1

おそらく心配する必要はありません。

データが機密性の高いものである場合(たとえば、米国の社会保障番号)、悪意のあるユーザーは常に新しい攻撃を引き起こしているため、暗号化されていても、FormsAuthチケットと一緒に送信することは避けてください。

ただし、質問する必要があります。各チケット(ユーザー名)に識別子を格納する必要があるので、他のすべてのデータをデータベースに保持しないのはなぜですか?

于 2009-02-19T01:14:24.500 に答える