【问题标题】:Prevent escape characters when rendering JSON in Perl Mojolicious在 Perl Mojolicious 中呈现 JSON 时防止转义字符
【发布时间】:2022-04-15 16:17:45
【问题描述】:

我有一个 Mojolicious 控制器,它调用

$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 哈希。

【问题讨论】:

  • 首先用%{ $hashref } 扩展散列然后用{ ... } 将其转回散列引用的目的是什么?为什么不直接使用json => $hashref?如果问题是散列内容的多个实例,请使用子或词法范围的散列定义。
  • 就我而言,有点过分热情地取消引用,但是当用更简单的 $controller->render_to_string( json => $hashref ); 替换时,我仍然遇到相同的转义值。

标签: json perl escaping mojolicious


【解决方案1】:

在呈现 JSON 时,Mojolicious 会转义 / 字符以防止 XSS attacksdocumentation of Mojo::JSON 中提到了这一点:

字符/ 将始终被转义以防止XSS 攻击。

"</script>" -> "</script>"

在实践中,this is done Mojo::JSON 本身反对“这是由 Mojolicious 每次呈现 JSON 内容时自动完成的”。这意味着 1) 当您执行 -&gt;render( json =&gt; ... ) 时,没有干净的方法来防止这种行为,并且 2) 修复只是使用另一个 JSON 模块进行编码,并在对 render 的调用中指定 format =&gt; 'json' (这将导致响应的标头包含Content-Type: application/json,如Mojolicious::Guides::Rendering 中所述):

use JSON qw( encode_json );

$controller->render(text => encode_json($hashref), format => 'json');

如果您只想使用$controller-&gt;render_to_string 渲染到一个字符串(正如您在问题中所做的那样),那么您可以省略format =&gt; 'json'(无论如何,format is ignored by render_to_string):

use JSON qw( encode_json );

my $json = $controller->render_to_string(text => encode_json($hashref));

【讨论】:

    猜你喜欢
    • 2013-03-18
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多