当你关注于防止源码的暴露时,你的会话数据只同样存在着风险。在默认情况下,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. 会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话.会话技术就是记录这 ...
随机推荐
- Poj 3667
这是第一题线段树的区间合并的题: 这类的题用于求连续的最长长度什么的: 这题我看的是一篇比较不错的博客: 我把我的理解注释在代码里了: #include <iostream>#includ ...
- php微信支付接口开发程序
php微信支付接口开发程序讲解 微信支付接口现在也慢慢的像支付宝一个可以利用api接口来实现第三方网站或应用进行支付了, 下文整理了一个php微信支付接口开发程序并且己测试,有兴趣的朋友可进入参考. ...
- Java字符串学习
Java中字符串是String类的实例,字符串也是对象,所以 Java将字符串作为对象进行管理 Java使用java.lang 包中的String类来创建字符串. 1.定义字符串: 使用 " ...
- XAMPP配置虚拟主机
当你在本地进行单个网站建设和测试的时候,你只需要正常的安装一下XAMPP就好了.XAMPP本身是集成了apache.mysql和php的.然而当你本地测试站点一多的话,你就不得不考虑使用多个虚拟主机来 ...
- Android SurfaceView使用
与View区别 更新View任务太重会导致UI线程阻塞 而SurfaceView不会,可以在UI线程之外更新UI 工程代码 SurfaceViewDemo.zip ------------------ ...
- STM32学习笔记——定时器中断(向原子哥学习)
定时器中断 STM32 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和TIME7 等基本定时器.在本章中,我们将利 ...
- CentOS下命令行和桌面模式的切换方法(转载)
桌面模式和命令行模式的切换方法 用编辑器打开 /etc/inittab 文件(这里用的是vi,你可以选择你喜欢的): #vi /etc/inittab 打开效果图如下: 桌面模式 : 把光标所在 ...
- C#执行oracle返回游标类型的存储过程
存储过程代码为: create or replace procedure proc_test(pCursor OUT pak_pub.ut_cursor) AS begin -- 使用游标 open ...
- api1
http://www.android-doc.com/reference/android/app/Fragment.html
- const 笔记
.指向const的指针例如:double a=1.01;const double * b=&a;*b=2.1; //这显然是错误的a=2.1; //这是正确的,a和*b的值都会变成2.01,有 ...