views:

590

answers:

2

I am authenticating a login via CURL just fine. I have a variable I am using to display the returned HTML, and it is returning my user control panel as if I am logged in.

After authenticating, I want to communicate variables with a form on another page within the site; but for some reason the HTML from that page is returning a non-authenticated version of the header (as if the original authentication never took place.)

I have a cookies.txt file with 777 permissions, and have tried just getting the contents of the same page shown when I authenticate and it is as if I am losing any associated session/cookie data somewhere along the way.

Here is my curl.class file -

<?

class Curl {

 public $cookieJar = "";

 // Make sure the cookies.txt file is read/write permissions
 public function __construct($cookieJarFile = 'cookies.txt') {
  $this->cookieJar = $cookieJarFile;
 }

 function setup() {
  $header = array();
  $header[0]  = "Accept: text/xml,application/xml,application/xhtml+xml,";
  $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
  $header[]   = "Cache-Control: max-age=0";
  $header[]   = "Connection: keep-alive";
  $header[]   = "Keep-Alive: 300";
  $header[]   = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
  $header[]   = "Accept-Language: en-us,en;q=0.5";
  $header[]   = "Pragma: "; // browsers keep this blank.

  curl_setopt($this->curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7');
  curl_setopt($this->curl, CURLOPT_HTTPHEADER, $header);
  curl_setopt($this->curl, CURLOPT_COOKIEJAR, $this->cookieJar);
  curl_setopt($this->curl, CURLOPT_COOKIEFILE, $this->cookieJar);
  curl_setopt($this->curl, CURLOPT_AUTOREFERER, true);
  curl_setopt($this->curl, CURLOPT_COOKIESESSION, true);
  curl_setopt($this->curl, CURLOPT_FOLLOWLOCATION, true);
  curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true);
 }

 function get($url) {
  $this->curl = curl_init($url);
  $this->setup();

  return $this->request();
 }

 function getAll($reg, $str) {
  preg_match_all($reg, $str, $matches);
  return $matches[1];
 }

 function postForm($url, $fields, $referer = '') {
  $this->curl = curl_init($url);
  $this->setup();
  curl_setopt($this->curl, CURLOPT_URL, $url);
  curl_setopt($this->curl, CURLOPT_POST, 1);
  curl_setopt($this->curl, CURLOPT_REFERER, $referer);
  curl_setopt($this->curl, CURLOPT_POSTFIELDS, $fields);
  return $this->request();
 }

 function getInfo($info) {
  $info = ($info == 'lasturl') ? curl_getinfo($this->curl, CURLINFO_EFFECTIVE_URL) : curl_getinfo($this->curl, $info);
  return $info;
 }

 function request() {
  return curl_exec($this->curl);
 }
}
?>

And here is my curl.php file -

<?
include('curl.class.php'); // This path would change to where you store the file
$curl = new Curl();

$url = "http://www.site.com/public/member/signin";
$fields = "MAX_FILE_SIZE=50000000&dado_form_3=1&member[email]=email&member[password]=pass&x=16&y=5&member[persistent]=true";

// Calling URL
$referer = "http://www.site.com/public/member/signin";

$html = $curl->postForm($url, $fields, $referer);

echo($html);
?>
<hr style="clear:both;"/>
<?

$html = $curl->postForm('http://www.site.com/index.php','nid=443&amp;sid=733005&amp;tab=post&amp;eval=yes&amp;ad=&amp;MAX_FILE_SIZE=10000000&amp;ip=63.225.235.30','http://www.site.com/public/member/signin');

echo $html; // This will show you the HTML of the current page you and logged into
?>

Any ideas?

A: 

Err, please tell us what authentication scheme the server is using. Not all schemes use cookies.

foo
A: 

As always when doing HTTP scripting, you should use LiveHTTPHeaders or similar to record a manual session first and then you should mimic that as closely as possible when you write your curl stuff.

Also (unfortunately) the command line tool curl offers slightly better debug and tracing options than what the PHP binding does, which makes that a better tool to work out exactly what you need to do and once that works you convert it to a PHP program.

See http://curl.haxx.se/docs/httpscripting.html for further details.

Daniel Stenberg