【问题标题】:LWP::UserAgent's env_proxy gives "Access is denied" for non-admin usersLWP::UserAgent 的 env_proxy 为非管理员用户提供“访问被拒绝”
【发布时间】:2013-11-04 16:31:19
【问题描述】:

环境: - 活动 Perl 5.16 - Windows 2003 服务器 - 带有 Windows 身份验证的 IIS 6

我试图在 Perl CGI 脚本中使用 Perl 模块“LWP::Simple”,它对服务器上的“管理员”运行良好(使用 Windows 身份验证,IIS/CGI 环境知道用户的 Windows 用户名和我们中的一些人(比如我)是服务器上的管理员)。然而,对于我们所有其他的非管理员用户,他们得到“指定的 CGI 应用程序因未返回完整的 HTTP 标头集而行为不端”。我将其缩小到“使用 LWP::Simple”这一行;如果线路在,非管理员会收到错误;如果线路中断,任何人都不会出错。

由于这是一个“使用”行,在我看来,在 IIS 下调试错误是不可能的(没有像样的错误日志!),所以我分解了 LWP::Simple 模块(它只使用了很多 LWP: :UserAgent 的东西)并创建了以下简单的脚本来重现潜在的错误:

#!perl

use strict;
use warnings;

use CGI::Pretty qw(:standard -any -no_xhtml -oldstyle_urls *center);
use CGI::Carp qw(fatalsToBrowser set_message);
use LWP::UserAgent;

print header;

my $ua = LWP::UserAgent->new;  # we create a global UserAgent object
$ua->env_proxy;
print "<hr>\n";

my $response = $ua->get('http://search.cpan.org/');

if ($response->is_success) {
     print $response->decoded_content;  # or whatever
}
else {
     die $response->status_line;
}

由于错误没有发生在“使用”行中,我们不会得到可怕的 missing-http-headers 错误,而真正的错误会出现在屏幕上:

Access is denied

这让我可以缩小到一行:

$ua->env_proxy;

如果该行在代码中,非管理员的屏幕上会显示“访问被拒绝”字样(管理员不会收到任何错误)。在这两种情况下,脚本的其余部分都可以正常工作,但是这个错误会阻止 LWP::Simple 工作(错误发生在“use”行并给出了 missing-http-headers 错误)。

虽然我的解决方法是不使用 LWP::Simple 而是使用 LWP::UserAgent(跳过 "$ua->env_proxy" 部分),我真的很想知道为什么 "$ua->env_proxy " 为非管理员提供“访问被拒绝”

谁能帮我解决这个问题?

【问题讨论】:

  • 你从perl -MEncode -MEncode::Locale -e'print(decode("locale", "abc"))'得到同样的错误吗?
  • 不,我得到输出“abc”。但是,我不能让 CLI Perl 出现问题,只有 CGI Perl。我在 CLI(DOS 提示符)下运行了相同的 CGI 脚本,并且没有发生错误。我需要一个不是本地 PC 上的管理员(用于 CLI 测试)而不是服务器上的管理员(用于 CGI 测试)的帐户,而且我没有一个至少不是本地管理员的帐户。
  • use Encode; use Encode::Locale; print "Content-Type: text/plain\n\n"; print(decode("locale", "abc"));
  • @ikegami:在 CGI 中运行它会为管理员提供干净的“abc”输出,但会为非管理员提供“指定的 CGI 应用程序因未返回完整的 HTTP 标头集而行为不端”错误.是什么让你从 LWP 的 env_proxy 跳到 Encode::Local?非管理员是否存在已知问题?
  • 这是env_proxy 中唯一可以做任何非简单 Perl 代码的事情。您只需要继续跟踪,直到找到问题或解决方法。

标签: perl cgi lwp-useragent


【解决方案1】:

结束我的这个老问题。

根本问题是对chcp 的系统调用,这是一个仅限管理员使用的 Windows 命令。没有“干净”的解决方案。注释掉该调用的行,或者在您的路径中添加另一个chcp,该路径将在内置/仅限管理员版本之前找到。

感谢 @ikegami 提供的富有洞察力的 cmets,即使没有彻底解决,它们至少帮助我找出了“原因”。

【讨论】:

  • 我在 GitHub (github.com/gisle/encode-locale/issues/6) 上为此提交了一个错误,并且刚刚解决。不确定代码何时会正式发布,但如果这对您有影响,您可以从那里的源文件更新 Encode::Locale。
猜你喜欢
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多