如何让LWP验证我连接的服务器的证书是否由受信任的机构签名并发送给正确的主机?据我所知,它甚至没有检查证书声称是否为我正在连接的主机名.这似乎是一个主要的安全漏洞(特别是最近的DNS漏洞).
更新: 事实证明我真正想要的是HTTPS_CA_DIR
,因为我没有ca-bundle.crt.但是HTTPS_CA_DIR=/usr/share/ca-certificates/
诀窍呢.无论如何,我将答案标记为已被接受,因为它足够接近.
更新2:事实证明,HTTPS_CA_DIR
并且HTTPS_CA_FILE
仅当您正在使用的Net :: SSL作为底层的SSL库申请.但LWP也适用于IO :: Socket :: SSL,它将忽略这些环境变量并愉快地与任何服务器通信,无论它呈现什么证书.有更通用的解决方案吗?
更新3:不幸的是,解决方案仍然不完整.Net :: SSL和IO :: Socket :: SSL都没有根据证书检查主机名.这意味着某人可以获得某个域的合法证书,然后在没有LWP抱怨的情况下冒充任何其他域.
如果您尝试登录https://orbit.theplanet.com/Login.aspx?url=/Default.aspx(使用任何用户名/密码组合),您可以看到登录凭据是作为非传统集发送的POST数据:只是一个寂寞的JSON字符串,没有普通的键=值对.
具体而言,而不是:
username=foo&password=bar
Run Code Online (Sandbox Code Playgroud)
甚至是这样的:
json={"username":"foo","password":"bar"}
Run Code Online (Sandbox Code Playgroud)
简单来说:
{"username":"foo","password":"bar"}
Run Code Online (Sandbox Code Playgroud)
是否可以LWP
使用替代模块执行此类请求?我准备这样做,IO::Socket
但如果有的话,我会更喜欢更高级别的东西.
我使用Perl在网上获取一些页面,LWP::UserAgent
并希望尽可能礼貌.默认情况下,LWP::UserAgent
不通过gzip无缝处理压缩内容.是否有一种简单的方法可以实现这一目标,为每个人节省一些带宽?
我有很多脚本,其中大部分都是基于WWW::Mechanize
可以通过HTTP访问的misc硬件中的数据.在升级我的大多数perl安装及其模块之后,使用HTTPS://的所有脚本都因为而破坏了"certificate verify failed"
这是因为较新版本的LWP对证书进行了适当的检查以及 dies
是否存在不匹配的事实.
在我的情况下,由于情况,预计失败的证书认证,所以我需要找到一种干净地绕过这种检查的方法.
我想制作一个与http://www.md5crack.com/crackmd5.php进行通信的程序.我的目标是向网站发送一个哈希值(md5),希望该网站能够破解它.之后,我想显示哈希的明文.我的问题是将数据发送到网站.我查阅了关于使用LWP的文章,但我仍然迷失了.现在,哈希不发送,其他一些垃圾数据是.我该如何向网站发送特定的数据串?
use HTTP::Request::Common qw(POST);
use LWP::UserAgent;
$ua = LWP::UserAgent->new();
my $req = POST 'http://www.md5crack.com/crackmd5.php', [
maxlength=> '2048',
name=> 'term',
size=>'55',
title=>'md5 hash to crack',
value=> '098f6bcd4621d373cade4e832627b4f6',
name=>'crackbtn',
type=>'submit',
value=>'Crack that hash baby!',
];
$content = $ua->request($req)->as_string;
print "Content-type: text/html\n\n";
print $content;
Run Code Online (Sandbox Code Playgroud) 我正在尝试向不可靠的服务器实现请求.请求是一个很好的,但我的perl脚本不能100%成功完成.问题是服务器偶尔会死锁(我们试图找出原因)并且请求永远不会成功.由于服务器认为它是活动的,它会使套接字连接保持打开状态,因此LWP :: UserAgent的超时值对我们来说没有任何好处.对请求强制执行绝对超时的最佳方法是什么?
仅供参考,这不是DNS问题.死锁与大量同时访问Postgres数据库的更新有关.出于测试目的,我们基本上在服务器响应处理程序中放置了while(1){}行.
目前,代码如下所示:
my $ua = LWP::UserAgent->new;
ua->timeout(5); $ua->cookie_jar({});
my $req = HTTP::Request->new(POST => "http://$host:$port/auth/login");
$req->content_type('application/x-www-form-urlencoded');
$req->content("login[user]=$username&login[password]=$password");
# This line never returns
$res = $ua->request($req);
Run Code Online (Sandbox Code Playgroud)
我尝试使用信号来触发超时,但这似乎不起作用.
eval {
local $SIG{ALRM} = sub { die "alarm\n" };
alarm(1);
$res = $ua->request($req);
alarm(0);
};
# This never runs
print "here\n";
Run Code Online (Sandbox Code Playgroud)
我将要使用的最终答案是有人离线提出的,但我会在这里提到它.出于某种原因,SigAction有效,而$ SIG(ALRM)却没有.仍然不确定为什么,但这已经过测试可行.这是两个工作版本:
# Takes a LWP::UserAgent, and a HTTP::Request, returns a HTTP::Request
sub ua_request_with_timeout {
my $ua = $_[0];
my $req = $_[1];
# Get whatever timeout is set for …
Run Code Online (Sandbox Code Playgroud) 我试图通过LWP :: UserAgent连接到远程主机,但当我试图使它与HTTPS一起工作时,我收到一条消息,
需要安装LWP :: Protocol :: https.(Perl 5.10.1,CentOS 6)
我试图用"CPAN"和"make"安装这个模块,但是有一些错误.我也尝试过强制安装LWP::Protocol::https
,现在它已经安装好的模块列表(ExtUtils::Installed
显示它),但脚本仍然写信给我501协议方案'https'不支持(LWP::Protocol::https
未安装).
首先,我需要添加ExtUtils::CBuilder
和ExtUtils::MakeMaker
.然后我尝试安装Crypt::SSLeay
,但收到这些消息:
Crypt-SSLeay-0.64/t/
Crypt-SSLeay-0.64/TODO
Crypt-SSLeay-0.64/typemap
Crypt-SSLeay-0.64/t/00-basic.t
Crypt-SSLeay-0.64/t/01-connect.t
Crypt-SSLeay-0.64/t/02-live.t
Crypt-SSLeay-0.64/lib/Crypt/
Crypt-SSLeay-0.64/lib/Net/
Crypt-SSLeay-0.64/lib/Net/SSL.pm
Crypt-SSLeay-0.64/lib/Crypt/SSLeay/
Crypt-SSLeay-0.64/lib/Crypt/SSLeay/Conn.pm
Crypt-SSLeay-0.64/lib/Crypt/SSLeay/CTX.pm
Crypt-SSLeay-0.64/lib/Crypt/SSLeay/Err.pm
Crypt-SSLeay-0.64/lib/Crypt/SSLeay/MainContext.pm
Crypt-SSLeay-0.64/lib/Crypt/SSLeay/X509.pm
Crypt-SSLeay-0.64/eg/lwp-ssl-test
Crypt-SSLeay-0.64/eg/net-ssl-test
Crypt-SSLeay-0.64/certs/ca-bundle.crt
Crypt-SSLeay-0.64/certs/notacacert.pem
Crypt-SSLeay-0.64/certs/notacakeynopass.pem
CPAN: File::Temp loaded ok (v0.2301)
CPAN: Parse::CPAN::Meta loaded ok (v1.4409)
CPAN: CPAN::Meta loaded ok (v2.132661)
CPAN: Module::CoreList loaded ok (v2.99)
CPAN.pm: Building N/NA/NANIS/Crypt-SSLeay-0.64.tar.gz
The test suite can attempt to connect to public servers to ensure that …
Run Code Online (Sandbox Code Playgroud) 有人可以帮我吗?我创建了一个Perl脚本来运行https任务.当我运行它时,我得到错误LWP :: Protocol :: https未安装.
我无法弄清楚,或找到关于如何安装LWP :: Protocol :: http的教程或命令.任何人都知道如何安装它?安装LWP非常简单.
我已经安装了LWP并安装了Crypt-SSLeay,但我仍然收到错误.这是我的代码:
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
# set custom HTTP request header fields
my $req = HTTP::Request->new(PUT => "https://thesite.com");
$req->header('Authorization' => 'myauth');
$req->header('Accept' => 'JSON:Application/JSON');
$req->header('Content-Type' => 'JSON:Application/JSON');
$req->header('Host' => 'api.thesite.com');
$req->content('Text' => 'thetext');
my $resp = $ua->request($req);
if ($resp->is_success) {
my $message = $resp->decoded_content;
print "Received reply: $message\n";
}
else {
print "HTTP POST error code: ", $resp->code, "\n";
print "HTTP POST error message: ", $resp->message, "\n";
} …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用LWP :: Simple获取维基百科页面,但它们并没有回来.这段代码:
#!/usr/bin/perl
use strict;
use LWP::Simple;
print get("http://en.wikipedia.org/wiki/Stack_overflow");
Run Code Online (Sandbox Code Playgroud)
不打印任何东西.但是,如果我使用其他网页http://www.google.com
,那么它可以正常工作.
我是否应该使用其他名称来引用维基百科页面?
这可能会发生什么?
我想知道是否有可能强制LWP :: UserAgent为单个知名服务器接受过期的SSL证书.Squid代理介于两者之间,问题稍微复杂一些.
我甚至设置了一个调试环境:
use warnings;
use strict;
use Carp;
use LWP::UserAgent;
use LWP::Debug qw(+);
use HTTP::Cookies;
my $proxy = 'http://proxy.example.net:8118';
my $cookie_jar = HTTP::Cookies->new( file => 'cookies.tmp' );
my $agent = LWP::UserAgent->new;
$agent->proxy( [ 'http' ], $proxy );
$agent->cookie_jar( $cookie_jar );
$ENV{HTTPS_PROXY} = $proxy;
$ENV{HTTPS_DEBUG} = 1;
$ENV{HTTPS_VERSION} = 3;
$ENV{HTTPS_CA_DIR} = '/etc/ssl/certs';
$ENV{HTTPS_CA_FILE} = '/etc/ssl/certs/ca-certificates.crt';
$agent->get( 'https://www.example.com/');
exit;
Run Code Online (Sandbox Code Playgroud)
幸运的是,在我能够提出自己的解决方案之前,问题最终已在远程服务器上得到修复,但我希望能够有选择地避免问题再次出现(基础服务在我之前已经中断了几个小时)被召唤行动).
如果存在这样的解决方案,我倾向于使用基于Crypt :: SSLeay或openSSL实现的LWP :: UserAgent级别的解决方案,因为我不想放松其他不相关应用程序的安全性.当然,在我丰富的空闲时间里,我仍然在寻找这样一个解决方案.