Search code examples
phpcookiescurlsetcookie

cURL doesn't set a cookie anymore, but why?


My cURL script does not work anymore (so keep in mind it DID work before) on my localhost (so it DOES work on my external host, hence: it might be the server settings):

This script worked fine before on my localhost (it still does on my host). Nothing changed.

  • Maybe the fact that I've ran this script over 3000 times on my localhost is useful to know.
  • I'm running on windows 7, using WampServer to setup a host.
  • I might have changed a setting, which effects the writing of cookies. But which one?

REAL PROBLEM: cURL does not set a cookie! What apache modules should be ON for writing cookies (in a .txt file)? I'm running wampserver.

Please note I'm already using:

    curl_setopt($curlTable, CURLOPT_COOKIEJAR, 'cookie.txt');
    curl_setopt($curlTable, CURLOPT_COOKIEFILE, 'cookie.txt');

And that php.ini is:

extension=php_curl.dll is uncommented
  • Side question: Does curl_close unset the cookie? And if the cookiejar option is not set?
  • Main question: Why doens't curl write a cookie like it should do (and does on my external host, NOT on my LOCALHOST.

Other information:

phpinfo()

curl
cURL support        enabled
cURL Information    7.21.7
Age                 3
Features
AsynchDNS           Yes
Debug               No
GSS-Negotiate       Yes
IDN                 No
IPv6                Yes
Largefile           Yes
NTLM                Yes
SPNEGO              No
SSL                 Yes
SSPI                Yes
krb4                No
libz                Yes
CharConv            No
Protocols           dict, file, ftp, ftps, gopher, 
                    http, https, imap, imaps, ldap, pop3,
                    pop3s, rtsp, scp, sftp, smtp, smtps, telnet, tftp
Host                i386-pc-win32
SSL Version         OpenSSL/0.9.8r
ZLib Version        1.2.5
libSSH Version      libssh2/1.2.7 

Currently using:

preg_match('/name="csrf" value="(.*?)"/', $getTokenCurlData, $token);

$postFields = array(
    'user'     => $userNum,
    'paswoord' => $userPass,
    'login'    => 'loginform',
    'csrf'     => $token[1]);

// 'user='.$userNum.'&paswoord='.$userPass.'&login=loginform&csrf='.$token[1]

$postData = http_build_query($postFields);

    $curlTable = curl_init();
    curl_setopt($curlTable, CURLOPT_URL, 'link');
    curl_setopt($curlTable, CURLOPT_COOKIEJAR, 'cookie.txt');
    curl_setopt($curlTable, CURLOPT_COOKIEFILE, 'cookie.txt');
    curl_setopt($curlTable, CURLOPT_ENCODING, 'gzip');
    curl_setopt($curlTable, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curlTable, CURLOPT_POST, true);
    $tableData = curl_exec($curlTable);
    if (!$tableData) echo 'post problem?'.$tableData;
    if ($tableData == false)
{
    echo 'Curl error: ' . curl_error($curlTable);
}

    curl_close($curlTable);
// Here I further process my data.

Solution

  • Probably you was banned at the login process. This will give you more info about the problem:

    // change 
    // if (!$siteSource) echo 'Help!';
    // to
    if ($siteSource === false)
    {
        echo 'Curl error: ' . curl_error($curl);
    }
    

    EDIT: some other opt that you can try (SSL related solved my problems more that one time):

    curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)');
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_VERBOSE, 1);
    
    // following is very important
    // TRUE to follow any "Location: " header that the server sends
    // as part of the HTTP header (note this is recursive, PHP will follow
    // as many "Location: " headers that it is sent, unless CURLOPT_MAXREDIRS is set).
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    

    EDIT 2: Following opt will give you the headers returned (use only to debug). Besides be sure about the cookie.txt is being used properly (locatable and writable).

    curl_setopt($curl, CURLOPT_HEADER, true);
    

    That's all I can contribute by my side. Now lo lunch!


    EDIT 3: Cookie related stuff:

    $cookie_file = PATH_TO_YOUR_COOKIE_FILE . '/cookie.txt';
    
    if (! file_exists($cookie_file) || ! is_writable($cookie_file))
    {
        echo 'Cookie file missing or not writable.';
        exit;
    }
    
    // you already added the following, I put it again just to remark their utility
    curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file);
    curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file);
    

    EDIT 4: Always check this at the beginning:

    if ( ! extension_loaded('curl'))
    {
        echo "You need to load/activate the curl extension.";
    }
    

    If you receive this error, activate curl in php.ini uncommenting/removing the front ;

    windows:
    ;extension=php_curl.dll // or curl.dll
    linux:
    ;extension=php_curl.so // or curl.so
    

    and restart the web server. If you do not found this line then you need install curl:

    // ubuntu
    sudo apt-get install php5-curl
    
    // centos
    sudo yum install php5-curl
    

    For windows or your wampserver it must be easy too.