如何使用 perl(和 JS?)登录这个网站?

Posted

技术标签:

【中文标题】如何使用 perl(和 JS?)登录这个网站?【英文标题】:How do I log into this website using perl (and JS?)? 【发布时间】:2021-10-25 10:09:06 【问题描述】:

我目前正在尝试使用 perl 自动登录到下面的网站。我曾尝试使用 mechanize,但我相信它需要 JS 功能。我查看了 JavaScricpt Mech 插件,但文档对我来说不是很容易理解。我不知道如何进一步解决这个问题,因为我看不到 md5() 函数,所以我无法在 perl 代码中重建它......

相关位是:

html

<form method="POST" name="logonForm" onsubmit="encode();document.submitForm.submit();return false;">
<tr class="Element">
    <td class="text" id="ID_Text4"><nobr>User name:</nobr></td>
    <td  class="text" align="left">
        <select name="username"  style="width:125">
            <option value="user" id="ID_Text5">user&nbsp; </option>
            <option selected value="admin" id="ID_Text6">admin&nbsp;</option>
        </select>
    </td>
</tr>
<tr class="Element">
    <td class="text" id="ID_Text7"><nobr>Password:</nobr></td>
    <td  class="text">
        <input type="password" size="10" name="password" style="width:125">
    </td>
</tr>
<form method="POST" name="submitForm">
   <input type="hidden" name="encoded">
   <input type="hidden" name="nonceA" value="">
   <input type="button" name="goto" value="Log On" onClick="encode();submit();" style="width:125" ID="ID_Button1">
   <input type="hidden" name="URL" value="/">

JS:

function encode() 
   
    // sets the hidden field value to whatever md5 returns.
    document.submitForm.encoded.value = document.logonForm.username.value + ":" + md5(document.logonForm.username.value + ":" + document.logonForm.password.value + ":" + document.submitForm.nonceA.value);
    /* Dont used */
    document.submitForm.URL.disabled = true;

【问题讨论】:

你试过Selenium::Chrome 吗?另见Spidering websites with Headless Chrome and Selenium @HåkonHægland 这可能对我有用,但你知道这是否也适用于便携式 chrome 版本?我在运行它的所有系统上都没有安装 chrome... 是的,你需要安装chrome,见Is Chrome installation needed or only chromedriver when using Selenium? 看看 WWW::Mechanize::Chrome。 是否还有不涉及安装非标准windows浏览器的解决方案? 【参考方案1】:

您是否尝试过 Digest::MD5 中的 md5 函数?

use Digest::MD5 qw(md5)
use WWW::Mechanize;

my $encoded = $username . ':' . md5($username . ':' . $password . ':' . $nonce);
$mech->post(
    $url,
    Content => 
        'encoded' => $encoded,
        'nonceA' => $nonce,
        ....
    ,
);

【讨论】:

【参考方案2】:

我注意到从未设置过“nonceA”值,因此我复制了 html 和 js 依赖项并在本地运行 html。我在 html 中使用了window.prompt(document.submitForm.encoded.value); 来查看正在发送的内容。然后我将此值复制到我的 perl 脚本并相应地设置“编码”值:

my $form = $mech->form_name('submitForm');
$form->value('encoded', '<copied here>');

之后我使用:

$mech->submit_form();

这对我有用。

【讨论】:

以上是关于如何使用 perl(和 JS?)登录这个网站?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Perl 连接到 MySQL?

如何自动化ssh登录,其中perl脚本用户需要2个密码

如何设置我的网站以便用户可以使用元掩码登录?

如何主持静态网站只有cognito和s3

js的逆向解析

如何从 perl 脚本登录 OBIEE 服务器凭据 [关闭]