我有一个可以调用的 Mojolicious Controller
$controller->render_to_string(json => { %{$hashref} });
# or
$controller->render_to_string(json => $hashref);
$hashref
包含写入 JSON 对象时被转义的字符。
例如:
my $hashref = {
path => '/path/to/file'
}
输出为:
{
"path": "\\/path\\/to\\/file"
}
有没有办法通知 render_to_string()
方法不要插入/转义这些值?
我应该提到,实际的字符串是 MD5 哈希值。
最佳答案
渲染 JSON 时,Mojolicious 会转义 /
字符以防止 XSS attacks 。 documentation of Mojo::JSON
中提到了这一点:
The character
/
will always be escaped to prevent XSS attacks."</script>" -> "<\/script>"
在实践中,this is done由 Mojo::JSON
本身,反对“这是 Mojolicious 每次渲染 JSON 内容时自动完成的”。这意味着 1) 当您执行 ->render( json => ... )
时,没有干净的方法来防止这种行为,2) 修复方法只是使用另一个 JSON 模块来执行编码,并在对 render
的调用中指定 format => 'json'
(这将导致响应的 header 包含 Content-Type: application/json
,如 Mojolicious::Guides::Rendering
中所述):
use JSON qw( encode_json );
$controller->render(text => encode_json($hashref), format => 'json');
如果您只想使用 $controller->render_to_string
渲染为字符串(正如您在问题中所做的那样),那么您可以省略 format => 'json'
(无论如何,format
is ignored by render_to_string
):
use JSON qw( encode_json );
my $json = $controller->render_to_string(text => encode_json($hashref));
关于json - 在 Perl Mojolicious 中渲染 JSON 时防止转义字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71875318/