20.22。 クッキー —HTTP状態管理
ノート
Python3では Cookie モジュールの名前がhttp.cookies
に変更されました。 2to3 ツールは、ソースをPython 3に変換するときに、インポートを自動的に適応させます。
ソースコード: :source: `Lib / Cookie.py`
Cookie モジュールは、HTTP状態管理メカニズムであるCookieの概念を抽象化するためのクラスを定義します。 単純な文字列のみのCookieをサポートし、シリアル化可能なデータ型をCookie値として持つための抽象化を提供します。
このモジュールは、以前は RFC 2109 および RFC 2068 仕様に記載されている解析ルールを厳密に適用していました。 その後、MSIE 3.0xがこれらの仕様で概説されている文字規則に準拠していないことが発見されました。また、現在の多くのブラウザーとサーバーでは、Cookieの処理に関して解析規則が緩和されています。 その結果、使用される解析ルールは少し厳しくなりません。
文字セット string.ascii_letters 、 string.digits 、および!#$%&'*+-.^_`|~
は、このモジュールでCookie名に許可されている有効な文字のセットを示します( key [ X171X])。
ノート
無効なCookieが発生すると、 CookieError が発生するため、Cookieデータがブラウザからのものである場合は、常に無効なデータを準備し、解析時に CookieError をキャッチする必要があります。
- exception Cookie.CookieError
- RFC 2109 の無効性が原因で例外が失敗しました:属性が正しくない、 Set-Cookie ヘッダーが正しくないなど。
- class Cookie.BaseCookie([input])
このクラスは、キーが文字列で値が Morsel インスタンスである辞書のようなオブジェクトです。 キーを値に設定すると、値は最初にキーと値を含む Morsel に変換されることに注意してください。
input が指定されると、 load()メソッドに渡されます。
- class Cookie.SimpleCookie([input])
- このクラスは BaseCookie から派生し、
value_decode()
とvalue_encode()
をオーバーライドして、それぞれIDと str()になります。
- class Cookie.SerialCookie([input])
このクラスは BaseCookie から派生し、
value_decode()
とvalue_encode()
をオーバーライドして pickle.loads()と pickle.dumps()[ X138X]。バージョン2.3以降非推奨:信頼できないCookieデータからpickle化された値を読み取ることは、サーバー上で任意のコードを実行させるようにpickle化文字列を作成できるため、大きなセキュリティホールです。 下位互換性のためにのみサポートされており、最終的にはなくなる可能性があります。
- class Cookie.SmartCookie([input])
このクラスは BaseCookie から派生しています。 有効なピクルスの場合は
value_decode()
を pickle.loads()にオーバーライドし、そうでない場合は値自体をオーバーライドします。 文字列でない限り、value_encode()
を pickle.dumps()にオーバーライドします。文字列の場合は、値自体を返します。バージョン2.3以降非推奨: SerialCookie と同じセキュリティ警告がここに適用されます。
さらなるセキュリティノートが必要です。 下位互換性のために、 Cookie モジュールは、 SmartCookie の単なるエイリアスであるCookie
という名前のクラスをエクスポートします。 これはおそらく間違いであり、将来のバージョンで削除される可能性があります。 SerialCookie クラスを使用しないのと同じ理由で、アプリケーションでCookie
クラスを使用しないでください。
も参照してください
- モジュール cookielib
- Web クライアントのHTTPCookie処理。 cookielib モジュールと Cookie モジュールは相互に依存していません。
- RFC 2109 -HTTP状態管理メカニズム
- これは、このモジュールによって実装される状態管理仕様です。
20.22.2。 モーゼルオブジェクト
- class Cookie.Morsel
いくつかの RFC 2109 属性を持つキー/値ペアを抽象化します。
モーゼルは辞書のようなオブジェクトであり、そのキーのセットは一定です—有効な RFC 2109 属性は次のとおりです。
expires
path
comment
domain
max-age
secure
version
httponly
属性
httponly
は、CookieがHTTPリクエストでのみ転送され、JavaScriptを介してアクセスできないことを指定します。 これは、クロスサイトスクリプティングのいくつかの形式を軽減することを目的としています。キーでは大文字と小文字は区別されません。
バージョン2.6の新機能:
httponly
属性が追加されました。
- Morsel.value
- Cookieの値。
- Morsel.coded_value
- クッキーのエンコードされた値—これは送信されるべきものです。
- Morsel.key
- クッキーの名前。
- Morsel.set(key, value, coded_value)
- key 、 value 、および coded_value 属性を設定します。
- Morsel.isReservedKey(K)
- K が Morsel のキーセットのメンバーであるかどうか。
- Morsel.output([attrs[, header]])
- HTTPヘッダーとして送信するのに適したMorselの文字列表現を返します。 デフォルトでは、 attrs が指定されていない限り、すべての属性が含まれています。指定されている場合は、使用する属性のリストである必要があります。 ヘッダーはデフォルトで
"Set-Cookie:"
です。
- Morsel.js_output([attrs])
埋め込み可能なJavaScriptスニペットを返します。これは、JavaScriptをサポートするブラウザーで実行すると、HTTPヘッダーが送信された場合と同じように機能します。
attrs の意味は、 output()と同じです。
- Morsel.OutputString([attrs])
周囲のHTTPまたはJavaScriptを使用せずに、Morselを表す文字列を返します。
attrs の意味は、 output()と同じです。
20.22.3。 例
次の例は、 Cookie モジュールの使用方法を示しています。
>>> import Cookie
>>> C = Cookie.SimpleCookie()
>>> C["fig"] = "newton"
>>> C["sugar"] = "wafer"
>>> print C # generate HTTP headers
Set-Cookie: fig=newton
Set-Cookie: sugar=wafer
>>> print C.output() # same thing
Set-Cookie: fig=newton
Set-Cookie: sugar=wafer
>>> C = Cookie.SimpleCookie()
>>> C["rocky"] = "road"
>>> C["rocky"]["path"] = "/cookie"
>>> print C.output(header="Cookie:")
Cookie: rocky=road; Path=/cookie
>>> print C.output(attrs=[], header="Cookie:")
Cookie: rocky=road
>>> C = Cookie.SimpleCookie()
>>> C.load("chips=ahoy; vienna=finger") # load from a string (HTTP header)
>>> print C
Set-Cookie: chips=ahoy
Set-Cookie: vienna=finger
>>> C = Cookie.SimpleCookie()
>>> C.load('keebler="E=everybody; L=\\"Loves\\"; fudge=\\012;";')
>>> print C
Set-Cookie: keebler="E=everybody; L=\"Loves\"; fudge=\012;"
>>> C = Cookie.SimpleCookie()
>>> C["oreo"] = "doublestuff"
>>> C["oreo"]["path"] = "/"
>>> print C
Set-Cookie: oreo=doublestuff; Path=/
>>> C["twix"] = "none for you"
>>> C["twix"].value
'none for you'
>>> C = Cookie.SimpleCookie()
>>> C["number"] = 7 # equivalent to C["number"] = str(7)
>>> C["string"] = "seven"
>>> C["number"].value
'7'
>>> C["string"].value
'seven'
>>> print C
Set-Cookie: number=7
Set-Cookie: string=seven
>>> # SerialCookie and SmartCookie are deprecated
>>> # using it can cause security loopholes in your code.
>>> C = Cookie.SerialCookie()
>>> C["number"] = 7
>>> C["string"] = "seven"
>>> C["number"].value
7
>>> C["string"].value
'seven'
>>> print C
Set-Cookie: number="I7\012."
Set-Cookie: string="S'seven'\012p1\012."
>>> C = Cookie.SmartCookie()
>>> C["number"] = 7
>>> C["string"] = "seven"
>>> C["number"].value
7
>>> C["string"].value
'seven'
>>> print C
Set-Cookie: number="I7\012."
Set-Cookie: string=seven