Let's not get into the motivation behind this too much -- the exact same
serialization problems exist if you write out the session to a database.
Ring also encrypts the cookies so the above issue is not a problem, it's
only on you to actually choose and protect your encryption key.
I came across *data-readers* as well.I did not find it possible to make it
completely transparent if one was to use the REPL though because it is
bound on entering the REPL. Furthermore I don't think it works with
clojure.edn as well. However, it seems that
clojure.core/default-data-readers does work with both clojure.core and
clojure.edn functions. Thus I've solved the issue by altering
clojure.core/default-data-readers to include my library's tag. This seems a
bit hackish because I'm not sure you're supposed to be modifying this var,
but it's the only thing I can find that both clojure.core/read{,-string}
and clojure.edn/read{,-string} respect.
> the issue is not in clojure.core. It is with ring in this case, it uses
clojure.tools.reader.edn/read-string which supports an optional {:readers
{...}} argument but there is no way to specify those in ring.
I don't think the fault lies here with ring. It doesn't seem right to
expect that library callers of these functions expose their full API to
their own users...that would put a serious burden on them to more closely
track the API as well. Better to have some alterable var so this can all
run transparently.
> it uses clojure.tools.reader.edn/read-string
Ugh, thanks. I forgot about that one as well.
On Wednesday, June 17, 2015 at 5:10:24 AM UTC-4, Fluid Dynamics wrote:
>
> On Wednesday, June 17, 2015 at 4:52:00 AM UTC-4, Thomas Heller wrote:
>>
>> Hey,
>>
>> the issue is not in clojure.core. It is with ring in this case, it uses
>> clojure.tools.reader.edn/read-string which supports an optional {:readers
>> {...}} argument but there is no way to specify those in ring. Should be a
>> fairly simple fix though, doing anything to clojure.edn won't help as it is
>> not used.
>>
>> On another note: Sessions in cookies should be VERY VERY small.
>> java.io.Serializable usually isn't small and especially if you go java
>> object -> binary -> base64 -> base64 (yes twice) -> encrypt. The size of
>> the cookie matters as it is transmitted with EVERY request.
>>
>> I would recommend writing print-method implementation for the Java
>> objects you need to serialize and keeping those to a minimum. Session
>> cookies are not arbitrary storage and writing a "transparent" serialization
>> format that doesn't check the size will lead to uncontrolled growth. I have
>> seen way too many web apps with cookies above 4kb. One even had Apache
>> configured to reject requests (well, default config) that had too large
>> cookies and no one even noticed except for the users that left confused and
>> never came back.
>>
>> Just as a warning. :)
>>
>
> If you really do need to store session state that can potentially grow
> that large, your best bet is to stick it in a server-side database and put
> that table's primary key in the client-side cookie, looking up the state
> object on receiving it back. This also prevents the end-user or a MITM from
> monkeying with the state, which might prevent some types of attacks
> (typically, session hijacking methods that aren't simple replay attacks, or
> cheating to give yourself the super-duper armor for free in an online game,
> or whatever). Remember when AT&T was embarrassed by some guy finding he
> could peek at every customer's data just by changing an &custID=nnn sort of
> URL parameter? Same thing can happen with a cookie that just says "logged
> in as user#6178" or equivalent. Change it to "6179" and boom you're someone
> else. But if the cookie is something like a random UUID that points to a
> server-side DB entry that says "logged in as user#6178" fiddling with the
> UUID will just produce error messages. Just don't use an autoincrement
> integer PK or you are right back where you started. :)
>
>
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.