PHP中的SESSION机制应用
为加强对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机制应用相关推荐
- php中的session详解,PHP中的session机制详解
Session是什么? 首先,我们大概知道session是浏览器与服务器之间的一次交互会话. 那么会话又是什么呢?顾名思义就是浏览器与服务器之间的对话,浏览器一关闭,会话就结束了. 说session不 ...
- php中的session机制
1.start_session();//开启session,这是必须的. 2.$_SESSION["name"]=$name;//这是赋值. 3.在另一页面获取name ,echo ...
- 【计算机网络】Session机制
1. Http请求中Session机制 先简单说一下HTTP请求中的Session机制:Session数据保存在服务器端,SessionID保存在客户端的Cookies中(关闭浏览器时过期).当客户端 ...
- 说说对javaee中的session的理解
在服务器上,通过Session来区分每一个上网用户 用户只要一连接到服务器,则立刻分配一个Session给用户 Session主要方法: 1 服务器上通过Session来分别不同的用户-->Se ...
- session机制详解
session机制详解 摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚 session机制的本质,以至不能正确的应用这一技术.本文将详细讨论session的 ...
- Session机制详解及分布式中Session共享解决方案
Session机制详解及分布式中Session共享解决方案 参考文章: (1)Session机制详解及分布式中Session共享解决方案 (2)https://www.cnblogs.com/jing ...
- 深度实现session【包括session入库、session机制和session和cookie的使用方法,完善会话机制(在分布式机器中也能使用)】、无限分类的实现...
1.session的注意点: @session_start();//这个配置需要注意,session开启中会有影响,所以使用错误抑制符进行限制[并且使用php.ini对session进行自动开启] s ...
- php session 机制,Cookie、Session机制详解及PHP中Session处理
会话机制 Cookie/Session: 在web应用中,常用的会话追踪机制是Cookie和Session.而Cookie是通过在浏览器里记录确定用户身份,Session在服务器端记录信息确定用户身份 ...
- 转三篇文章关于php中session机制
解决的问题:同一数据库的两个网站,实现一次登录的功能.网上找了很多关于session的文章,最后参考了下面三篇文章有了解决问题的思路 首先我这边发送要已登录A网站用户的session_id给B网站,然 ...
最新文章
- 阿里老员工论坛炫耀:每年税前260万,还有三千万期权在握
- 修改 Oracle 数据库 sequence(序列) 的 increment (步长)
- 7 1学会使用 Node 编写简单的前端应用
- LambdaMART的源码分析:一(MART:回归树)
- 1.组合数据类型练习: 分别定义字符串,列表,元组,字典,集合,并进行遍历。 总结列表,元组,字典,集合的联系与区别。...
- 最优化方法:拉格朗日乘数法(转)
- 都柏林理工学院计算机,入爱尔兰都柏林理工大学,硕博连读全免费
- webstorm汉化攻略
- 超市管理系统软件测试用例图,超市管理系统用户管理模块测试用例集.doc
- 《史蒂夫·乔布斯传》经典语句段落摘录
- 解决Macbook Pro蓝牙不可用问题
- 按颜色分类:青绿色系(Blue Green)
- maven 设置本地仓库
- matlab在读取或者导入excel时,服务器出现意外情况
- 周志明架构课--03.SOA时代:成功理论与失败实践
- 蚂蚁金服面试经验分享
- 【设计模式】工厂系列
- EJS模板在express中的使用攻略及应用实例(建议收藏)
- 线索二叉树(图解+完整代码)
- DreamweaverCs5中代码中写汉字编译…
热门文章
- 【numpy】中,对axis【轴】axis=0 axis=1的理解
- 金融python培训班_2019年做金融,一定要学Python!:附Python视频教程
- pytorch之torch.backends.cudnn.benchmark=True——使用 GPU 来加速网络的训练
- Feature Pyramid Networks for Object Detection 总结
- P678-vect2.cpp
- Android接入支付宝支付实现
- GHOST系统时出现“A:\GHOSTERR.TXT”的解决方法
- 提高ASP.NET性能的一点方法
- Screenshot of a full element in Selenium C#
- 【java.lang.UnsupportedClassVersionError】版本不一致出错