libcurl Cookie 详解

2022年01月13日 阅读数:7
这篇文章主要向大家介绍libcurl Cookie 详解,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。


libcurl关于Cookie的一些选项:

​CURLOPT_COOKIE
浏览器

用来指定一个Cookie,用来在以后的http请求中发送这个Cookie。服务器

​CURLOPT_COOKIEFILE​cookie

告诉libcurl激活cookie引擎,而后读取指定文件来初始化Cookie,只读。dom

​CURLOPT_COOKIEJAR​curl

告诉libcurl激活cookie引擎,当easy handle被关闭,保存全部已知的Cookie到cookie jar文件,只写。ide

​CURLOPT_COOKIELIST​函数

提供单个的Cookie加入内部的Cookie存储引擎。能够传递http头格式也能够传递netscape 格式。这个也能够用来刷新Cookies。url

​CURLINFO_COOKIELIST​spa

将Cookie信息从内部Cookie存储里导出,导出格式为链表。 code

CURLOPT_COOKIE

这个函数能够给http请求设置Cookie 用法以下:

curl_easy_setopt(curl, CURLOPT_COOKIE, "tool=curl; fun=yes;");

这个选项显式对发出的http请求的Cookie进设置,若是因为身份验证,随后的重定向或相似的操做完成了多个请求,则他们都将传递此Cookie。这句话的意思是重定向类操做会继续传递此Cookie。

经过这个选项设置Cookie是与内部的Cookie存储引擎分开的,内部的Cookie存储引擎不会被此选项修改。假如你开启Cookie存储引擎你又导入一个同名的Cookie(或者服务器已经设置了这样一个Cookie),那么你设置的Cookie将不会影响引擎内部的Cookie。向服务器发出的请求会发送两个Cookie都发。想要替换引擎内部的Cookie可使用CURLOPT_COOKIELIST这个选项。

屡次调用这个选项只有最后一次调用会被使用。

这个选项不会开启Cookie Engine。你可使用CURLOPT_COOKIEFILE或者CURLOPT_COOKIEJAR去开启Cookie引擎来达到自动分析和发送Cookie的功能。

CURL *curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
curl_easy_setopt(curl, CURLOPT_COOKIE, "tool=curl; fun=yes;");
curl_easy_perform(curl);
}

CURLOPT_COOKIELIST

这个选项的参数能够为一行Netscape/Mozilkla格式或者http头(Set-Cookie:…)。他会打开Cookie引擎。也会将单个Cookie加入内部Cookie存储。

若是你使用这个选项而且有多个请求要发送的时候要谨慎。若是你使用Set-Cookie格式没有指定域名的话那这个Cookie将会发送给全部的请求(包括重定向),并且这个Cookie没法被服务器SetCookie更改。若是服务器SetCookie时已经有一个同名的Cookie时,这个Cookie不会被替换,他会将二者都传递给该服务器,这可能不是你想要的。要解决这个问题,请在Set-Cookie中设置一个域(这样作将包括子域)或使用Netscape格式。如示例所示。

/*
这个例子演示了如何将Netscape格式的COokie的内联导入,
您能够将cookie设置为HttpOnly,以防XSS攻击#HttpOnly_到主机名。 若是cookie稍后由浏览器导入会颇有用*/
#define SEP "\t" /* Tab separates the fields */
char *my_cookie =
"example.com" /* Hostname */
SEP "FALSE" /* Include subdomains */
SEP "/" /* Path */
SEP "FALSE" /* Secure */
SEP "foo" /* Name */
SEP "bar"; /* Value */
/* my_cookie 经过 CURLOPT_COOKIELIST导入*/
curl_easy_setopt(curl, CURLOPT_COOKIELIST, my_cookie);
/*
在cookie.txt里面的cookie将不会被导入直到在传输前正确。若是Cookie里面有相同的hostname,path或者在my_cookies里存在将会被跳过。由于libcurl已经经过my_cookie导入被称为”活着”的Cookie。活着的cookie不能够被经过读入文件的Cookie替换。。
*/
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookies.txt"); /* import */
/*
Cookie的导出是在curl_easy_cleanup被调用以后进行的。服务器能够增长、删除、修改Cookie。被跳过的的cookie不会被导入
*/
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt"); /* export */
curl_easy_perform(curl); /* cookies imported from cookies.txt */
curl_easy_cleanup(curl); /* cookies exported to cookies.txt */

CURLOPT_COOKIEJAR

这个选项的功能是将Cookie存储到一个文件。

若是设置了这个选项libcurl将会在curl_easy_cleanup被调用的时候将cookie与入文件。若是没有已经的cookie,会以-为文件名替换。他会还启用此会话的cookie。因此若是你follow a location,它将会发送对应的Cookie

libcurl不会从cookie jar文件中读取任何cookie。若是你想从 文件要读取cookie请使用CURLOPT_COOKIEFILE。

若是cookie jar在curl_wasy_clean调用时候不能被建立或写入,libcurl不会去报告这个错误。使用CURLOPT_VERBOSE或CURLOPT_DEBUGFUNCTION会有一个警告显示。



本身7.43.0 cookie被Set-Cookie 格式而且没有domain 时,将不会导出。

CURL *curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
/*当调用cleanup的时候导出cookie到文件*/
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "/tmp/cookies.txt");
ret = curl_easy_perform(curl);
/* 关闭curl, 写入cookie! */
curl_easy_cleanup(curl);
}