A possible solution:  the postrun callback for ProtectCSRF runmodes could be
enhanced to detect that ValidateRM was used, and there were errors on the
form. Something like this:

    if($self->can('dfv_results')) {  # hmm, using CAP::ValidateRM
        my $r = $self->dfv_results;
        if($r->has_missing or $r->has_invalid) {
            #  the form has errors, assume we need to generate an new CSRF
token:
            # ... code here to generate a new token and add it to the HTML
...

I'm not sure if a new token should be generated, or the existing one should
be (re)used.  At a minimum, the hidden field with the token needs to be
added to the HTML again.

For CA apps that don't use ValidateRM, we could add a new method to
CAP::ProtectCSRF that would set some kind of flag so that the postrun
callback would know to generate a token and add it to the HTML. The app
developer would have to remember to call it though -- it wouldn't happen
behind the scenes like above. Something like this:

sub create_check : Runmode :ProtectCSRF {
    my $self = shift;
    # check the form without using my ValidateRM
    $self->add_csrf_id_to_html();
    # and maybe $self->generate_csrf_token();
    # ... code to re-generate the original form with errors ...
}  <--- the postrun callback/hook would do the real work, if the flag was
set

Comments?
-- Mark

On Thu, Dec 3, 2009 at 1:16 AM, Mark Rajcok <[email protected]> wrote:

> Anyone see a solution to this problem?  (other than abandoning attribute
> handlers and requiring functions like create() above to explicitly call
> _publish_csrf_id() and _add_csrf_id())
>

#####  CGI::Application community mailing list  ################
##                                                            ##
##  To unsubscribe, or change your message delivery options,  ##
##  visit:  http://www.erlbaum.net/mailman/listinfo/cgiapp    ##
##                                                            ##
##  Web archive:   http://www.erlbaum.net/pipermail/cgiapp/   ##
##  Wiki:          http://cgiapp.erlbaum.net/                 ##
##                                                            ##
################################################################

Reply via email to