On Saturday, May 3, 2014 4:39:14 PM UTC-4, Brian Morearty wrote:
>
>
> When you generate a default Rails app, it puts this in 
> application.html.erb: 
>
> <%= csrf_meta_tags %> 
>
> It does this so the remote forms can be submitted--i.e., so JavaScript can 
> submit a form. When jquery-rails is about to submit a form, it looks for 
> the <meta> tags named "csrf-param" and "csrf-token" and from them it 
> constructs a hidden "authenticity_token" param from it. It gets inserted in 
> with the POST data so Rails will accept the request.
>
> I would like to be able to serve identical HTML content for all users, so 
> the page can be cached on Varnish or a CDN or whatever. Since the 
> form_authenticity_token is different for every session, leaving 
> csrf_meta_tags in the header makes it impossible for a proxy to cache the 
> page.
>
> I have an idea for how to fix it but thought I would ask here, to see if 
> people think there would be problems with it: I could create an 
> after_action in ApplicationController that looks like this: 
>
> after_action :set_authenticity_cookie
>  
> def set_authenticity_cookie
>   cookies[:form_authenticity_token] = form_authenticity_token 
> ifform_authenticity_token
> end 
>
> So basically send the form_authenticity_token to the browser in a cookie 
> instead of putting it in the HTML.
>
> Client-side, I could write a little JavaScript that pulls it out of the 
> cookie and dynamically creates the meta tags that jquery-rails is expecting.
>
> * Questions: *
>
>    1. Does this expose me to any security problems? 
>    2. Is there any reason this wouldn't work? 
>    
>
> Thanks, 
>
> Brian 
>
>
>
> I'll answer the second question first.  I'm not sure the 
form_authenticity_token will persist.  It might.  If not, you can use (and 
probably should use) session[:_csrf_token].  Otherwise, I haven't tested 
it, but it seems like it should work.

The first question is probably the bigger concern.  The purpose of cross 
site request forgery is to insure that requests originate from the 
application.  It seems your javascript would circumvent that by inserting 
the token in the form.  What event will trigger your javascript?  Will any 
form that gets submitted, regardless of its origin?  If so, IMO, you have a 
significant security risk.  In other words, how will you insure that only 
forms obtained from your Varnish server or the application get submitted 
and everything else will be rejected?   

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rubyonrails-talk/0cbd9aa5-3566-4980-aa2f-febf123005e2%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to