当你关注于防止源码的暴露时,你的会话数据只同样存在着风险。在默认情况下,SESSION保存在/tmp目录下。这样做在很多情形下是很方便的,其中之一是所有用户都有对/tmp的写入权限,这样Apache同样也有权限进行写入。虽然其他用户不能直接从shell环境读取这些会话文件,但他们可以写一个简单的脚本来进行读取:
03 |
header( 'Content-Type: text/plain' ); |
06 |
$path = ini_get ( 'session.save_path' ); |
09 |
while ( $filename = $handle ->read()) |
11 |
if ( substr ( $filename , 0, 5) == 'sess_' ) |
13 |
$data = file_get_contents ( "$path/$filename" ); |
17 |
session_decode( $data ); |
20 |
echo "Session [" . substr ( $filename , 5) . "]\n" ; |
这个脚本在session.save_path所定义的会话文件保存目录中搜索以sess_为前缀的文件。找到文件后,即对它的内容进行解析并用print_r()函数显示它的内容。这样其它开发者就容易地取得了你的用户的会话数据。
解决这个问题的最好方法是把你的会话数据存入用用户名和密码保护的数据库中。由于数据库的访问是受控的,这样就多了一层额外的保护。通过应用前节中提及的技巧,数据库可以为你的敏感数据提供一个安全的存放地,同时你应该保持警惕,你的数据库安全性正变得越来越重要。
为在数据库中保存会话数据,首先需要建立一个数据表:
3 |
id varchar(32) NOT NULL, |
4 |
access int(10) unsigned, |
如果你使用的是MySQL,则表结构描述如下:
1 |
mysql> DESCRIBE sessions; |
2 |
+--------+------------------+------+-----+---------+-------+ |
3 |
| Field | Type | Null | Key | Default | Extra | |
4 |
+--------+------------------+------+-----+---------+-------+ |
5 |
| id | varchar(32) | | PRI | | | |
6 |
| access | int(10) unsigned | YES | | NULL | | |
7 |
| data | text | YES | | NULL | | |
8 |
+--------+------------------+------+-----+---------+-------+ |
如要使会话数据能保存在此表中,你需要使用session_set_save_handler( )函数来编辑PHP的内建会话机制:
03 |
session_set_save_handler( '_open' , |
以上的六个参数每一个都代表着需要你编写的函数的名称,他们对下面的任务进行处理:
- 打开会话存储
- 关闭会话存储
- 读取会话数据
- 写入会话数据
- 消灭会话数据
- 清除旧会话数据
我有意使用了有意义的名称,这样你可以一下看出它们的目的。命名是任意的,但你可能希望用下划线开头(如此处所示)或其它的命名约定来防止名称冲突。下面是这些函数(使用MySQL)的示例:
07 |
$db_user = $_SERVER [ 'DB_USER' ]; |
08 |
$db_pass = $_SERVER [ 'DB_PASS' ]; |
09 |
$db_host = 'localhost' ; |
11 |
if ( $_sess_db = mysql_connect( $db_host , $db_user , $db_pass )) |
13 |
return mysql_select_db( 'sessions' , $_sess_db ); |
23 |
return mysql_close( $_sess_db ); |
30 |
$id = mysql_real_escape_string( $id ); |
36 |
if ( $result = mysql_query( $sql , $_sess_db )) |
38 |
if (mysql_num_rows( $result )) |
40 |
$record = mysql_fetch_assoc( $result ); |
42 |
return $record [ 'data' ]; |
49 |
function _write( $id , $data ) |
55 |
$id = mysql_real_escape_string( $id ); |
56 |
$access = mysql_real_escape_string( $access ); |
57 |
$data = mysql_real_escape_string( $data ); |
61 |
VALUES ( '$id' , '$access' , '$data' )"; |
63 |
return mysql_query( $sql , $_sess_db ); |
66 |
function _destroy( $id ) |
70 |
$id = mysql_real_escape_string( $id ); |
76 |
return mysql_query( $sql , $_sess_db ); |
84 |
$old = mysql_real_escape_string( $old ); |
88 |
WHERE access < '$old' "; |
90 |
return mysql_query( $sql , $_sess_db ); |
你必须要在session_start( )之前调用session_set_save_handler( )函数,但你可以在任何地方对这些函数本身进行定义。
这个流程的漂亮之处在于你无须对代码进行编辑或变化使用会话的方式。$_SESSION依然存在,行为依旧,还是由PHP来产生与传递会识标识,对有关会话的配置变更同样还会生效。所有你需要做的只是调用这一个函数(同时建立由它指定的所有函数),PHP就会照顾余下的事情。
- 编程思想转换&体验Lambda的更优写法和Lambda标准格式
编程思想转换做什么,而不是怎么做 我们真的希望创建一个匿名内部类对象吗?不,我们只是为了做这件事情而不得不创建一个对象. 我们真正希望做的事情是:将run方法体内的代码传递给Thread类知晓. 传递 ...
- PHP日志扩展 SeasLog-1.6.8, 性能更优
SeasLog-1.6.8 发布了,性能更优. 改进日志: 1.6.8: 优化内存使用和性能,修复已知Bug. - Fixed issue #97 PHP5.* Cached Block. - Fix ...
- IntelliJ IDEA 2019.2最新解读:性能更好,体验更优,细节处理更完美!
idea 2019.2 准备 idea 2019.2正式版是在2019年7月24号发布的,本篇文章,我将根据官方博客以及自己的理解来进行说明,总体就是:性能更好,体验更优,细节处理更完美! 支持jdk ...
- 体验Lambda的更优写法和Lambda标准格式
体验Lambda的更优写法 借助Java8的全新语法,上述Runnable接口的匿名内部类写法可以通过更简单的Lambda表达式达到等效: public class Lambda02 { public ...
- 取代 Mybatis Generator,这款代码生成神器配置更简单,开发效率更高!
作为一名 Java 后端开发,日常工作中免不了要生成数据库表对应的持久化对象 PO,操作数据库的接口 DAO,以及 CRUD 的 XML,也就是 mapper. Mybatis Generator 是 ...
- JavaWeb(二)会话管理之细说cookie与session
前言 前面花了几篇博客介绍了Servlet,讲的非常的详细.这一篇给大家介绍一下cookie和session. 一.会话概述 1.1.什么是会话? 会话可简单理解为:用户开一个浏览器,点击多个超链接, ...
- 会话技术、Cookie技术与Session技术
一.会话技术 1. 存储客户端状态 会话技术是帮助服务器记住客户端状态(区分客户端)的. 2. 会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话.会话技术就是记录这 ...
- MT【272】更大的视野,更好的思路.
已知$f(x)=\sum\limits_{k=1}^{2017}\dfrac{\cos kx}{\cos^k x},$则$f(\dfrac{\pi}{2018})=$_____ 分析:设$g(x)=\ ...
- Java第三阶段学习(十三、会话技术、Cookie技术与Session技术)
一.会话技术 1. 存储客户端状态 会话技术是帮助服务器记住客户端状态(区分客户端)的. 2. 会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话.会话技术就是记录这 ...
随机推荐
- Javascript参数传递中值和引用的一种理解
值(value)和引用(reference)是各种编程语言老生常谈的话题,js也不例外. 我将剖析一个例子的实际运行过程,跟大家分享我对js参数传递中的值和引用的理解. 参考官网数据类型的两种分类,本 ...
- linux 定时执行shell
第一步:安装 crontab ,命令 yum -y install vixie-cron 扩展:service crond start //启动服务 ...
- javascript 设为首页 | 加入收藏夹 JS代码
我们介绍一个可兼容所有浏览器的加入收藏代码代码,大概原理是这样的我们根据获取用户navigator.userAgent.toLowerCase()信息来判断浏览器,根据浏览器是否支持加入收藏js命令, ...
- bzoj3639: Query on a tree VII
Description You are given a tree (an acyclic undirected connected graph) with n nodes. The tree node ...
- Node.js事件循环
Node JS是单线程应用程序,但它通过事件和回调概念,支持并发. 由于Node JS每一个API是异步的,作为一个单独的线程,它使用异步函数调用,以保持并发性.Node JS使用观察者模式.Node ...
- jQuery.dialog
本篇文章主要是对JQUERY中dialog的用法进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 今天用到了客户端的对话框,把 jQuery UI 中的对话框学习了一下. 准备 jQ ...
- Yukari's Birthday
hdu4430:http://acm.hdu.edu.cn/showproblem.php?pid=4430 题意:题目的意思就是给你一个s,让你求k,r,其中k,r,满足:k^1+k^2+..... ...
- linux vi查找命令
linux vi查找命令 div id="article_content" class="article_content"> 使用vi编辑器编辑长文 ...
- WM_SIZE和WM_MOVE的函数体内容为什么不一样?
搞不懂,要想一想- procedure TWinControl.WMSize(var Message: TWMSize); begin UpdateBounds; // 类函数 inherited; ...
- MySql的大小写问题
原来Linux下的MySQL默认是区分表名大小写的,通过如下设置,可以让MySQL不区分表名大小写:1.用root登录,修改 /etc/my.cnf:2.在[mysqld]节点下,加入一行: lowe ...