[jsr-314-open-mirror] [jsr-314-open] [Spec-869-Specify CSRF Solution] PROPOSAL(s)

Neil Griffin neil.griffin at portletfaces.org
Tue Sep 21 16:20:44 EDT 2010


#1 is probably not compatible with portlets. Portals are in full control of creation of URLs in general, and it is not possible to simply append "&javax.faces.Token=XYZ" to a portal's ActionURL and expect it to work.

#2 is compatible with portlets, but it would be best to have the hidden field namespaced. Otherwise it would be like javax.faces.VIEW_ID which is not namespaced, and can cause problems in portals.

Neil

On Sep 21, 2010, at 1:15 PM, Roger Kitain wrote:

> 
> There are two proposals for enhancing CSRF attacks in JSF.  We need to pick one.
> 
> Proposal 1: Form Action URL Approach (Approach provided by Kito Mann)
> 
> This approach does the following:      - Token is generated on the server consisting (minimally) of a randomly generated "secret key
>     (stored in session).
>   - ViewHandler.getActionURL method must include the token parameter
>     named "javax.faces.Token", and whose value is the token value.
>   - At render time this token will be included in Form's action URL - and it will be
>     posted back to the server.
>   - Restore View Phase processing compares the incoming token request parameter value
>     with the token value generated from the secret key in the session.
> 
> Spec Document Modifications:
> 
> Section 7.5.1:
> 
> getActionURL:
> 
> "The URL must contain the parameter constant defined by ResponseStateManager.VIEW_TOKEN_PARAM
> The value of this parameter must be a cryptographically produced value minimally consisting
> of a "secret key". The "secret key" is a random generated value that was stored in the session
> (preferably around session creation time).  Implementations may also choose to combine other
> values with the secret key to produce a more complex token."
> 
> Section 2.2.1
> 
> "Verify the "javax.faces.Token" request parameter value is the same as the token value generated
>   from the "secret key" stored in the session.  If the values do not match, throw a meaningful
>   exception."
> 
> 
> Proposal 2: Form Hidden Field Approach
> 
> This approach is similar to Approach 1, except a Form hidden field "javax.faces.Token"
> is used instead of appending to the Form's Action URL.
> 
> Spec Document Modifications:
> 
> Standard RenderKit Docs
> 
> - Form Rendering
> 
> "Render a hidden field named "javax.faces.Token" using the ResponseStateManager.VIEW_TOKEN_PARAM
> constant.  The value of this hidden field is a cryptographically produced value that must at least
> consist of a "secret key".  The "secret key" is a random generated value that was stored in the
> session (preferably around session creation time).  Implementations may also choose to combine
> other values with the secret key to produce a more complex token."
> 
> Specification Document
> 
> Section 2.2.1
>  "Verify the "javax.faces.Token" request parameter value is the same as the token value generated
>   from the "secret key" stored in the session.  If the values do not match, throw a FacesException.
> 
> 
> For both approaches see:
> 
> 
> [1] https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=869
> 
> Look at the two latest change bundles attached to the issue.
> 
> Please review by COB Friday as we have no time left for 2.1.
> 
> Kudos to Kito Mann for helping out with the implementation.
> 
> -roger

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/jsr-314-open-mirror/attachments/20100921/d2315c2b/attachment-0002.html 


More information about the jsr-314-open-mirror mailing list