为加强对SESSION的理解,这里通过实现OSChina登录并发表一条动态来说明。

首先需要去oschina上查看登录的提交地址和参数,然后通过程序向该地址传递参数,并把COOKIE记录下来,下次读取其他页面使用该COOKIE即可。具体登录流程见下面代码:

<?php
$tmp_folder = dirname(__FILE__).'/tmp';
if(! file_exists($tmp_folder)) {mkdir($tmp_folder, 0777, true);
}
$cookie_file = tempnam($tmp_folder, "sess");
$post_data = array('email' => 'youremail@163.com','pwd' => hash('sha1', 123456),'save_login' => 1,
);
$ch = curl_init("https://www.oschina.net/action/user/hash_login");
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
//模拟浏览器头
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25');
//将COOKIE保存在$cookie_file中
curl_setopt($ch, CURLOPT_COOKIEJAR,  $cookie_file);
//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$os_login_rtn = curl_exec($ch);
if(curl_errno($ch)) {throw new Exception('Curl Error:'.curl_error($ch));
}
curl_close($ch);
echo $os_login_rtn;

通过CURLOPT_COOKIEJAR将COOKIE保存在当前tmp目录下,并打印显示HTTP头和返回值,获取到的结果是:

HTTP/1.1 200 OK
Server: Tengine/1.4.6
Date: Sun, 22 Dec 2013 01:00:51 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 0
Connection: keep-alive
Set-Cookie: oscid=""; Domain=.oschina.net; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/; HttpOnly
Set-Cookie: oscid=LklqaSHEgZygp%2BnwFOGLO7qmtVSOCMGv1Ea4aiyl0o2ybYt2B20bCyafAHYO9dEICMXhndAeBeg%2BwxAuRJIcbTtmAfGA503D1jVWgm1pbXUsR2BEmFMoLOsIy9RU4DtH; Domain=.oschina.net; Expires=Mon, 22-Dec-2014 00:58:05 GMT; Path=/; HttpOnly

可以看到HTTP中Content-Length实体长度为0,只是告诉浏览器设置oscid的COOKIE,oscid存在两个Set-Cookie的动作,前面一个的过期时间是1970年,应该是为了先删除该COOKIE再创建。执行成功后可以看到tmp目录下有一个tmp文件,记录了该COOKIE值。

接下来就是使用该COOKIE,要想发送动态需要先知道空间的地址,可以先通过首页获取到空间地址,程序接上面:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.oschina.net");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//读取cookie file
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
//CURL设置AJAX请求
//curl_setopt($ch, CURLOPT_HTTPHEADER, array("X-Requested-With: XMLHttpRequest"));
$os_index_rtn = curl_exec($ch);
curl_close($ch);
preg_match('#http://my.oschina.net/u/(\d+)#', $os_index_rtn, $matches);
print_r($matches);exit;

直接读取oschin首页,根据首页源文件匹配出空间地址。打印如下:

Array
([0] => http://my.oschina.net/u/1425813[1] => 1425813
)

这就表示登录状态已经获取到了,可以进行接下来的发帖、评论等其他事情了,之后的操作跟这里都是一样的,就不给出演示代码了。

知道了程序可以模拟很多操作,这是很危险的。所以在很多地方我们要有这个意识,防止程序批量去注册、登录后做某些恶意操作,最简单的解决方法还是加验证码,验证码用掉后就删掉。

之前听说OSC的SESSION是存在COOKIE中,这里看到的不是SESSION ID,而是一串加密串,应该是存放在COOKIE中。OSC的COOKIE很干净,访问过很多次,但是只有一个oscid的cookie,值得我们学习。OSC的COOKIE设置了HttpOnly属性,一般情况下该属性可以阻止JS读取COOKIE,达到防止xss的目的。

虽然说OSC用COOKIE存放会话状态,但还是不建议这么做。主要还是开发的程序员能力有好有差,很多开发人员开发过程为了方便把很多数据扔在COOKIE中,把所有的COOKIE都设置主域,难以避免乱用的情况。

PHP中的SESSION机制应用相关推荐

  1. php中的session详解,PHP中的session机制详解

    Session是什么? 首先,我们大概知道session是浏览器与服务器之间的一次交互会话. 那么会话又是什么呢?顾名思义就是浏览器与服务器之间的对话,浏览器一关闭,会话就结束了. 说session不 ...

  2. php中的session机制

    1.start_session();//开启session,这是必须的. 2.$_SESSION["name"]=$name;//这是赋值. 3.在另一页面获取name ,echo ...

  3. 【计算机网络】Session机制

    1. Http请求中Session机制 先简单说一下HTTP请求中的Session机制:Session数据保存在服务器端,SessionID保存在客户端的Cookies中(关闭浏览器时过期).当客户端 ...

  4. 说说对javaee中的session的理解

    在服务器上,通过Session来区分每一个上网用户 用户只要一连接到服务器,则立刻分配一个Session给用户 Session主要方法: 1 服务器上通过Session来分别不同的用户-->Se ...

  5. session机制详解

    session机制详解 摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚 session机制的本质,以至不能正确的应用这一技术.本文将详细讨论session的 ...

  6. Session机制详解及分布式中Session共享解决方案

    Session机制详解及分布式中Session共享解决方案 参考文章: (1)Session机制详解及分布式中Session共享解决方案 (2)https://www.cnblogs.com/jing ...

  7. 深度实现session【包括session入库、session机制和session和cookie的使用方法,完善会话机制(在分布式机器中也能使用)】、无限分类的实现...

    1.session的注意点: @session_start();//这个配置需要注意,session开启中会有影响,所以使用错误抑制符进行限制[并且使用php.ini对session进行自动开启] s ...

  8. php session 机制,Cookie、Session机制详解及PHP中Session处理

    会话机制 Cookie/Session: 在web应用中,常用的会话追踪机制是Cookie和Session.而Cookie是通过在浏览器里记录确定用户身份,Session在服务器端记录信息确定用户身份 ...

  9. 转三篇文章关于php中session机制

    解决的问题:同一数据库的两个网站,实现一次登录的功能.网上找了很多关于session的文章,最后参考了下面三篇文章有了解决问题的思路 首先我这边发送要已登录A网站用户的session_id给B网站,然 ...

最新文章

  1. 阿里老员工论坛炫耀:每年税前260万,还有三千万期权在握
  2. 修改 Oracle 数据库 sequence(序列) 的 increment (步长)
  3. 7 1学会使用 Node 编写简单的前端应用
  4. LambdaMART的源码分析:一(MART:回归树)
  5. 1.组合数据类型练习: 分别定义字符串,列表,元组,字典,集合,并进行遍历。 总结列表,元组,字典,集合的联系与区别。...
  6. 最优化方法:拉格朗日乘数法(转)
  7. 都柏林理工学院计算机,入爱尔兰都柏林理工大学,硕博连读全免费
  8. webstorm汉化攻略
  9. 超市管理系统软件测试用例图,超市管理系统用户管理模块测试用例集.doc
  10. 《史蒂夫·乔布斯传》经典语句段落摘录
  11. 解决Macbook Pro蓝牙不可用问题
  12. 按颜色分类:青绿色系(Blue Green)
  13. maven 设置本地仓库
  14. matlab在读取或者导入excel时,服务器出现意外情况
  15. 周志明架构课--03.SOA时代:成功理论与失败实践
  16. 蚂蚁金服面试经验分享
  17. 【设计模式】工厂系列
  18. EJS模板在express中的使用攻略及应用实例(建议收藏)
  19. 线索二叉树(图解+完整代码)
  20. DreamweaverCs5中代码中写汉字编译…

热门文章

  1. 【numpy】中,对axis【轴】axis=0 axis=1的理解
  2. 金融python培训班_2019年做金融,一定要学Python!:附Python视频教程
  3. pytorch之torch.backends.cudnn.benchmark=True——使用 GPU 来加速网络的训练
  4. Feature Pyramid Networks for Object Detection 总结
  5. P678-vect2.cpp
  6. Android接入支付宝支付实现
  7. GHOST系统时出现“A:\GHOSTERR.TXT”的解决方法
  8. 提高ASP.NET性能的一点方法
  9. Screenshot of a full element in Selenium C#
  10. 【java.lang.UnsupportedClassVersionError】版本不一致出错