On Dec 4, 2010, at 1:52 PM, Brian M wrote:
> 
> OK, so make it so that if desired some subset of the URL vars could be
> signed while still allowing other vars to be changed. That is
> certainly doable and would be nice for securing only the important
> parts.

Right. Not so much the important parts as the invariant ones--the ones that the 
form can't alter.

> 
> Are you assuming that *all* the args *always* get hashed though - that
> seems reasonable to me anyway since a form or ajax call shouldn't need
> to manipulate them right?

That's what I'm assuming, yes. I think it'd be best to avoid that complication 
for now, and if it turns out to be desirable down the road, we could add a 
hash_args=True default that would retain compatibility.

> 
> If this sounds like a better implementation to you Jonathan (and
> anyone else) then I can look at getting a patch to Massimo.
> 
> ~Brian
> 
> On Dec 4, 1:07 pm, Jonathan Lundell <[email protected]> wrote:
>> On Dec 4, 2010, at 10:29 AM, Brian M wrote:
>> 
>> 
>> 
>>> Jonathan,
>> 
>>> How would you like to see this behave? Perhaps URL('index',args=[],
>>> vars={}, hash_key='xxx', hash=['args','vars']) and then
>>> URL.verify(hmac_key='xxx', hash=['args', 'vars]) so that you could
>>> choose which portions of the URL to sign and/or verify with hash=None
>>> triggering the original behavior of hashing both? Since this hasn't
>>> made it into a stable release yet I assume changes can be made still
>>> without worrying about breaking backwards compatibility.
>> 
>> That would work. I'm not sure if it needs to be that general; is there a use 
>> case for hashing vars but not args? If not, then a boolean would be adequate 
>> (hash_vars=True by default; the caller sets it False if desired).
>> 
>> Another generalization would be to pass a set of var keys to be included in 
>> the hash: hash_vars=set('name1', 'name2'). The use case would be a form, 
>> again (or Ajax, perhaps), where the included vars would be page state kept 
>> in hidden or read-only elements of the form.
>> 
>> So:     hash_vars=True  (default; hash all vars)
>>         hash_vars=False (don't hash any vars)
>>         hash_vars=set(...)      (hash only the vars named in the set)
>> 
>> The set needn't be a set per se, I suppose. Any iterable (well, not a 
>> string) would suffice.
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>>> ~Brian
>> 
>>> On Dec 3, 11:13 am, Jonathan Lundell <[email protected]> wrote:
>>>> On Dec 3, 2010, at 9:01 AM, mdipierro wrote:
>> 
>>>>> New feature in trunk:
>> 
>>>>> URL('index',args=[],vars={},hash_key='xxx')
>> 
>>>>> the URL will have a _signature attached. The associated controller can
>>>>> check for the signature with
>> 
>>>>> def index():
>>>>>     if not URL.verify(hmac_key='xxx'): ......
>>>>>     ...
>> 
>>>>> Please test it. In particular we need to test the workflow and see if
>>>>> we are missing something useful or doing something wrong.
>> 
>>>> Perhaps there should be an option to exclude the query string from the 
>>>> hash calculation. Otherwise we can't sign URLs that are form actions (or 
>>>> that are similarly used with Ajax).


Reply via email to