已经登录后,PHP cURL进入经过身份验证的站点

时间:2011-08-09 14:21:23

标签: php cookies curl

所以我有一个脚本作为get参数传递了一个URL,因此尝试将该页面的内容写入文件。在未经过身份验证的页面上,它工作正常,但是当我尝试在需要身份验证的页面上使用它时,它会中断。

具体来说,这些是我已经登录的页面,所以我假设制作一个标准的cURL请求,我目前设置的所有Cookie都可以使用,但它没有。最初,我收到了302回复,但是如果我设置了“跟进”#39;如果是这样,我最终会访问网站的登录页面,而不是我想要的网页。

$client = curl_init();

//curl_setopt($client, CURLOPT_HEADER, true);
curl_setopt($client, CURLOPT_RETURNTRANSFER, true);
curl_setopt($client, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($client, CURLOPT_URL, $pageToLoad);     

/* Supposedly libcurl loads all cookies auto-magically if you don't set CURL_COOKIESESSION
if (isset($_SERVER['HTTP_COOKIE'])) {
  curl_setopt($client, CURLOPT_COOKIE, $_SERVER['HTTP_COOKIE']);
}
*/

$response = curl_exec($client);
curl_close($client);

我有一种沉闷的感觉,我需要为此设置一个cookiejar文件('沉没',因为我的脚本在开发服务器上没有写权限) ,但你有什么想法?

修改: 所以,作为一个白痴,事实证明我确实有一些写访问...无论如何,在我的主目录中创建了一个临时文件夹,我已经验证了我的脚本可以写:

$fname = '/home/temp/cookies.txt';
if( $save = fopen($fname, 'w') ) {
  fwrite($save, 'testing');
}

运行脚本,然后低估,测试'出现在第一行。
我已将以下两行添加到我的cURL请求中:

curl_setopt($ch, CURLOPT_COOKIEJAR, '/home/temp/cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, '/home/temp/cookies.txt');

在我的场景中没有任何改变。 cookies.txt文件仍然只是说'测试'并且没有存储任何cookie,也没有最后一次访问'时间的变化,对我而言意味着这些线条没有做任何事情。

还有什么想法吗?我有点难过:\

3 个答案:

答案 0 :(得分:1)

是的,您需要同时设置CURLOPT_COOKIEFILECURLOPT_COOKIEJAR选项。 'file'版本是从哪里加载cookie。 jar是curl对象终止时应该保存cookie的地方。它们可以是同一个文件。

如果您没有在服务器上创建实际文件的写入权限(如果您在/ tmp上没有至少写入权限或等效的话,则非常奇怪),您可以使用{{1 }} wrapper

答案 1 :(得分:1)

这是我心爱的这类任务模式:

$loginUrl = 'http://www.remote_site.de/login.php';
$loginFields = array('username' => 'username', 'password' => 'password');

getUrl($loginUrl, 'post', $loginFields); 
//now you're logged in and a session cookie was generated

$remote_page_content = getUrl('http://www.remote_site.de/some_page.php');


  function getUrl($url, $method='', $vars='') {
    $ch = curl_init();
    if ($method == 'post') {
      curl_setopt($ch, CURLOPT_POST, 1);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
    }
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
    $buffer = curl_exec($ch);
    curl_close($ch);
    return $buffer;
  }

答案 2 :(得分:0)

所以我拿出了原始的cURL代码,并从一个不同的项目中复制了一些Zend特定的代码,这似乎在很大程度上起作用(不确定为什么......)。我遇到的其他问题只与CoSign(http://cosign.sourceforge.net/)和使用代理cookie有关。感谢那些提供答案的人!