Skip to content

Clone references before escaping? #4

Description

@bigpresh

As originally discovered in http://www.backup-manager.org/pipermail/dancer-users/2012-April/002424.html :

When automatic_escaping is enabled, we recursively encode HTML entities in template params, following references.

Since the app's settings are automatically passed to the template by Dancer::Template::Abstract, stored as a reference to the real settings hashref, we can inadvertently go HTML-encoding stuff in the app's actual settings.

A partial fix is for Dancer to clone the settings rather than storing an actual reference, but of course that still means the problem can occur in other cases.

For example:

get '/' => sub {
    my $foo = { foo => '<Foo>' };
    my $html = template 'bar', { foo => $foo };
    # $foo->{foo} has been changed to &lt;Foo&gt;
};

Probably a safer fix is for _encode to automatically clone any reference it's about to change before making changes. This would need some refactoring in _encode to assume that it's starting with a hashref (which it will be) and to pass on both the key and the value each time, rather than simply passing the reference to the value when recursing.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions