I'll have to ponder a bit on this. I really miss WebObject's ability to
create dynamic hyperlinks and know which object it mapped to the second
request/response loop. And if someone twiddled with the link, it just
wouldn't work (which is appropriate). Putting the PK on the URL is only
acceptable for certain classes of applications (like, an online catalog,
where if someone hacks the URL they'll just get a different product
displayed). This is a Tapestry issue, though, not a Cayenne one. :-)
Thanks!
/dev/mrg
PS. Maybe something like a DataLink component would work? Encode a
Cayenne object with a mechanism to ensure it is the correct object on
the second+ trips?
-----Original Message-----
From: Robert Zeigler [mailto:robert..uregumption.com]
Sent: Thursday, November 10, 2005 12:50 PM
To: cayenne-use..bjectstyle.org
Subject: Re: Tapestry integration
I hear you on that one. My apps always check to ensure a user
has legitimate access to an object before doing anything with that
object. But... that can be a pain, as you pointed out.
So, ways to prevent tampering...
1) Tweak the squeeze adapter to be aware of security constraints.
You could presumably add some sort of Security manager
into which you could pass the "inflated" object.
This is a nice approach in that it centralizes the logic for your
security constraints. Your security manager would need some way to get
access to the current user... (eg: using the threadlocal trick for your
engine so you can get at the visit...) I'm a little unsure, however, on
what should happen should a user /not/ have permission for a particular
object. If you throw an exception, where's it going to propagate to? Is
there any chance to catch it some place reasonable and redirect to a
sort of "permission denied" page or some such? I don't have immediate
answers to that question. You could, of course, change your error page
to be a generic error page (instead of the tapestry one), and not worry
about it... throw your exception, user gets reasonable error page...
everyone is happy?
In general, /any/ approach centered around the squeeze adapter is going
to have that same issue... so you detect url tampering; /then/ what?
Other squeezer-centric methods might be to tweak the adapter to also
write the object hashcode into the url (or some other sort of object
"checksum"). Even if a user tweaks the id, they won't be able to change
the checksum to match. If enough people like this idea, I could write
it into the existing squeeze adapter (again, with the caveat of: now
what?).
An option (at least for direct links, see below) for doing this in the
page while limiting redundant code, might be to have every page extend a
"validator" page or some such, that has a method
"validateObjects(Object[] params)"; in your listeners, you can pass in
your object[] array, etc. This would also work for external links; put
the call inside of the activate method (or whatever it's called; I
always forget. :)
This approach isn't going to work so well for, eg, form hidden fields,
but those are "re-inflated" during rewind, before your listener, and you
don't have any single method that you can use for all parameters. That
is, imagine something like the following:
You store an object at the top of the form which contains a
user-specific object being edited. If a user tampered with the "value"
of the hidden field, your form would be rewound, inflating the
(tampered) object, and also /updating/ the tampered object, all before
you had a chance to do anything. There is, however, something of a
solution here, as well, b/c the hidden component allows a listener; you
could write a single listener which ties into your validateObjects
method, and then just use that listener on all your forms.
I feel like I wrote a lot and said very little, sorry. But this is
definitely an area of thought for me, and I'm open to suggestions on
ways to tweak the squeezer to make urls "tamper-proof" /and/ have some
sort of sensible behavior for when urls have been tampered with.
Robert
Gentry, Michael (Contractor) wrote:
>[Maybe I should put this on the Tapestry list, but since it started
here
>...]
>
>OK Robert, I'm thinking about DirectLink now, especially since the T4
>docs say that ActionLink is deprecated. :-(
>
>Suppose I did a Cayenne DataSqueezer for Tapestry and then did your
>example of a DirectLink using:
>
> parameter="ognl:someDataObject"
>
>Which generates an URL with something like:
>
> sp=Pnt/DataObject/300
>
>How do you prevent a user from changing that URL to have a 301 or a 302
>or whatever? It is quite trivial to copy the link's URL, paste it in
>the browser address line, and edit it. Record 301 could contain
>personal information for a different person that shouldn't be vended to
>the person receiving the link with 300 in it. It seems like I'm going
>to have to do a lot more defensive programming without ActionLink.
>
>Thoughts on that? I'm curious if you've already solved the malicious
>user problem! :-)
>
>Thanks!
>
>/dev/mrg
>
>
>
This archive was generated by hypermail 2.0.0 : Thu Nov 10 2005 - 13:49:52 EST