卷曲HTTP后登录和重定向

时间:2014-06-09 10:59:24

标签: php redirect cookies curl

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

这是我目前的代码

$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
)

如果有人能指出我如何实现下一步的正确方向,我将非常感激。

1 个答案:

答案 0 :(得分:1)

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

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表单将向您的用户显示可能不是您想要的凭据