Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的php CURL登录脚本在asp页面中未成功_Php_Asp.net_Curl_Single Sign On_Siteminder - Fatal编程技术网

我的php CURL登录脚本在asp页面中未成功

我的php CURL登录脚本在asp页面中未成功,php,asp.net,curl,single-sign-on,siteminder,Php,Asp.net,Curl,Single Sign On,Siteminder,我想使用php CURL脚本登录到一个网站,但在最后一步,它被重定向到一个循环中 在使用Firefox和Internet Explorer时,我使用Fiddler捕获HTTP请求和响应。我在脚本中重新创建了步骤 该站点有几个步骤,包括302重定向、表单提交前的JavaScript设置cookie以及位置重定向 所有这些都进展顺利,直到最后一步。该网站加载以下内容 HTTP/1.1 200 OK Connection: Keep-Alive Server: Microsoft-IIS/5.

我想使用php CURL脚本登录到一个网站,但在最后一步,它被重定向到一个循环中

在使用Firefox和Internet Explorer时,我使用Fiddler捕获HTTP请求和响应。我在脚本中重新创建了步骤

该站点有几个步骤,包括302重定向、表单提交前的JavaScript设置cookie以及位置重定向

所有这些都进展顺利,直到最后一步。该网站加载以下内容

    HTTP/1.1 200 OK
Connection: Keep-Alive
Server: Microsoft-IIS/5.0
Date: Sun, 12 Aug 2012 15:51:55 GMT
X-Powered-By: ASP.NET
Set-Cookie: SMSESSION=*omitted by me*; path=/; domain=website.com
Content-Length: 511
Content-Type: text/html
Set-Cookie: BIGipServerPortal_80_Green=3741601290.20480.0000; expires=Sun, 12-Aug-2012 17:51:57 GMT; path=/
Cache-Control: private
X-PvInfo: [S10201.C29051.A26868.RA0.G7175.U147B7189].[OT/html.OG/pages]
Vary: Accept-Encoding, User-Agent
Content-Encoding: gzip



<!--START:INC\common\include.asp-->
<!--START:INC\common\errorfns.asp-->

<!--END:INC\common\errorfns.asp--><!--START:INC\common\newconstant.asp-->

<!--END:INC\common\newconstant.asp--><!--START:INC\common\securityfns.asp-->

<!--END:INC\common\securityfns.asp--><!--START:INC\common\newptintllocales.asp-->

<!--END:INC\common\newptintllocales.asp-->

<!--START:INC\common\newptintl.asp-->


<!--END:INC\common\newptintl.asp-->

<!--START:INC\common\newutility.asp-->

<!--END:INC\common\newutility.asp-->
<!--END:INC\common\include.asp--><!--START:INC\sso\vendors\ActiveDirectoryServer.asp-->


<!--END:INC\sso\vendors\ActiveDirectoryServer.asp--><!--START:INC\sso\vendors\netegrity.asp-->


<!--END:INC\sso\vendors\netegrity.asp--><!--START:INC\sso\vendors\oblix.asp-->


<!--END:INC\sso\vendors\oblix.asp-->
<!--START:INC\sso\vendors\securant.asp-->


<!--END:INC\sso\vendors\securant.asp--><!--START:INC\sso\vendors\Tivoli.asp-->


<!--END:INC\sso\vendors\Tivoli.asp-->
<!--START:INC\sso\vendors\customsso.asp-->


<!--END:INC\sso\vendors\customsso.asp-->
<!--START:INC\sso\ssoutility.asp-->


<!--END:INC\sso\ssoutility.asp-->
<!--START:INC\sso\sso.asp-->


    <HTML>
        <BODY onload="javascript:void(document.dologin.submit())">
            <FORM ACTION="../admin/dologin.asp" METHOD="POST" NAME="dologin">
                <INPUT TYPE="HIDDEN" NAME="RedirectURL" VALUE="">
                <INPUT TYPE="HIDDEN" NAME="ssoMode" VALUE="1">
            </FORM>
        </BODY>
    </HTML>



<!--END:INC\sso\sso.asp-->
我使用Fiddler复制和粘贴浏览器和CURL的执行,并逐行比较它们。两者发送的信息相同,我没有丢失任何cookies

我能看到的唯一区别是发送头的顺序和发送cookie的顺序

我已经调整了CURL以发送与firefox相同的标题,但无法获得相同的顺序

FireFox头文件

GET https://www.website.aa.com/ HTTP/1.1 
Host: www.website.com
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip, deflate
Connection: keep-alive
卷曲收割台

GET /login/SMLogin.jsp? HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1
Host: www.website.com
Accept-Encoding: gzip, deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Connection: keep-alive
最大的区别是CURL在HOST:之前发送用户代理,而Accept编码的顺序不同。 我试图通过设置不同顺序的CURL选项来重新安排事情,但似乎无法获得与Firefox相同的顺序

以下是我的CURL选项(我省略了选择GET或POST并创建querystring的步骤)

另一个区别是发送cookies的顺序。因为我让你卷曲 负责饼干管理,我无法控制订单。除非我自己管理COOKIE并使用
CURLOPT_COOKIE
选项设置它们,但这似乎很痛苦

那么,标题的顺序和/或发送的cookie的顺序是否很可能告诉服务器我的脚本不是真正的浏览器,并将我从受保护的内容中重定向出去?如果是这样,我该如何改变这一点?还是我错过了什么

编辑这是针对@MARC_B的评论,“javascript设置cookies”说明了一切

是的,我知道CURL不做javascript。我已经检查了javascript,并在脚本中复制了操作。在提交登录表单后的一个页面上,javascript验证用户名,然后设置cookie

if (validate) {
        document.cookie = "loggedIn=yes";
        document.Login.submit();
}
因此,在检索页面后,脚本将上述cookie写入cookie文件

$handle = fopen("cookies.txt", "a");

$cookie = "website.com  FALSE   /login/ FALSE   0   loggedIn    yes";

fwrite($handle, $cookie);
fclose($handle);
其他javascript操作只是自动提交表单,只需要执行CURL进行复制

我已经取得了进展。在谷歌搜索了一天之后,我发现其中一个webforms是保护资源的软件的一部分。链接文档显示表单收集正在使用的浏览器。agentname在表单中被加密(不确定为什么需要)。我找不到任何关于浏览器为什么重要的文档。我想知道encryted字符串是从agentname头创建的,还是使用发送的头名称的组合和顺序创建的

我开始脚本时没有设置cookies。在第二次逐行查看响应标题之后,我将重点放在了2个特定的cookie上。响应中从未设置2个cookie中的脚本1的每次运行。但如果每次都不一样

我决定用Firefox登录时显示的所有cookie设置cookie文件。这一次,脚本在对上述页面进行一次循环之后,继续进入一个新页面。新页面包含检测浏览器类型和设置的JavaScript。分析该页面需要一些时间

所以答案似乎是我错过了几个必要的饼干中的一个。


如果有人能对Siteminder生态系统和asp的典型登录脚本有所了解,我很想听听。

试着调试js函数并对其进行emu。如果你不能,那么curl就帮不了你。

javascript设置cookies说明了一切。curl只做HTTP。它不会在检索到的html中执行任何JS,PHP也不会。只有一个cookie集,我在脚本中创建了cookie,并将其保存在cookie文件中。它提交正确。这不是问题所在。
if (validate) {
        document.cookie = "loggedIn=yes";
        document.Login.submit();
}
$handle = fopen("cookies.txt", "a");

$cookie = "website.com  FALSE   /login/ FALSE   0   loggedIn    yes";

fwrite($handle, $cookie);
fclose($handle);