使用Perl/cURL编写脚本,无法通过两次提交并单击()onload的HTML表单

使用Perl/cURL编写脚本,无法通过两次提交并单击()onload的HTML表单,html,perl,curl,Html,Perl,Curl,我正在制作一个脚本,其中一个主要部分是通过名为Feide的系统登录。我使用了Perl和cURL,并且我已经成功地登录并制作了一个会话cookie,但是由于cURL不支持Javascript,我必须按下一个按钮,因为您的浏览器不支持Javascript,您必须按下下面的按钮一次才能继续。获取我想要访问的站点的内容。不幸的是,这种形式很奇怪。当我运行脚本时,它只是将我重定向回同一个站点,我不知道为什么。以下是HTML: <body onload="document.getElementsByT

我正在制作一个脚本,其中一个主要部分是通过名为Feide的系统登录。我使用了Perl和cURL,并且我已经成功地登录并制作了一个会话cookie,但是由于cURL不支持Javascript,我必须按下一个按钮,因为您的浏览器不支持Javascript,您必须按下下面的按钮一次才能继续。获取我想要访问的站点的内容。不幸的是,这种形式很奇怪。当我运行脚本时,它只是将我重定向回同一个站点,我不知道为什么。以下是HTML:

<body onload="document.getElementsByTagName('input')[0].click();">

<noscript>
    <p><strong>Note:</strong> Since your browser does not support JavaScript, you must press the button below once to proceed.</p> 
</noscript> 

<form method="post" action="https://innsida.ntnu.no/c/portal/login">

<!-- Need to add this element and call click method, because calling submit()
on the form causes failed submission if the form has another element with name or id of submit.
See: https://developer.mozilla.org/en/DOM/form.submit#Specification -->

    <input type="submit" style="display:none;" />

    <input type="hidden" name="SAMLResponse" value="[very long value]" />
    <input type="hidden" name="RelayState" value="https://innsida.ntnu.no" />

        <noscript>
            <input type="submit" value="Submit" />
        </noscript>
</form>

</body>
当然,我不能把我的用户名和密码放在这里,所以你们不能自己尝试。希望有人能找到解决方案

我将在结尾处发布整个HTML代码以及脚本的输出,以防有人感兴趣:

     HTTP/1.1 302 Found
     Date: Wed, 24 Feb 2016 10:35:10 GMT
     X-Content-Type-Options: nosniff
     X-Frame-Options: SAMEORIGIN
     X-XSS-Protection: 1
     Pragma: no-cache
     Cache-Control: no-cache, no-store
     Expires: Thu, 01 Jan 1970 00:00:00 GMT
     Location: https://idp.feide.no/simplesaml/saml2/idp/SSOService.php?SAMLRequest=[removed for security purposes]
     Content-Length: 0

    HTTP/1.1 200 OK
    Date: Wed, 24 Feb 2016 10:35:10 GMT
    Server: Apache/2.2.24 (Unix)
    X-Powered-By: PHP/5.3.26
    Content-Length: 7866
    Content-Type: text/html

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head> 
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        <title>POST data</title>
    </head>
    <body onload="document.getElementsByTagName('input')[0].click();">

<noscript>
    <p><strong>Note:</strong> Since your browser does not support JavaScript, you must press the button below once to proceed.</p> 
</noscript> 

<form method="post" action="https://innsida.ntnu.no/c/portal/login">
<!-- Need to add this element and call click method, because calling submit()
on the form causes failed submission if the form has another element with name or id of submit.
See: https://developer.mozilla.org/en/DOM/form.submit#Specification -->
<input type="submit" style="display:none;" />
    <input type="hidden" name="SAMLResponse" value="[ridiculously long value]==" />
    <input type="hidden" name="RelayState" value="https://innsida.ntnu.no" />
            <noscript>
        <input type="submit" value="Submit" />
            </noscript>
        </form>

    </body>
    </html>

我怀疑表单未验证,因此您被重定向到同一表单。如果他们没有任何特殊类型的脚本保护,您应该能够通过转到浏览器上“开发人员工具”的“网络”选项卡并选择“复制为cURL”来创建有效的请求。这将为您提供根据有效请求设置的所有选项的列表


这将有助于您通过重定向循环。

我怀疑表单未验证,因此您被重定向到同一表单。如果他们没有任何特殊类型的脚本保护,您应该能够通过转到浏览器上“开发人员工具”的“网络”选项卡并选择“复制为cURL”来创建有效的请求。这将为您提供根据有效请求设置的所有选项的列表


这将帮助您通过重定向循环。

在PHP中,您可以执行$inputs=array$domd=@DOMDocument::loadHTML$html;foreach$domd->getElementsByTagNameform->item0->getElementsByTagNameinput作为$input{$inputs[$input->getAttributename]=$input->getAttributevalue;}curl\u setopt$ch,CURLOPT\u POSTFIELDS,$inputs;你没有说明你的问题是什么。提交表单时会发生什么情况?您是否尝试在浏览器中提交表单,并从中复制字段?“网络”选项卡,然后复制。对不起,我忘了在正文开头说明问题。当我提交表单时,我被重定向回同一个站点,没有任何更改。编辑它,希望现在更清晰。您是否尝试将请求复制为网络选项卡中的cURL,从命令行检查它是否工作,并查看您是否设置了脚本中设置的所有字段?@bolav现在尝试一下在PHP中您将执行$inputs=array$domd=@DOMDocument::loadHTML$html;foreach$domd->getElementsByTagNameform->item0->getElementsByTagNameinput作为$input{$inputs[$input->getAttributename]=$input->getAttributevalue;}curl\u setopt$ch,CURLOPT\u POSTFIELDS,$inputs;你没有说明你的问题是什么。提交表单时会发生什么情况?您是否尝试在浏览器中提交表单,并从中复制字段?“网络”选项卡,然后复制。对不起,我忘了在正文开头说明问题。当我提交表单时,我被重定向回同一个站点,没有任何更改。编辑它,希望现在更清晰。您是否尝试将请求复制为“网络”选项卡中的cURL,检查它是否可以从命令行运行,并查看您是否设置了脚本中设置的所有字段?@bolav现在尝试一下它它为我提供了更多可操作的内容。我用请求更新了帖子。非常感谢。它给了我更多的工作机会。我用请求更新了帖子。谢谢。
     HTTP/1.1 302 Found
     Date: Wed, 24 Feb 2016 10:35:10 GMT
     X-Content-Type-Options: nosniff
     X-Frame-Options: SAMEORIGIN
     X-XSS-Protection: 1
     Pragma: no-cache
     Cache-Control: no-cache, no-store
     Expires: Thu, 01 Jan 1970 00:00:00 GMT
     Location: https://idp.feide.no/simplesaml/saml2/idp/SSOService.php?SAMLRequest=[removed for security purposes]
     Content-Length: 0

    HTTP/1.1 200 OK
    Date: Wed, 24 Feb 2016 10:35:10 GMT
    Server: Apache/2.2.24 (Unix)
    X-Powered-By: PHP/5.3.26
    Content-Length: 7866
    Content-Type: text/html

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head> 
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        <title>POST data</title>
    </head>
    <body onload="document.getElementsByTagName('input')[0].click();">

<noscript>
    <p><strong>Note:</strong> Since your browser does not support JavaScript, you must press the button below once to proceed.</p> 
</noscript> 

<form method="post" action="https://innsida.ntnu.no/c/portal/login">
<!-- Need to add this element and call click method, because calling submit()
on the form causes failed submission if the form has another element with name or id of submit.
See: https://developer.mozilla.org/en/DOM/form.submit#Specification -->
<input type="submit" style="display:none;" />
    <input type="hidden" name="SAMLResponse" value="[ridiculously long value]==" />
    <input type="hidden" name="RelayState" value="https://innsida.ntnu.no" />
            <noscript>
        <input type="submit" value="Submit" />
            </noscript>
        </form>

    </body>
    </html>
curl 'https://innsida.ntnu.no/c/portal/login' 
-H 'Host: innsida.ntnu.no' 
-H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' 
-H 'Accept-Language: en-US,en;q=0.5' --compressed -H 'DNT: 1' -H 'Referer: https://idp.feide.no/simplesaml/module.php/feide/login.php?asLen=225&AuthState= [removed]https%253A%252F%252Finnsida.ntnu.no' 
-H 'Cookie: COOKIE_SUPPORT=true; GUEST_LANGUAGE_ID=nb_NO; JSESSIONID=[removed].innsidaprod01; LFR_SESSION_STATE_111384=[removed]; LFR_SESSION_STATE_10135=[removed] -H 'Connection: keep-alive' 
--data 'SAMLResponse=[long value]&RelayState=https%3A%2F%2Finnsida.ntnu.no'