トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

E71:mod_pythonでcookieを使ってみる(2) のバックアップの現在との差分(No.1)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
*E71:mod_pythonでcookieを使ってみる(2) [#ldf871fb]

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

Cookie.Cookieクラスとの大きな違いは、
+シークレットキーを使って、暗号化、復号をしてCookieの値を使う
+1つのオブジェクトで複数の値を使える
の2点です。

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

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

※詳しくは、mod_pythonのマニュアルを参照のこと
-http://www.python.jp/doc/contrib/modpython/pyapi-cookie-classes.html

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

サンプルソースの内容は、前回(Cookie.Cookie)とほぼ同じで、
-id : 値を保持する
-counter : カウントアップする

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

作成するファイルは、同じく以下のとおり
-.htaccess
-mcookie.py
の2つで、小生は「demo22_mcookie」ってディレクトリに格納してます。

***.htaccess [#h11ccc0a]
.htaccessの内容は以下のとおり。

■.htaccess

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

※[[E71:mod_pythonでcookieを使ってみる(1)]]とまったく同じです笑 説明は割愛

***mcookie.py [#dd65b9d2]
同じく、内容は以下のとおり。

■mcookie.py

 from mod_python import Cookie,apache
 def handler(req):
     ck = Cookie.get_cookies(req, \
     Cookie.MarshalCookie, secret='seckey')
     Cookie.MarshalCookie, secret='seckey') ← 1
     
     if not ck.has_key('count'):
         values = {'counter':'0', 'id':'0001'}
         values = {'counter':'0', 'id':'0001'} ← 2
         ck = Cookie.MarshalCookie( \
         'count', values, secret='seckey')
         'count', values, secret='seckey') ← 3
         
         num = ck.value['counter']
         id = ck.value['id']
         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)
         Cookie.add_cookie(req, ck) ← 3
     else:
         countck = ck['count']
         
         num = int(countck.value['counter'])\
          + 1
          + 1                              ← 5
         id = countck.value['id']
         
         message = 'cookie is %s,%s' % \
         (num,id)
         values = {'counter':num, 'id':id}
         values = {'counter':num, 'id':id} ← 5
         mck = Cookie.MarshalCookie('count',\
         values,secret='seckey')
         Cookie.add_cookie(req, mck)
         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
 
各行の解説
+MarshalCookieの値を取り出す場合、get_cookieメソッドの第2引数に「Cookie.MarshalCookie」クラスを指定し、また、第3引数に暗号/復号用のキー「secret='seckey'」を指定します。&br;
※「seckey」は「3」or「6」で指定してます。
+MarshalCookieクラスに設定するオブジェクトを作成します。&br;
Cookieクラスとは違い、辞書オブジェクトをセットすることが出来ます。
+MarshalCookieオブジェクトを作成します。
--第1引数:クッキー名
--第2引数:値 今回は辞書オブジェクト
--第3引数:暗号/復号キー :任意&br;
作成したクッキーオブジェクトをadd_cookieメソッドを使ってリクエストオブジェクトにセットします。
+画面表示用に、MarshalCookieオブジェクトから「id」と「counter」の値を取得します。&br;
※ck.valueでセットした辞書オブジェクトが取得できて、その要素を['id']という形で指定している
+送信されたクッキーからcounterの値を取り出し、カウントアップして、MarshalCookieに再設定するオブジェクトを作る。
+valueをクッキーに再設定し、リクエストオブジェクトにセットします。


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

&ref(Screenshot0078.jpg);&br;

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

&ref(Screenshot0079.jpg);&br;

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

&ref(Screenshot0080.jpg);&br;

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

&ref(Screenshot0081.jpg);

&br;&br;