summaryrefslogtreecommitdiff
path: root/docs/narr
diff options
context:
space:
mode:
authorÉric Araujo <earaujo@caravan.coop>2019-12-14 13:33:46 -0500
committerÉric Araujo <earaujo@caravan.coop>2019-12-14 13:33:46 -0500
commitdb9f893fc6c54164a71c2e96321e60e9b34c6f7a (patch)
treef918ae87025ccaa2da953411c049b70726b792b7 /docs/narr
parent0168300b0da3c79e05ec87aa777e04674a86cebb (diff)
parent948b692469cdcaeb38f37982f0810954c545b920 (diff)
downloadpyramid-db9f893fc6c54164a71c2e96321e60e9b34c6f7a.tar.gz
pyramid-db9f893fc6c54164a71c2e96321e60e9b34c6f7a.tar.bz2
pyramid-db9f893fc6c54164a71c2e96321e60e9b34c6f7a.zip
merge upstream
Diffstat (limited to 'docs/narr')
-rw-r--r--docs/narr/sessions.rst37
1 files changed, 27 insertions, 10 deletions
diff --git a/docs/narr/sessions.rst b/docs/narr/sessions.rst
index c2cc60de8..2da524d4c 100644
--- a/docs/narr/sessions.rst
+++ b/docs/narr/sessions.rst
@@ -85,32 +85,49 @@ This is a stricter contract than the previous requirement that all objects be pi
This is a backward-incompatible change.
Previously, if a client-side session implementation was compromised, it left the application vulnerable to remote code execution attacks using specially-crafted sessions that execute code when deserialized.
+Please reference the following tickets if detailed information on these changes is needed:
+
+* `2.0 feature request: Require that sessions are JSON serializable #2709 <https://github.com/pylons/pyramid/issues/2709>`_.
+* `deprecate pickleable sessions, recommend json #3353 <https://github.com/pylons/pyramid/pull/3353>`_.
+* `change to use JSONSerializer for SignedCookieSessionFactory #3413 <https://github.com/pylons/pyramid/pull/3413>`_.
+
For users with compatibility concerns, it's possible to craft a serializer that can handle both formats until you are satisfied that clients have had time to reasonably upgrade.
Remember that sessions should be short-lived and thus the number of clients affected should be small (no longer than an auth token, at a maximum). An example serializer:
.. code-block:: python
:linenos:
+ import pickle
from pyramid.session import JSONSerializer
- from pyramid.session import PickleSerializer
from pyramid.session import SignedCookieSessionFactory
+
class JSONSerializerWithPickleFallback(object):
def __init__(self):
self.json = JSONSerializer()
- self.pickle = PickleSerializer()
- def dumps(self, value):
- # maybe catch serialization errors here and keep using pickle
- # while finding spots in your app that are not storing
- # JSON-serializable objects, falling back to pickle
- return self.json.dumps(value)
+ def dumps(self, appstruct):
+ """
+ Accept a Python object and return bytes.
+
+ During a migration, you may want to catch serialization errors here,
+ and keep using pickle while finding spots in your app that are not
+ storing JSON-serializable objects. You may also want to integrate
+ a fall-back to pickle serialization here as well.
+ """
+ return self.json.dumps(appstruct)
- def loads(self, value):
+ def loads(self, bstruct):
+ """Accept bytes and return a Python object."""
try:
- return self.json.loads(value)
+ return self.json.loads(bstruct)
except ValueError:
- return self.pickle.loads(value)
+ try:
+ return pickle.loads(bstruct)
+ except Exception:
+ # this block should catch at least:
+ # ValueError, AttributeError, ImportError; but more to be safe
+ raise ValueError
# somewhere in your configuration code
serializer = JSONSerializerWithPickleFallback()