I am using WebURLCompressingCodingStrategy so the URLs are more compact, but
it still seems like someone could potentially fake a request because there
is only part of the URL that is session specific and not entirely random.

I will take a look at the CryptedUrlWebRequestCodingStrategy to see if that
takes care of it.

Thanks guys!!



On 5/7/07, Eelco Hillenius <[EMAIL PROTECTED]> wrote:

I might be overlooking something, but I doubt whether you need it, as
submissions to pages already are safe. It's very unlikely other's can
guess session relative URLs (like <form

action="wf_component?wicket:interface=wf_component:3:content:tabs:tabs:panel:filter-form:1:IFormSubmitListener:").
But if you want more security you can implement your own request
coding strategy, or e.g. use something like
CryptedUrlWebRequestCodingStrategy. That sounds like a better idea to
me than implementing special purpose functionality in forms.

Eelco


On 5/7/07, Bruno Borges <[EMAIL PROTECTED]> wrote:
> Isn't this already implemented  in Wicket's Core?
>
> --
> Bruno Borges
> Summa Technologies Inc.
> www.summa-tech.com
> (48) 8404-1300
> (11) 3055-2060
>
> On 5/7/07, Mark Sandori <[EMAIL PROTECTED]> wrote:
> >
> > I am looking at making a version of the Form component that supports
the
> > "action token" pattern for securing forms against cross-site request
> > forgery
> > (XSRF) and cross-site script includes (XSSI). The basic idea is to
have
> > the
> > form generate a unique id that must be submitted along with the form.
This
> > verifies that the form was not forged and generated outside of the
> > application.
> >
> > I would love your input as to whether this will work (I am not  an
expert
> > on
> > all the versioning and pagemap stuff yet, but I think the form should
> > always
> > be submitted to the same instance regardless of back button, etc.) and
> > whether this should be part of the base form component.
> >
> > Below is the version of the form that I have created. The verification
of
> > the token happens in an overriden validate() method. I would have
> > preferred
> > to override onFormSubmitted, but it is marked as final (at least in
> > 1.2.5which is what I am using). In
> > 2.0 there appears to be "fake submit" handling, but it is not clear
how
> > this
> > should work. If this is already being handled, let me know...
> >
> > Thanks for your time.
> >
> >
> > public class SecureForm extends Form
> > {
> >
> >     private final transient Logger logger = LoggerFactory.getLogger(
> > SecureForm.class);
> >
> >     private String actionToken;
> >
> >     public SecureForm(final String id) {
> >         this(id, null);
> >     }
> >
> >     public SecureForm(final String id, IModel model)
> >     {
> >         super(id, model);
> >
> >         //generate a unique action token stored with this form
> >         actionToken = UUID.randomUUID().toString();
> >     }
> >
> >     @Override
> >     protected void onComponentTagBody(final MarkupStream markupStream,
> > final
> > ComponentTag openTag)
> >     {
> >         // render the hidden field
> >         AppendingStringBuffer buffer = new AppendingStringBuffer("<div
> > style=\"display:none\"><input type=\"hidden\" name=\"");
> >         buffer.append(getActionTokenHiddenFieldId())
> >                 .append("\" id=\"")
> >                 .append(getActionTokenHiddenFieldId())
> >                 .append("\" value=\"")
> >                 .append(actionToken)
> >                 .append("\" /></div>");
> >         getResponse().write(buffer);
> >
> >         // do the rest of the processing
> >         super.onComponentTagBody(markupStream, openTag);
> >     }
> >
> >     @Override
> >     protected void validate() {
> >         //verify that the token was provided
> >         String token =
> > getRequest().getParameter(getActionTokenHiddenFieldId());
> >
> >         if (!actionToken.equals(token)) {
> >             logger.warn("Attempted unauthorized form submission.");
> >             throw new UnauthorizedActionException(this, new Action("
> > SECUREFORM.SUBMIT"));
> >         }
> >
> >         super.validate();
> >     }
> >
> >     private String getActionTokenHiddenFieldId() {
> >         return "_actiontoken";
> >     }
> > }
> >
>

Reply via email to