トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

E71:mod_pythonでcookieを使ってみる(2)

Last-modified: 2013-08-24 (土) 02:14:21 (3688d)
Top / E71:mod_pythonでcookieを使ってみる(2)

E71:mod_pythonでcookieを使ってみる(2)

さて、第2弾は、Cookie.MarshalCookie?を使ってみます。

Cookie.Cookieクラスとの大きな違いは、

  1. シークレットキーを使って、暗号化、復号をしてCookieの値を使う
  2. 1つのオブジェクトで複数の値を使える の2点です。

MarshalCookie?を使わず、Cookie.Cookieで複数の値を使うサンプルはE71:mod_pythonでcookieを使ってみる(3)を参照

1個目の特徴としては、Cookieの偽装に対応できるってことです。(ユーザが保存したCookieを変造し、サーバに送信した際に、変造を発見することが出来ます。)

※詳しくは、mod_pythonのマニュアルを参照のこと

さてさて、ではサンプルを見てみましょう!

サンプルソースの内容は、前回(Cookie.Cookie)とほぼ同じで、

  • id : 値を保持する
  • counter : カウントアップする

という2つの値をCookieで保持し、処理します。

作成するファイルは、同じく以下のとおり

  • .htaccess
  • mcookie.py の2つで、小生は「demo22_mcookie」ってディレクトリに格納してます。

.htaccess

.htaccessの内容は以下のとおり。

■.htaccess

# setting Handler 
SetHandler mod_python
# Add Python Handler
PythonHandler mcookie ←1
# Debug On
PythonDebug On
# Option OFF
Options None

mcookie.py

同じく、内容は以下のとおり。

■mcookie.py

from mod_python import Cookie,apache
def handler(req):
    ck = Cookie.get_cookies(req, \
    Cookie.MarshalCookie, secret='seckey') ← 1
    
    if not ck.has_key('count'):
        values = {'counter':'0', 'id':'0001'} ← 2
        ck = Cookie.MarshalCookie( \
        'count', values, secret='seckey') ← 3
        
        num = ck.value['counter'] ← 4
        id = ck.value['id']     ← 4
        message = \
        'No sent MarshalCookie, \
        so now create\n %s,%s' % (num, id)
        
        Cookie.add_cookie(req, ck) ← 3
    else:
        countck = ck['count']
        
        num = int(countck.value['counter'])\
         + 1                              ← 5
        id = countck.value['id']
        
        message = 'cookie is %s,%s' % \
        (num,id)
        values = {'counter':num, 'id':id} ← 5
        mck = Cookie.MarshalCookie('count',\
        values,secret='seckey') ← 6
        Cookie.add_cookie(req, mck) ← 6
        
    req.write("<html>\n<body>\n<h1>\n")
    req.write(message)
    req.write("\n</h1>\n</body>\n</html>\n")
    return apache.OK

各行の解説

  1. MarshalCookie?の値を取り出す場合、get_cookieメソッドの第2引数に「Cookie.MarshalCookie?」クラスを指定し、また、第3引数に暗号/復号用のキー「secret='seckey'」を指定します。
    ※「seckey」は「3」or「6」で指定してます。
  2. MarshalCookie?クラスに設定するオブジェクトを作成します。
    Cookieクラスとは違い、辞書オブジェクトをセットすることが出来ます。
  3. MarshalCookie?オブジェクトを作成します。
    • 第1引数:クッキー名
    • 第2引数:値 今回は辞書オブジェクト
    • 第3引数:暗号/復号キー :任意&br; 作成したクッキーオブジェクトをadd_cookieメソッドを使ってリクエストオブジェクトにセットします。
  4. 画面表示用に、MarshalCookie?オブジェクトから「id」と「counter」の値を取得します。&br; ※ck.valueでセットした辞書オブジェクトが取得できて、その要素を['id']という形で指定している
  5. 送信されたクッキーからcounterの値を取り出し、カウントアップして、MarshalCookie?に再設定するオブジェクトを作る。
  6. valueをクッキーに再設定し、リクエストオブジェクトにセットします。

動かしてみる

さてさて、資材を配置し、apacheを起動し、配置したURLにアクセスすると、このような画面が表示されます。

Screenshot0078.jpg

おお、1回目の画面が表示された
もう一回アクセスすると・・・

Screenshot0079.jpg

おお、ちゃんと足しこまれた! ちなみに、2つ目の「0001」ってのが「ID」です笑
さらにもう一回アクセスすると・・・

Screenshot0080.jpg

ちゃんと足しこまれた笑 さらにもう一回

Screenshot0081.jpg