Skip to content

Clone references before escaping? #4

@bigpresh

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.

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