1

このフォームを使用して認証するために3つの入力があるWebサイトにログインしようとしました。

<form action="/login.html" method="post">
<div class="loginlabel1 aright">ID / Email: </div>
<div class="bsearchfield">
<input type="text" name="profid" class="inputBx" size="15" value="" />
</div>
<div class="clear"></div>
<div class="loginlabel1 aright">Password: </div>
<div class="bsearchfield">
<input type="password" name="password" class="inputBx" size="15" value="" />
</div>
<div class="clear"></div>
<div class="loginbutton1">
<input name="login"type="image" src="images/logi.gif" align="right" border="0" />
</div>
</form>

ブラウザからログインすると、ログインに成功するとhttp://www.example.com/myhome.htmlにリダイレクトされます。

しかし、次のスクリプトはログインしておらず、同じlogin.htmlページを返します。私は何か見落としてますか?エラーメッセージが表示されません。投稿は成功しましたか?

#!/usr/bin/perl -w
use LWP 5.64;
my $browser = LWP::UserAgent->new || die " Failed LWP USER AGENT : $!";
$ENV{HTTP_proxy} = "http://proxy:port";
$browser->env_proxy;
$browser->cookie_jar({});
my @Header    = (
                    'User-Agent'      => 'Mozilla/4.76 [en] (Win98; U)',
                    'Accept'          => 'image/gif, image/x-xbitmap, image/jpeg,image/pjpeg, image/png, */*',
                    'Accept-Charset'  => 'iso-8859-1,*,utf-8',
                    'Accept-Language' => 'en-US',
              );

push @{$browser->requests_redirectable}, 'POST';
$response = $browser->post(
    "http://www.example.com/login.html",
    [
        'profid'   => 'username',
        'password' => 'password'
    ],@Header
);

$response->is_success or die "Failed to post: ", $response->status_line;
print "Successfully posted username and password.\n" if $response->is_fresh;

#printf("%s",$response->content);
printf("%s\n", $response->status_line);
printf("%s",   $response->header("Accept-Ranges"));
printf("%s",   $response->header("Age"));
printf("%s",   $response->header("ETag"));
printf("%s",   $response->header("Location"));
printf("%s",   $response->header("Proxy-Authenticate"));
printf("%s",   $response->header("Retry-After"));
printf("%s",   $response->header("Server"));
printf("%s",   $response->header("Vary"));
printf("%s",   $response->header("WWW-Authenticate"));
delete $ENV{HTTP_PROXY};
4

4 に答える 4

2

送信ボタンは画像です。画像タイプの入力をクリックすると、ブラウザはクリックした場所のピクセル座標を CGI に送信します。あなたのフォームでは、ブラウザーはlogin.xand とlogin.y一緒にprofidandを送信しpasswordます。

ところで、Firebugは CGI をデバッグするための優れたツールです。

于 2011-04-08T08:14:45.133 に答える
1

場合によっては、正しい accept-encoding ヘッダーやリファラー ヘッダーが必要になることがあります。確かに、ユーザーエージェントヘッダーも試してみます。

于 2011-04-07T21:11:55.713 に答える
0

Firefox 用のLiveHTTPHeadersもお勧めします。オンにしてからフォームを送信すると、すべてのヘッダー、パラメーター、および Cookie を含む、サイトに対して GET または POST された内容が正確に表示され、設定された Cookie、ヘッダー、およびリダイレクトを含むサーバーからのすべての応答が表示されます。 .

フォームを見ただけでは表示されない追加のパラメーターを作成するページに JavaScript がある可能性があります。画像は上記の PacoRG のように調整されます。または、最初に Cookie を受け入れてログイン時に送信する必要がある場合があります。

LiveHTTPHeaders では、ヘッダーを変更して「再生」することもできます。これにより、サーバーに送信されるもの (ヘッダー、Cookie、パラメーターなど) を変更して、サーバーがログインするために実際に必要なものを判断するのに役立ちます。

また、LWP はデフォルトで自動的にリダイレクトに従うと思います。そのため、実際にはページがリダイレクトされていて、それが表示されていない可能性があります (「simple_request」関数は redir に従っていないと思います)。

LWP 応答では、次のようにリダイレクトを逆にたどることができます。

my $prev_res = $res->previous();
while ( $prev_res ) {
    print $prev_res->status_line . "\n";
    $prev_res = $prev_res->previous();
}

お役に立てれば!

于 2011-04-08T11:31:54.610 に答える
-1

クリックされた送信ボタンの名前を送信していません。もう一方のコードは、フォームが送信されたかどうかを確認するために、リクエストにその変数が存在するかどうかをチェックしていると思われます。

PacoRGが指摘しているように、送信ボタンは画像です。そのため、ブラウザでそのボタンをクリックして送信すると、「login」とともに「login.x」および「login.y」という名前のフィールドが送信されます。

このような問題を回避する良い方法は、WWW :: Mechanizeを使用して、多くの作業を行うことです。たとえば、次のようになります。

my $mech = WWW::Mechanize->new;
$mech->get('http://www.example.com/login.html');
$mech-submit_form(
    with_fields => {
        profid => $username,
        password => $password,
    },
);

上記はログインページを要求し、適切なフォームを見つけて送信します。

また、他の人が言っているように、スクリプトからのリクエストがブラウザからのリクエストとは異なる方法で処理される場合、デバッグする最良の方法は、送信する完全なHTTPリクエストを取得し、適切な違いを探すことです。ブラウザの場合、FirefoxのLiveHTTPHeadersやTamper Dataプラグインなどの拡張機能を使用するか、Wiresharkなどを使用して送信されたリクエストをキャプチャできます。スクリプトの場合、送信中のリクエストを簡単に出力させることができます。

たとえば、LWP::UserAgentまたはWWW::Mechanize(LWP :: UserAgentをサブクラス化する)を使用するスクリプトの場合、次を追加できます。

$mech->add_handler("request_send", sub { shift->dump; return });
$mech->add_handler("response_done", sub { shift->dump; return });

これにより、サーバーからの生の応答とともに、送信された生の要求がダンプされます。(例で$mechは、LWP :: UserAgent / WWW :: Mechanizeオブジェクトが含まれている変数に変更し$browserます。)

于 2011-04-08T16:03:43.053 に答える