Ticket #21353

Cookie(セッション情報)の取り扱い

Date d'ouverture: 2010-04-10 10:57 Dernière mise à jour: 2010-04-12 02:18

Rapporteur:
Propriétaire:
(Aucun)
État:
Ouvert
Composant:
(Aucun)
Priorité:
5 - moyen
Sévérité:
5 - moyen
Résolution:
Aucun
Fichier:
Aucun

Détails

Cookieをライブラリから自由に取れる仕組みにすると、作っているアプリがプラグインを用意した際にセキュリティホールになりかねないのではないかという問題。 ライブラリの概念としてはセキュリティ的にそのまま返す仕組みで実装することの危険性を記載したい。 実装としては各言語に任せるか、設計断面で推奨される実装を明示するようにしたい。

ex.) 下記のようなメソッドで返すようにすると、DLLの呼び出しを共有するアプリケーション全てから容易に承認情報が取得出来てしまうため問題がある。

void SetCookie(Cookies cookies);
Cookies GetCookie();

下記のように取得にワンクッション置くような仕組みを用意するべきではないか

void SetCookie(Cookies cookies, AuthKey key);
Cookies GetCookie(AuthKey key);

Ticket History (3/6 Histories)

2010-04-10 10:57 Updated by: momentspace
  • New Ticket "Cookie(セッション情報)の取り扱い" created
2010-04-10 10:59 Updated by: momentspace
  • Details Updated
2010-04-10 11:23 Updated by: momentspace
Commentaire

そもそもCookieの入ったインスタンスはアプリケーションが保持するんだから、ライブラリへのアクセスを自分でラッピングしてやればいいだけな気がしてきた。

public class Application {
    private NicoAPI api = new NicoAPI();
    public NicoAPI GetAPI() {
        return api; // これはやっちゃダメ
    }
}

サービス別の情報取得クラスからは見えないようにして、Cookieを取り出せるクラスだけプラグインに公開を外せば解決するような設計がいいかな

public class Application {
    private NicoHogeInfo info;
    private NicoSession session;
    public NicoHogeInfo GetNicoHogeInfo() {
        session = info.Login("id", "pass");  // Sessionはアプリだけ取れる
        info.deleteInfo(session);  // コミュ削除とか権限が必要な操作はセッション情報を再度渡す。
        return info;  // 情報はプラグインも触れる
    }
}

// 以下NicoLibの設計サンプル
public class NicoSession {
    public Cookies GetCookies();
}

public class Nico {
    NicoSession Login(string id, string pass) {
        return new NicoSession("セッション設定して返す");
    }
}

public class NicoHogeInfo {
    //GetCookies(); //情報クラスには取得する仕組みを持たない
}
2010-04-11 04:22 Updated by: freehand0906
Commentaire

momentspaceさん

早速ご検討いただきありがとうございます。

Cookieの入ったインスタンスはアプリケーションが保持という設計なら問題ないです。 このことがすでに決まっていることだったなら、そのことを考慮せずに話を進めてしまい申し訳ありませんでした。

ただCookieの入ったインスタンスを作ってしまうと、 APIにアクセスできるのはこのインスタンスだけということになってしまい、 ライブラリの実装や利用するときに若干面倒になるんじゃないかという懸念があります。

そこで静的な領域にセッションをおいてライブラリ内からならどこからでも利用出来るようにしようという発想になったのですが、 その”ライブラリ内からなら”が実現できなさそうだったので、IRCであのような話をしていまいした。

2010-04-12 02:18 Updated by: momentspace
Commentaire

Cookieに関しての振る舞いが上記のサンプルである必要はありません。上記のような方法で回避できそうな話に聞こえたので一例をあげたまでです。 SessionはAPIが内部的にもって、外向きに返すI/Fを用意しないようにしておけば、ログインを呼び出したらアプリケーションだけがSessionを受け取る 事が出来て、認証が必要そうな操作の呼び出しだけ渡す必要があるようにしておき、それ以外の操作は内部に保持してるCookieを使用するような方向で 解決出来そうでないかなと思っていますが、如何でしょうか。

2010-05-01 09:01 Updated by: None

Attachment File List

No attachments

Modifier

Please login to add comment to this ticket » Connexion