模板中的恶意请求 header

Mojolicious request header in template

我正在尝试在 mojolicious 模板中获取请求 header。我需要定制 header。在 Flask 中我会使用

{{request.headers['customheader] }}

如何在 Mojolicious 中实现同样的效果?有一个 Mojo::Message::Request 包。

所以我有的东西不起作用。

% use Mojo::Message::Request;
% my $req = Mojo::Message::Request->new;
<%= $req->headers->header('customheader') %>

如果我只打印 $req,我会得到一个巨大的散列。 我也试过用

% use Mojo::Headers;
% my $headers = Mojo::Headers->new;
<%= $headers->parse('X-Forwarded-For') %>

由于 mojolicious 将控制器 object 作为局部变量 $c$self 注入到您的视图中,您可以轻松访问请求 headers:

# Your Template-Code
Some-Header: <strong><%= $c->req->headers->header("Some-header") %></strong>

$c->req->headers 是一个 Mojo::Headers object 并且包含当前请求中的所有 headers。

您的具体问题是您没有使用请求创建的任何 object。您正在创建新的空 objects,但在其中找不到任何内容。您需要为您的模板提供控制器已经知道的数据。

以下是它在新应用程序中的工作方式:

% mojo generate app
% cd app

在模板中,我可以通过 $c 变量访问控制器。我更改 templates/example/welcome.html.ep 模板以包含一个新段落:

<p>
The value of X-Bender is <%= $c->req->headers->header( 'X-Bender' ) %>
</p>

但是,我不是特别喜欢把一堆它可能不需要的东西交给视图;这就是数据泄漏发生的方式。控制器object 还会在,但我不会用它(所以一些社会控制措施是必要的)。相反,我针对我关心的特定 header:

  $self->stash( 
      bender_header => $self->req->headers->header( 'X-Bender' ) 
      );

并且在模板中:

<p>
The value of X-Bender is <%= $bender_header %>
</p>

但是我真正要添加到我的页面的是什么?什么是 X-Bender<script ...>?模板会自动为你转义,但我不喜欢依赖视图来处理它。就算逃了,也是一片狼藉。它不仅在验证数据;它确保敏感数据不会泄露:

  my $bender = $self->req->headers->header( 'X-Bender' );
  # sanitize
  $bender = 'Invalid' unless $bender =~ /\A[A-Z0-9\s]+\z/;

  $self->stash( 
      bender_header => $bender
      );

启动服务器并发出请求:

% ./script/my_app daemon
% curl -H "X-Bender: Kill all humans" http://127.0.0.1:3000

您也可以为此使用 Ojo,但涉及更多:

% perl -Mojo -E "say g( 'http://127.0.0.1:3000' => { 'X-Bender' => 'Kill all humans' } )->body"

无论哪种方式,响应 body 回应 X-Bender header:

<!DOCTYPE html>
<html>
  <head><title>Welcome</title></head>
  <body><h2>Welcome to the Mojolicious real-time web framework!</h2>
<p>
  This page was generated from the template "templates/example/welcome.html.ep"
  and the layout "templates/layouts/default.html.ep",
  <a href="/">click here</a> to reload the page or
  <a href="/index.html">here</a> to move forward to a static page.
</p>

<p>
The value of X-Bender is Kill all humans
</p>
</body>
</html>