WININET函数保持sessionID不过期

WININET函数保持sessionID不过期

当访问一个PHP页面时,如果php 页面有session创建,那个会在客服端的cookie设置一个sessionID,并设置这个cookie失效的时间,这个时间登录session的存活时间。这个sessionID用来表示当前客服端对应的session。虽然这个session会在用session_set_cookie_params($life)设置的时间过去后实效,要是不用带sessionID访问的话。

默认的情况下,是15分钟内用sessionID去访问都会重新使这个session复活,并重新拥有存活时间,里面值不变,但这些似乎都要在请求页面的http头中写明Connection: Keep-Alive,不过我测试的时候没有写这个,就只用了sessionID也行。当然,在存活时间内,其他用户是可以访问这样的session的。

但如果保持cookie不过期(opera浏览器的设置里就可以直接修改cookie变量的值可过期时间,但不能添加变量,郁闷),一直都提交sessionID的话,那么对应的session就一直都在。

下面写出php页面的代码:

[html]  view plain  copy
 print ?
  1. <?php  
  2. $life = 5;  
  3. session_set_cookie_params($life);  //设置session过期时间为5秒,对应的设置 sessionID为cookie时,过期时间也是5秒  
  4. session_start();  
  5. //要是没有$_session['a'],间建立并赋值为1,要是已经有了就加1  
  6. if (isset($_SESSION['a']))  
  7. $_SESSION['a'] += 1;  
  8. else  
  9. $_SESSION['a'] = 1;  
  10. //打印1  
  11. echo $_SESSION['a'];  
  12. ?>  


下面是用浏览器访问这个页面时的抓包的的情况:

图一

当第一次访问这个页面的时候,客服端会被设置cooike,PHPSESSID,后面还会有过期时间。这个就是sessionID。接着当客服端继续访问的时候,会随着cookie提交这个sessionID,从而返回的值会增加,不过当时间过了5秒后,浏览器会删除掉这个cookie,于是就是下面的状况。

图二

提交数据时没有cookie了,那么就又会重新建立session。设置cookie,打印出来的值就变成了1了。

那要是我们让cookie不被删除,一直提交或者隔一段时间提交这个cookie。那么这个打印的数就会越来越大。

那么用WININET类函数是很容易做到这一点的,思路可以是先访问一次这个页面,然后提取sessionID,并强行写入cookie在以后提交的的数据里,那么就行了。因为WININET函数跟浏览器一样,虽然会保存 cookie,但到了时间也会删除。要自己强行设置cookie,在HttpOpenRequest里最后第二个参数要设置成INTERNET_FLAG_NO_COOKIES。

[cpp]  view plain  copy
 print ?
  1. #include <windows.h>  
  2. #include <wininet.h>  
  3. #include <stdio.h>  
  4. #pragma comment(lib, "wininet.lib")  
  5.   
  6. HINTERNET hInternetOpen;  
  7. HINTERNET hInternetConnect;  
  8. HINTERNET hRequest;  
  9. DWORD dwSize = 1024;  
  10. //存放提取的cookie  
  11. LPVOID lpOutBuffer = new char[dwSize];  
  12. int TestWininet(LPCSTR lpszSerNam, INTERNET_PORT myPort, char* path, char* data)  
  13. {  
  14.     bool flag;  
  15.     LPVOID lpDataBuffer = new char[dwSize];  
  16.     memset(lpDataBuffer, 0, dwSize);  
  17.     //发包时需要的一个http头  
  18.     static char hdrs[] = "Content-Type: application/x-www-form-urlencode";  
  19.     //接受的文件类型,这里是全部  
  20.     static LPCSTR accept[2] = {"*/*", NULL};  
  21.     //打开一个链接  
  22.     hInternetOpen = InternetOpenA("Test", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);  
  23.     if (hInternetOpen == NULL)  
  24.     {  
  25.         printf("Internet open failed!\n");  
  26.         return 0;  
  27.     }  
  28.     //链接到一个服务器  
  29.     hInternetConnect = InternetConnectA(hInternetOpen, lpszSerNam, myPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);  
  30.     if (hInternetConnect == NULL)  
  31.     {  
  32.         printf("Internet Connect failed!\n");  
  33.         return 0;  
  34.     }  
  35.     //打开一个请求  
  36.     hRequest = HttpOpenRequestA(hInternetConnect, "POST", path, NULL, NULL, accept, 0, 0);  
  37.     if (hRequest == NULL)  
  38.     {  
  39.         printf("Internet Request failed!\n");  
  40.         return 0;  
  41.     }  
  42.     //发送请求  
  43.     flag = HttpSendRequestA(hRequest, hdrs, strlen(hdrs), data, strlen(data));  
  44.     //读取返回的cookie  
  45.     flag = HttpQueryInfoA(hRequest, HTTP_QUERY_SET_COOKIE, lpOutBuffer, &dwSize, NULL);  
  46.     printf("%s\n", lpOutBuffer);  
  47.     //读取放回的文本内容  
  48.     InternetReadFile(hRequest, lpDataBuffer, 1024, &dwSize);  
  49.     printf("%s\n", lpDataBuffer);  
  50.     //关闭打开的句柄  
  51.     InternetCloseHandle(hRequest);  
  52.     InternetCloseHandle(hInternetConnect);  
  53.     InternetCloseHandle(hInternetOpen);  
  54.     return 0;  
  55. }  
  56.   
  57. int TestCookie(LPCSTR lpszSerNam, INTERNET_PORT myPort, char* path, char* data)  
  58. {  
  59.     bool flag;  
  60.     char cookie[1024];  
  61.     char lpDataBuffer[1024];  
  62.     memset(cookie, '\0', 1024);  
  63.     //构成带有seesionID的cookie  
  64.     cookie[0] = 'C';  
  65.     cookie[1] = 'o';  
  66.     cookie[2] = 'o';  
  67.     cookie[3] = 'k';  
  68.     cookie[4] = 'i';  
  69.     cookie[5] = 'e';  
  70.     cookie[6] = ':';  
  71.     cookie[7] = ' ';  
  72.     strcat(cookie, (char *)lpOutBuffer);  
  73.     printf("%s\n", cookie);  
  74.     static char hdrs[] = "Content-Type: application/x-www-form-urlencode";  
  75.     static LPCSTR accept[2] = {"*/*", NULL};  
  76.     hInternetOpen = InternetOpenA("Test", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);  
  77.     if (hInternetOpen == NULL)  
  78.     {  
  79.         printf("Internet open failed!\n");  
  80.         return 0;  
  81.     }  
  82.     hInternetConnect = InternetConnectA(hInternetOpen, lpszSerNam, myPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);  
  83.     if (hInternetConnect == NULL)  
  84.     {  
  85.         printf("Internet Connect failed!\n");  
  86.         return 0;  
  87.     }  
  88.     //打开一个请求时设置为不用自动添加cookie,便于自己添加  
  89.     hRequest = HttpOpenRequestA(hInternetConnect, "POST", path, NULL, NULL, accept, INTERNET_FLAG_NO_COOKIES, 0);  
  90.     if (hRequest == NULL)  
  91.     {  
  92.         printf("Internet Request failed!\n");  
  93.         return 0;  
  94.     }  
  95.     //向http头添加cookie  
  96.     HttpAddRequestHeadersA(hRequest, cookie, strlen(cookie), HTTP_ADDREQ_FLAG_ADD);  
  97.     //本来以为要设置这个http才可以,因为抓包用浏览器访问的时候有这个,后来测试时没有这个也是可以的。  
  98.     //HttpAddRequestHeadersA(hRequest, "Connection: Keep-Alive", strlen("Connection: Keep-Alive"), HTTP_ADDREQ_FLAG_ADD);  
  99.     flag = HttpSendRequestA(hRequest, hdrs, strlen(hdrs), data, strlen(data));  
  100.     InternetReadFile(hRequest, (LPVOID)lpDataBuffer, 1024, &dwSize);  
  101.     lpDataBuffer[dwSize] = '\0';  
  102.     printf("%s\n", lpDataBuffer);  
  103.     InternetCloseHandle(hRequest);  
  104.     InternetCloseHandle(hInternetConnect);  
  105.     InternetCloseHandle(hInternetOpen);  
  106. }  
  107.   
  108. int main()  
  109. {  
  110.     int i;  
  111.     //第一访问,获得sessionID  
  112.     TestWininet("192.168.0.55", 8080, "/session.php""yy");  
  113.     while(1)  
  114.     {  
  115.         //TestWininet("192.168.0.55", 8080, "/session.php", "yy");  
  116.         TestCookie("192.168.0.55", 8080, "/session.php""yy");  
  117.         //用于测试到底要多少时间后继续提交sessionID会实效,我发现我写950000都不会实效,明明返回的http头里有写Keep-Alive: timeout=15, max=99  
  118.         Sleep(900000);  
  119.     }  
  120.     return 0;  
  121. }  

虽然这个程序可以让sessionID不过期了,但偶尔出现的一些情况还是没有搞清楚。像有时没有关闭浏览器(面对同一个服务器,用同一个浏览器),sessionID同样不会过期,不管php页面里设置的过期时间是多少。不过今天测试时时间一到就过期了,删除了cookie。郁闷。

突然想到有一次好像是session共享了,两个不同的用户访问同一个页面时共享了同一个session变量,确实做到了,不过不晓得是什么回事,要多测试才明白其中的道理呀。

本文转自:http://hi.baidu.com/vccjis/item/746f7abfc997de4bba0e1272

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值