gpt4 book ai didi

perl - 我如何告诉 WWW::Mechanize 忽略安全 cookie?

转载 作者:太空宇宙 更新时间:2023-11-03 12:54:43 25 4
gpt4 key购买 nike

我需要使用遗留的 CGI 程序,我正在为它编写测试。我用 Test::WWW::Mechanize::CGI为了那个原因。该应用程序在生产环境中运行在 https 上,自制的 session 处理只是抛出一个 cookie,该 cookie 设置了安全选项。

my $cookie = $q->cookie(
-name => 'session',
-value => 'foobar',
-expires => '+24h',
-secure => 1, # this is the culprit
-httponly => 1,
-samesite => 'Strict',
;

虽然这在生产中的 https URL 下有意义,但它破坏了我的测试,因为我在那里没有 SSL 支持。

显而易见的解决方案是放置一个开关,如果有可用的 SSL,则只在 cookie 上启用此选项,但我现在不想这样做。相反,我想找出如何从测试端禁用这个东西。

这里有一个例子可以说明我在说什么。它在 CGI.pm 中使用了我通常不鼓励人们使用的东西。请耐心等待我理解这个问题。

use strict;
use warnings;
use CGI;
use Test::WWW::Mechanize::CGI;
use Test::More;

my $mech = Test::WWW::Mechanize::CGI->new;
$mech->cgi(
sub {
my $q = CGI->new;

if ( $q->param('behind_login') ) {
# check if we've got the session cookie
if ( $q->cookie('session') ) {
print $q->header, $q->start_html('Logged in'), $q->h1('Welcome back'), $q->end_html;
}
else {
print $q->header( 'text/plain', '403 Unauthorized' );
}
}
else {
# this is where the user gets logged in
my $cookie = $q->cookie(
-name => 'session',
-value => 'foobar',
-expires => '+24h',
-secure => 1, # this is the culprit
-httponly => 1,
-samesite => 'Strict'
);

print $q->header( -cookie => $cookie ),
$q->start_html('Hello World'),
$q->h1('Hello World'),
$q->end_html;
}
}
);

$mech->get_ok('http://localhost/');
$mech->get_ok('http://localhost/?behind_login=1');

done_testing;

如果运行这个程序,第一个测试将通过,第二个将失败。如果带有 -secure 选项的标记行被注释掉,第二个测试也将通过。

我在 LWP::UserAgent 中翻找了一下,但没有找到可以禁用它的地方。我知道这是默认行为,这样做很好。

可能有一个选项可以关闭它,我在研究文档时没有看到它,但很可能没有。一旦我知道在哪里做这件事,我就可以用猴子修补这个东西。

最佳答案

解决方案很简单。只需使用 https URL 调用 get_ok。 Mechanize 只会做正确的事。该请求将知道它是安全的,并且一切正常。

$mech->get_ok('https://localhost/');
$mech->get_ok('https://localhost/?behind_login=1');

根本不需要猴子修补任何东西。

关于perl - 我如何告诉 WWW::Mechanize 忽略安全 cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45209795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com