模板中的恶意请求 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>
我正在尝试在 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>