Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.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 HTTP Post登录和重定向_Php_Redirect_Cookies_Curl - Fatal编程技术网

Php Curl HTTP Post登录和重定向

Php Curl HTTP Post登录和重定向,php,redirect,cookies,curl,Php,Redirect,Cookies,Curl,我正在尝试创建一个自动登录到本地路由器的页面。我目前正在使用CURL登录页面并进行身份验证。这部分代码似乎工作正常。我遇到的问题是,一旦CURL进行了身份验证,我需要将用户重定向到此页面,以便他们可以导航,但是,我还需要使用CURL收集的cookies 这是我目前的代码 $data = array( 'username' => 'admin', 'password' => 'admin', ); $ch = @curl_init(); curl_setopt($ch, CURLOPT

我正在尝试创建一个自动登录到本地路由器的页面。我目前正在使用CURL登录页面并进行身份验证。这部分代码似乎工作正常。我遇到的问题是,一旦CURL进行了身份验证,我需要将用户重定向到此页面,以便他们可以导航,但是,我还需要使用CURL收集的cookies

这是我目前的代码

$data = array(
'username' => 'admin',
'password' => 'admin',
);
$ch = @curl_init();
curl_setopt($ch, CURLOPT_URL,'http://192.168.69.1:65080/login.cgi');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'public_html/cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'public_html/cookie.txt');

$result = curl_exec ($ch);
$info = curl_getinfo($ch);
curl_close ($ch); 

print_r($result);
print_r($info);


//Working until this point
preg_match('/^Set-Cookie:\s*([^;]*)/mi', $result, $m);
parse_str($m[1], $cookies);

foreach($cookies as $key=>$cookie)
{
     setcookie($key, $cookie, time() + 60*60*24*30, '/');
}

header("location:".$info['redirect_url']);
正如您所看到的,我找到了一个代码段来循环查看
$result
信息,然后在重定向之前将它们设置为cookie,但是,这无法正常工作,我被重定向到登录页面而不是索引页面

如果我在关闭CURL之前再调用一次,使用重定向url作为url,我确实会得到索引页面的部分打印,但是,不会显示重要的图像等。但是我需要能够访问页面并导航,而不是简单地打印页面

这是打印的
$result

HTTP/1.1 302 Found
Location: /index.cgi
Set-cookie: show_security_warning=deleted; expires=Sunday, 09-Jun-13 10:54:00 GMT
Set-cookie: ui_language=en_US; expires=Tuesday, 19-Jan-38 03:14:07 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Date: Mon, 09 Jun 2014 10:54:01 GMT
Server: lighttpd/1.4.31
这是
$info

Array
(
    [url] => http://192.168.69.1:65080/login.cgi
    [content_type] => text/html
    [http_code] => 302
    [header_size] => 314
    [request_size] => 251
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.484
    [namelookup_time] => 0
    [connect_time] => 0
    [pretransfer_time] => 0
    [size_upload] => 255
    [size_download] => 0
    [speed_download] => 0
    [speed_upload] => 526
    [download_content_length] => -1
    [upload_content_length] => 255
    [starttransfer_time] => 0
    [redirect_time] => 0
    [certinfo] => Array
        (
        )

    [redirect_url] => http://192.168.69.1:65080/index.cgi
)
这是我的cookie.txt

# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

192.168.69.1    FALSE   /   FALSE   0   AIROS_SESSIONID d19e097a07b7b76fd7d90267a8e1f4d2
192.168.69.1    FALSE   /   FALSE   1370775278  show_security_warning   deleted
192.168.69.1    FALSE   /   FALSE   2147483647  ui_language en_US
最后,这里是
$cookies

Array
(
    [show_security_warning] => deleted
)

如果有人能为我指出下一步的正确方向,我将不胜感激。

我不确定你的策略是否会成功

Curl是一个web客户机。这意味着Curl和您的web浏览器可能被路由器视为不同的主机

[CLIENT (WEB BROWSER)] ---HTTP---> [PHP WEBSERVER]
                                   [CURL] ---HTTP---> [ROUTER (WEBSERVER)]  
PHP有一个特殊的行为:它将会话存储在文件中,这些文件的名称仅取决于会话id cookie值,因此(或者……我不知道PHP的所有版本)可以通过捕获会话cookie/克隆cookie值来窃取会话

并不是所有的CGI库都在做同样的事情。我相信你的路由器有一个更安全的会话存储方法,因为它应该来自一个安全专用设备(例如 基于客户端IP和会话cookie值的密钥)。 在这种情况下,你的方法是无用的


您最好使用一个基于javascript的表单(以便发布id/密码)和一个iframe请求路由器登录页面(以便初始化路由器cookie值)。使用javascript表单将向您的用户显示凭证,这可能不是您想要的

我仍在为上述内容绞尽脑汁,但是,如果我添加这一行
curl\u setopt($ch,CURLOPT\u FOLLOWLOCATION,true)
然后返回包含所有字段和ie状态等必要信息的页面。但是,由于页面使用javascript填充,这些字段和信息都没有任何值。CURL无法解析这个,因此我正在研究类似于phantom.js的东西,但我不抱希望。我仍然想知道我是如何使用CURL收集的饼干的。但这些cookie似乎是针对127.0.0.1的,而不是我认为是另一个问题的路由器IP。我担心可能是这样。我确实看过Javascript iframe和form submit,但我在跨域等方面遇到了问题。如果你有一个解决方案,我还有另一个问题要问这个方法,只有你回答了,所以你没有太多的悬赏竞争。非常感谢您的帮助,我最终通过创建chrome扩展解决了我的问题。但正如你所说,我并没有进一步使用CURL。