热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php会话控制

攻击者通过投入很大的精力尝试获得现有用户的有效会话ID,有了会话id,他们就有可能能够在系统中拥有与此用户相同的能力.因此,我们主要解决的思路是效验sessionID的有效性.

第十一章:会话控制
从php4.0开始引入了对会话的支持,从来可以很方便的通过会话来存储变量值,
尽可能减少对数据库的操作,从而减轻了对系统的负载量,更加方便、灵活的操作数据。

PHP为我们提供了2种会话的解决方案: COOKIE  和  session

1. PHP的COOKIE

COOKIE 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。
PHP在http协议的头信息里发送COOKIE, 因此 setCOOKIE() 函数必须在其它信息被输出到浏览器前调用,这和对 header() 函数的限制类似。

1.1 设置COOKIE:  (会话COOKIE 、 持久COOKIE)

可以用 setCOOKIE() 或 setrawCOOKIE() 函数来设置 COOKIE。也可以通过向客户端直接发送http头来设置.
1.1.1 使用setCOOKIE()函数设置COOKIE:
bool setCOOKIE ( string name [, string value [, int expire [, string path [, string domain [, bool secure [, bool httponly]]]]]] )
name:   COOKIE变量名
value:   COOKIE变量的值
expire:  有效期结束的时间,
path:    有效目录,
domain: 有效域名,顶级域唯一
secure:  如果值为1,则COOKIE只能在https连接上有效,如果为默认值0,则http和https都可以.
httponly: 如果为1,则COOKIE只能通过HTTP协议来访问,而不能通过脚本来访问,很好的避免了XSS攻击。
例子:
$value = 'something from somewhere';

setCOOKIE("TestCOOKIE", $value); /* 简单COOKIE设置 */
setCOOKIE("TestCOOKIE", $value, time()+3600); /* 有效期1个小时 */
setCOOKIE("TestCOOKIE", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* 有效目录 /~rasmus,有效域名example.com及其所有子域名 */
?>

设置多个COOKIE变量: setCOOKIE('var[a]','value');
用数组来表示变量,但它的下标不用引号.(会自动加上下标,如果加上引号会出现重复或者可能会被转义,下标不可用)
这样就可以用$_COOKIE['var']['a']来读取该COOKIE变量.

1.1.2. 使用header()设置COOKIE;
header("Set-COOKIE: name=$value[;path=$path[;domain=xxx.com[;...]]");
后面的参数和上面列出setCOOKIE函数的参数一样.
比如:

$value = 'something from somewhere';
header("Set-COOKIE:name=$value");

1.1.3. COOKIE 的存放位置
不同的浏览器保存COOKIE的位置都不一样,甚至保存格式都是不一样的。
已IE和firefox为例:
IE是把COOKIE保存在C:\Documents and Settings\用户名\COOKIEs中,每个COOKIE是一个txt文件,文件名是以“用户名@网站URL”命名的;
firefox则是把COOKIE保存在C:\Documents and Settings\用户名\Application Data\Mozilla\Firefox\Profiles\随机目录,
在目录下可以看到一个COOKIE.sqlite文件(firefox3.X版本),所有的COOKIE都是保存在这个文件中。

1.2 COOKIE的读取:

直接用php内置超级全局变量 $_COOKIE就可以读取浏览器端的COOKIE.
print $_COOKIE['TestCOOKIE'];

1.3 删除COOKIE
(1)只需把有效时间设为小于当前时间
(2)把值设置为空.
例如:  setCOOKIE("name","",time()-1);
用header()类似.

1.4 常见问题解决:
1) 用setCOOKIE()时有错误提示(headers already sent ...),可能是因为调用setCOOKIE()前面有输出或空格.
也可能你的文档是从其他字符集转换过来,文档可能带有BOM签名(就是在文件内容添加一些隐藏的BOM字符).
解决的办法就是使你的文档不出现这种情况.还有通过使用ob_start()函数有也能处理一点.
2) $_COOKIE受magic_quotes_gpc影响,可能自动转义
3) 使用的时候,有必要测试用户是否支持COOKIE

1.5 COOKIE工作机理:

a) 当客户端初次请求服务器的时候,如果服务器端有设置COOKIE的语句,则服务器通过随着响应发送一个http的Set-COOKIE头,在客户端中设置一个COOKIE文件。
b) 当客户端再次向服务器端发送一个http请求的时候,浏览器会把本地保存该请求地址的COOKIE信息发送到服务器,服务器会自动读取,并将其转换成 $_COOKIE 全局变量,方便调用。

2. PHP中的Session

如果使用session的会话机制,用户每次来访问网站时,都会为每一个访问者创建一个唯一的标示符来区分客户的身份。
这种标示符被成为会话ID(SID),其实SID就是session文件的文件名,具有唯一性和随机性,以确保session的安全。

SID 2种传递方式: COOKIE 或者  URL传递

session_start()
① 为当前访客分配一个唯一的session_id
② 在访客的客户端生产一个存放 session_id  的COOKIE  此COOKIE名默认为 PHPSESSID
③ 在服务器端生成一个session文件,用来存放该访客的所有的会话信息。  session文件名为    sess_session_id的值   (前提:服务器设置的session存放方式为files)

session通常使用过期时间为0的COOKIE,并且将一个称为session ID的唯一标识符作为COOKIE的值,
在服务器端同步生成一些session文件(可以自己定义session的保存类型),与用户机关联起来.并且让数据随着用户在页面之间传递.

要使用session,首先必须通过session_start()来开启一个会话。

2.1 sessionID的传送  (COOKIE 和 URL)

2.1.1 通过COOKIE传送sessin ID

使用session_start()调用session,服务器端在生成session文件的同时,同时生成session ID哈希值和默认值为 PHPSESSID 的session name,并向客户端发送变量为(默认的是)PHPSESSID(session name),值为一个128位的哈希值.服务器端将通过该COOKIE与客户端进行交互.

session变量的值经php内部系列化后保存在服务器机器上的文本文件中,和客户端的变量名默认情况下为PHPSESSID的coolie进行对应交互.

即服务器自动发送了http头:header('Set-COOKIE: session_name()=session_id(); path=/');
即setCOOKIE(session_name(),session_id());

当从该页跳转到的新页面并调用session_start()后,PHP将检查与给定ID相关联的服务器端存贮的session数据,如果没找到,则新建一个数据集.

2.1.2 通过URL传送session ID

只有在用户禁止使用COOKIE的时候才用这种方法,因为浏览器COOKIE已经通用,为安全起见,可不用该方法.
xxx,也可以通过POST来传递session值.

2.2 session基本用法实例

// page1.php
session_start();
echo 'Welcome to page #1';

/* 创建session变量并给session变量赋值 */

$_SESSION['favcolor'] = 'green';
$_SESSION['animal'] = 'cat';
$_SESSION['time'] = time();

// 如果客户端使用COOKIE,可直接传递session到page2.php

echo '
page 2';

// 如果客户端禁用COOKIE
echo '
page 2';

/*
默认php5.2.1下,SID只有在COOKIE被写入的同时才会有值,如果该session
对应的COOKIE已经存在,那么SID将为(未定义)空
*/
?>
// page2.php
session_start();
print $_SESSION['animal']; // 打印出单个session
var_dump($_SESSION); // 打印出page1.php传过来的session值
?>

2.3 删除session
要三步实现.

session_destroy();                                      // 第一步: 删除服务器端session文件,这使用
setCOOKIE(session_name(),'',time()-3600);              // 第二步: 删除实际的session:
$_SESSION = array();                                  // 第三步: 删除$_SESSION全局变量数组
?>

2.4 常用session函数:

bool   session_start(void); 初始化session
bool   session_destroy():  删除服务器端保存session信息的文件
string session_id() 当前session的id
string session_name() 当前存取的session名称,也就是客户端保存session ID的COOKIE名称.默认PHPSESSID。
array  session_get_COOKIE_params() 与这个session相关联的session的细节.
void   session_set_COOKIE_params ( int lifetime [, string path [, string domain [, bool secure [, bool httponly]]]] )设置与这个session相关联的session的细节
string session_cache_limiter() 控制使用session的页面的客户端缓存
ini    session_cache_expire() 控制客户端缓存时间
bool   session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )定义处理session的函数,(不是使用默认的方式)
bool   session_regenerate_id([bool delete_old_session]) 分配新的session id, 用一个新的session_id替换掉当前的session_id, 保存原有的session信息到新的session文件中, 如果参数为true的话,会同时删除原有的session文件,

####################################
#  配置文件中session常用设置
####################################
[Session]

; 定义了存储和获取与会话相关联数据的处理器名称。四种:①files 文件(默认) ②mm  共享内存 ③sqlite  SQLite数据库  ④user  用户自定义的函数
session.save_handler = files

; 传送到save_handler的参数.  在使用文件的情况下, 这里是数据文件被保存的路径.
; 注意: Windows 用户必须改变此值来使用PHP的会话函数.
;
; 和在 4.0.1一样, 你可以定义如下路径:
;
;     session.save_path = "N;/path"
;
; 这里的 N 是一个整数.  使用此参数会在目录内建立一个N层深度的子目录用来保存session文件,
; 而不是将所有session文件保存在同一个/path目录内.
; 这对你或当你的操作系统在一个目录内保存太多文件时出现问题很有帮助.
; 并且对于处理大量session的服务器提供更高的效率.
;
; 注意 1: PHP不会自动创建目录结构. 你可以使用在ext/session目录内的脚本来创建目录结构.
; 注意 2: 如果你选择使用子目录来保存session,请检查下面关于垃圾回收的配置段
;
; 文件存储模块默认使用600模式来创建文件,在使用中你可以改变此选项
;
;     session.save_path = "N;MODE;/path"
;
; 这里的MODE由8进制来表示. 注意这里不会覆盖进程的umask.
;session.save_path = "/tmp"

; 用来设置是否在客户端使用COOKIE来存放会话ID.
session.use_COOKIEs = 1

; 用来设置是否只使用安全链接协议(https)来发送COOKIE
;session.COOKIE_secure =

; 用来决定是否在客户端只使用COOKIE来存放会话ID,而放弃使用URL,很好的保护了那些在URL中传送session id的用户免于被攻击。 默认是 0.
; session.use_only_COOKIEs = 1

; session的默认名称 (作为COOKIE名称来使用).
session.name = PHPSESSID

; 用于指定是否在请求开始的时候自动启动session.
session.auto_start = 0

; 用于指定放送到浏览器端的会话COOKIE的生命周期(单位:秒),或者如果为0表示COOKIE的生命周期直到浏览器被关闭为止。
session.COOKIE_lifetime = 0

; COOKIE有效作用路径.
session.COOKIE_path = /

; COOKIE有效的作用域名.可以防止别的域非法读取自己的会话COOKIE,以增强COOKIE的安全性
session.COOKIE_domain =

; 是否将httpOnly标志增加到COOKIE上, 增加后则COOKIE无法被浏览器的脚本语言(例如Javascript)存取.
session.COOKIE_httpOnly=

; 用于序列化数据的处理器. php是标准的PHP序列化器.
session.serialize_handler = php

; 定义在每次session初始化时启动'垃圾回收'进程的概率.
; 比例由 gc_probability/gc_divisor来得出,
; 例如. 1/100 意味着在每次请求时有1%的机会启动'垃圾回收'进程.

session.gc_probability = 1
session.gc_divisor     = 100

; 指定了经过多少秒数之后,存储的数据会被认为是'垃圾'并且被垃圾回收进程清理掉. 单位:秒。 1440 == 24分钟
; 它的判断依据是最后访问数据的时间,对于FAT文件系统则是最后修改数据的时间。

session.gc_maxlifetime = 1440

; 注意: 如果你使用子目录选项来保存session文件
;       (查看在上面的session.save_path), 那么垃圾回收就 *不会* 自动发生.
;       你需要通过一个shell脚本,cron或者其他方法来自行处理垃圾回收.
;       例如, 下面的脚本相当于将session.gc_maxlifetime设置为 1440 (1440 秒 = 24 分钟):
;          cd /path/to/sessions/; find -cmin +24 | xargs rm

; PHP 4.2 和更早版本有一个未公开的 特性/bug , 此特性允许你在全局初始化一个session变量,即便 register_globals 已经被关闭.
; 如果此特性被使用,PHP 4.3 和更早版本会警告你.
; 你可以关闭此特性并且隔离此警告. 这时候,如果打开bug_compat_42,那此警告只是被显示出来.

session.bug_compat_42 = 1
session.bug_compat_warn = 1

; 检查HTTP Referer来防止带有id的外部URL.
; 用来验证HTTP_REFERER中是否包含指定的字符串(通过下面字段设置),如果包含则会话ID被视为有效。默认为空,表示全部视为有效。

session.referer_check =

; 从此文件读取多少字节.
session.entropy_length = 0

; 在这里指定创建session id.
session.entropy_file =

;session.entropy_length = 16

;session.entropy_file = /dev/urandom

; 设置为 {nocache,private,public,} 来决定HTTP缓冲的类型
; 留空则防止发送 anti-caching 头.
session.cache_limiter = nocache

; 文档在n分钟之后过期.
session.cache_expire = 180

; trans sid 支持默认关闭.
; 使用 trans sid 可能让你的用户承担安全风险.
; 使用此项必须小心.
; - 用户也许通过email/irc/其他途径发送包含有效的session ID的URL给其他人.
; - 包含有效session ID的URL可能被存放在容易被公共存取的电脑上.
; - 用户可能通过在浏览器历史记录或者收藏夹里面的包含相同的session ID的URL来访问你的站点.
session.use_trans_sid = 0

; 选择hash方法
; 0: MD5   (128 bits)
; 1: SHA-1 (160 bits)
session.hash_function = 0

; 当转换二进制hash数据到可读形式时,每个字符保存时有几位.
;
; 4 bits: 0-9, a-f
; 5 bits: 0-9, a-v
; 6 bits: 0-9, a-z, A-Z, "-", ","
session.hash_bits_per_character = 4

; URL rewriter会在已经定义的一组HTML标签内查找URL.
; form/fieldset 是特殊字符; 如果你在这里包含他们, rewriter会增加一个包含信息的隐藏字段否则就是在URL中附加信息.
; 如果你你想遵守XHTML, 删除form的入口.
; 注意 所有合法的入口都需要一个"="符号, 甚至是没有任何值的.
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=,fieldset="

2.5 session安全问题

攻击者通过投入很大的精力尝试获得现有用户的有效会话ID,有了会话id,他们就有可能能够在系统中拥有与此用户相同的能力.

因此,我们主要解决的思路是效验session ID的有效性.

if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
}
/* 如果用户session ID是伪造 */
elseif ($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'])
{
session_regenerate_id();
第十一章:会话控制
从php4.0开始引入了对会话的支持,从来可以很方便的通过会话来存储变量值,
尽可能减少对数据库的操作,从而减轻了对系统的负载量,更加方便、灵活的操作数据。

PHP为我们提供了2种会话的解决方案: COOKIE  和  session

1. PHP的COOKIE

COOKIE 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。
PHP在http协议的头信息里发送COOKIE, 因此 setCOOKIE() 函数必须在其它信息被输出到浏览器前调用,这和对 header() 函数的限制类似。

1.1 设置COOKIE:  (会话COOKIE 、 持久COOKIE)

可以用 setCOOKIE() 或 setrawCOOKIE() 函数来设置 COOKIE。也可以通过向客户端直接发送http头来设置.
1.1.1 使用setCOOKIE()函数设置COOKIE:
bool setCOOKIE ( string name [, string value [, int expire [, string path [, string domain [, bool secure [, bool httponly]]]]]] )
name:   COOKIE变量名
value:   COOKIE变量的值
expire:  有效期结束的时间,
path:    有效目录,
domain: 有效域名,顶级域唯一
secure:  如果值为1,则COOKIE只能在https连接上有效,如果为默认值0,则http和https都可以.
httponly: 如果为1,则COOKIE只能通过HTTP协议来访问,而不能通过脚本来访问,很好的避免了XSS攻击。
例子:
$value = 'something from somewhere';

setCOOKIE("TestCOOKIE", $value); /* 简单COOKIE设置 */
setCOOKIE("TestCOOKIE", $value, time()+3600); /* 有效期1个小时 */
setCOOKIE("TestCOOKIE", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* 有效目录 /~rasmus,有效域名example.com及其所有子域名 */
?>

设置多个COOKIE变量: setCOOKIE('var[a]','value');
用数组来表示变量,但它的下标不用引号.(会自动加上下标,如果加上引号会出现重复或者可能会被转义,下标不可用)
这样就可以用$_COOKIE['var']['a']来读取该COOKIE变量.

1.1.2. 使用header()设置COOKIE;
header("Set-COOKIE: name=$value[;path=$path[;domain=xxx.com[;...]]");
后面的参数和上面列出setCOOKIE函数的参数一样.
比如:

$value = 'something from somewhere';
header("Set-COOKIE:name=$value");

1.1.3. COOKIE 的存放位置
不同的浏览器保存COOKIE的位置都不一样,甚至保存格式都是不一样的。
已IE和firefox为例:
IE是把COOKIE保存在C:\Documents and Settings\用户名\COOKIEs中,每个COOKIE是一个txt文件,文件名是以“用户名@网站URL”命名的;
firefox则是把COOKIE保存在C:\Documents and Settings\用户名\Application Data\Mozilla\Firefox\Profiles\随机目录,
在目录下可以看到一个COOKIE.sqlite文件(firefox3.X版本),所有的COOKIE都是保存在这个文件中。

1.2 COOKIE的读取:

直接用php内置超级全局变量 $_COOKIE就可以读取浏览器端的COOKIE.
print $_COOKIE['TestCOOKIE'];

1.3 删除COOKIE
(1)只需把有效时间设为小于当前时间
(2)把值设置为空.
例如:  setCOOKIE("name","",time()-1);
用header()类似.

1.4 常见问题解决:
1) 用setCOOKIE()时有错误提示(headers already sent ...),可能是因为调用setCOOKIE()前面有输出或空格.
也可能你的文档是从其他字符集转换过来,文档可能带有BOM签名(就是在文件内容添加一些隐藏的BOM字符).
解决的办法就是使你的文档不出现这种情况.还有通过使用ob_start()函数有也能处理一点.
2) $_COOKIE受magic_quotes_gpc影响,可能自动转义
3) 使用的时候,有必要测试用户是否支持COOKIE

1.5 COOKIE工作机理:

a) 当客户端初次请求服务器的时候,如果服务器端有设置COOKIE的语句,则服务器通过随着响应发送一个http的Set-COOKIE头,在客户端中设置一个COOKIE文件。
b) 当客户端再次向服务器端发送一个http请求的时候,浏览器会把本地保存该请求地址的COOKIE信息发送到服务器,服务器会自动读取,并将其转换成 $_COOKIE 全局变量,方便调用。

2. PHP中的Session

如果使用session的会话机制,用户每次来访问网站时,都会为每一个访问者创建一个唯一的标示符来区分客户的身份。
这种标示符被成为会话ID(SID),其实SID就是session文件的文件名,具有唯一性和随机性,以确保session的安全。

SID 2种传递方式: COOKIE 或者  URL传递

session_start()
① 为当前访客分配一个唯一的session_id
② 在访客的客户端生产一个存放 session_id  的COOKIE  此COOKIE名默认为 PHPSESSID
③ 在服务器端生成一个session文件,用来存放该访客的所有的会话信息。  session文件名为    sess_session_id的值   (前提:服务器设置的session存放方式为files)

session通常使用过期时间为0的COOKIE,并且将一个称为session ID的唯一标识符作为COOKIE的值,
在服务器端同步生成一些session文件(可以自己定义session的保存类型),与用户机关联起来.并且让数据随着用户在页面之间传递.

要使用session,首先必须通过session_start()来开启一个会话。

2.1 sessionID的传送  (COOKIE 和 URL)

2.1.1 通过COOKIE传送sessin ID

使用session_start()调用session,服务器端在生成session文件的同时,同时生成session ID哈希值和默认值为 PHPSESSID 的session name,并向客户端发送变量为(默认的是)PHPSESSID(session name),值为一个128位的哈希值.服务器端将通过该COOKIE与客户端进行交互.

session变量的值经php内部系列化后保存在服务器机器上的文本文件中,和客户端的变量名默认情况下为PHPSESSID的coolie进行对应交互.

即服务器自动发送了http头:header('Set-COOKIE: session_name()=session_id(); path=/');
即setCOOKIE(session_name(),session_id());

当从该页跳转到的新页面并调用session_start()后,PHP将检查与给定ID相关联的服务器端存贮的session数据,如果没找到,则新建一个数据集.

2.1.2 通过URL传送session ID

只有在用户禁止使用COOKIE的时候才用这种方法,因为浏览器COOKIE已经通用,为安全起见,可不用该方法.
xxx,也可以通过POST来传递session值.

2.2 session基本用法实例

// page1.php
session_start();
echo 'Welcome to page #1';

/* 创建session变量并给session变量赋值 */

$_SESSION['favcolor'] = 'green';
$_SESSION['animal'] = 'cat';
$_SESSION['time'] = time();

// 如果客户端使用COOKIE,可直接传递session到page2.php

echo '
page 2';

// 如果客户端禁用COOKIE
echo '
page 2';

/*
默认php5.2.1下,SID只有在COOKIE被写入的同时才会有值,如果该session
对应的COOKIE已经存在,那么SID将为(未定义)空
*/
?>
// page2.php
session_start();
print $_SESSION['animal']; // 打印出单个session
var_dump($_SESSION); // 打印出page1.php传过来的session值
?>

2.3 删除session
要三步实现.

session_destroy();                                      // 第一步: 删除服务器端session文件,这使用
setCOOKIE(session_name(),'',time()-3600);              // 第二步: 删除实际的session:
$_SESSION = array();                                  // 第三步: 删除$_SESSION全局变量数组
?>

2.4 常用session函数:

bool   session_start(void); 初始化session
bool   session_destroy():  删除服务器端保存session信息的文件
string session_id() 当前session的id
string session_name() 当前存取的session名称,也就是客户端保存session ID的COOKIE名称.默认PHPSESSID。
array  session_get_COOKIE_params() 与这个session相关联的session的细节.
void   session_set_COOKIE_params ( int lifetime [, string path [, string domain [, bool secure [, bool httponly]]]] )设置与这个session相关联的session的细节
string session_cache_limiter() 控制使用session的页面的客户端缓存
ini    session_cache_expire() 控制客户端缓存时间
bool   session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )定义处理session的函数,(不是使用默认的方式)
bool   session_regenerate_id([bool delete_old_session]) 分配新的session id, 用一个新的session_id替换掉当前的session_id, 保存原有的session信息到新的session文件中, 如果参数为true的话,会同时删除原有的session文件,

####################################
#  配置文件中session常用设置
####################################
[Session]

; 定义了存储和获取与会话相关联数据的处理器名称。四种:①files 文件(默认) ②mm  共享内存 ③sqlite  SQLite数据库  ④user  用户自定义的函数
session.save_handler = files

; 传送到save_handler的参数.  在使用文件的情况下, 这里是数据文件被保存的路径.
; 注意: Windows 用户必须改变此值来使用PHP的会话函数.
;
; 和在 4.0.1一样, 你可以定义如下路径:
;
;     session.save_path = "N;/path"
;
; 这里的 N 是一个整数.  使用此参数会在目录内建立一个N层深度的子目录用来保存session文件,
; 而不是将所有session文件保存在同一个/path目录内.
; 这对你或当你的操作系统在一个目录内保存太多文件时出现问题很有帮助.
; 并且对于处理大量session的服务器提供更高的效率.
;
; 注意 1: PHP不会自动创建目录结构. 你可以使用在ext/session目录内的脚本来创建目录结构.
; 注意 2: 如果你选择使用子目录来保存session,请检查下面关于垃圾回收的配置段
;
; 文件存储模块默认使用600模式来创建文件,在使用中你可以改变此选项
;
;     session.save_path = "N;MODE;/path"
;
; 这里的MODE由8进制来表示. 注意这里不会覆盖进程的umask.
;session.save_path = "/tmp"

; 用来设置是否在客户端使用COOKIE来存放会话ID.
session.use_COOKIEs = 1

; 用来设置是否只使用安全链接协议(https)来发送COOKIE
;session.COOKIE_secure =

; 用来决定是否在客户端只使用COOKIE来存放会话ID,而放弃使用URL,很好的保护了那些在URL中传送session id的用户免于被攻击。 默认是 0.
; session.use_only_COOKIEs = 1

; session的默认名称 (作为COOKIE名称来使用).
session.name = PHPSESSID

; 用于指定是否在请求开始的时候自动启动session.
session.auto_start = 0

; 用于指定放送到浏览器端的会话COOKIE的生命周期(单位:秒),或者如果为0表示COOKIE的生命周期直到浏览器被关闭为止。
session.COOKIE_lifetime = 0

; COOKIE有效作用路径.
session.COOKIE_path = /

; COOKIE有效的作用域名.可以防止别的域非法读取自己的会话COOKIE,以增强COOKIE的安全性
session.COOKIE_domain =

; 是否将httpOnly标志增加到COOKIE上, 增加后则COOKIE无法被浏览器的脚本语言(例如Javascript)存取.
session.COOKIE_httpOnly=

; 用于序列化数据的处理器. php是标准的PHP序列化器.
session.serialize_handler = php

; 定义在每次session初始化时启动'垃圾回收'进程的概率.
; 比例由 gc_probability/gc_divisor来得出,
; 例如. 1/100 意味着在每次请求时有1%的机会启动'垃圾回收'进程.

session.gc_probability = 1
session.gc_divisor     = 100

; 指定了经过多少秒数之后,存储的数据会被认为是'垃圾'并且被垃圾回收进程清理掉. 单位:秒。 1440 == 24分钟
; 它的判断依据是最后访问数据的时间,对于FAT文件系统则是最后修改数据的时间。

session.gc_maxlifetime = 1440

; 注意: 如果你使用子目录选项来保存session文件
;       (查看在上面的session.save_path), 那么垃圾回收就 *不会* 自动发生.
;       你需要通过一个shell脚本,cron或者其他方法来自行处理垃圾回收.
;       例如, 下面的脚本相当于将session.gc_maxlifetime设置为 1440 (1440 秒 = 24 分钟):
;          cd /path/to/sessions/; find -cmin +24 | xargs rm

; PHP 4.2 和更早版本有一个未公开的 特性/bug , 此特性允许你在全局初始化一个session变量,即便 register_globals 已经被关闭.
; 如果此特性被使用,PHP 4.3 和更早版本会警告你.
; 你可以关闭此特性并且隔离此警告. 这时候,如果打开bug_compat_42,那此警告只是被显示出来.

session.bug_compat_42 = 1
session.bug_compat_warn = 1

; 检查HTTP Referer来防止带有id的外部URL.
; 用来验证HTTP_REFERER中是否包含指定的字符串(通过下面字段设置),如果包含则会话ID被视为有效。默认为空,表示全部视为有效。

session.referer_check =

; 从此文件读取多少字节.
session.entropy_length = 0

; 在这里指定创建session id.
session.entropy_file =

;session.entropy_length = 16

;session.entropy_file = /dev/urandom

; 设置为 {nocache,private,public,} 来决定HTTP缓冲的类型
; 留空则防止发送 anti-caching 头.
session.cache_limiter = nocache

; 文档在n分钟之后过期.
session.cache_expire = 180

; trans sid 支持默认关闭.
; 使用 trans sid 可能让你的用户承担安全风险.
; 使用此项必须小心.
; - 用户也许通过email/irc/其他途径发送包含有效的session ID的URL给其他人.
; - 包含有效session ID的URL可能被存放在容易被公共存取的电脑上.
; - 用户可能通过在浏览器历史记录或者收藏夹里面的包含相同的session ID的URL来访问你的站点.
session.use_trans_sid = 0

; 选择hash方法
; 0: MD5   (128 bits)
; 1: SHA-1 (160 bits)
session.hash_function = 0

; 当转换二进制hash数据到可读形式时,每个字符保存时有几位.
;
; 4 bits: 0-9, a-f
; 5 bits: 0-9, a-v
; 6 bits: 0-9, a-z, A-Z, "-", ","
session.hash_bits_per_character = 4

; URL rewriter会在已经定义的一组HTML标签内查找URL.
; form/fieldset 是特殊字符; 如果你在这里包含他们, rewriter会增加一个包含信息的隐藏字段否则就是在URL中附加信息.
; 如果你你想遵守XHTML, 删除form的入口.
; 注意 所有合法的入口都需要一个"="符号, 甚至是没有任何值的.
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=,fieldset="

2.5 session安全问题

攻击者通过投入很大的精力尝试获得现有用户的有效会话ID,有了会话id,他们就有可能能够在系统中拥有与此用户相同的能力.

因此,我们主要解决的思路是效验session ID的有效性.

if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
}
/* 如果用户session ID是伪造 */
elseif ($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'])
{
session_regenerate_id();
}


推荐阅读
  • 2月4日每日安全热点节日期间某企远程办公遭XRed攻击 ... [详细]
  • 校内无法访问IEEE等部分数据库的解决方案
    解决了校内无法访问IE ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • 使用python输入PDF编号自动下载freepatentsonline.com的文档#!usrbinenvpython3#codingutf-8#Version:python3. ... [详细]
  • JavaWeb介绍概念JavaWeb,是用Java技术来解决相关web互联网领域的技术总和。web包括:web服务器和web客户端两部分。Java在客户端的应用有javaapplet,不过使 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • PDF内容编辑的两种小方法,你知道怎么操作吗?
    本文介绍了两种PDF内容编辑的方法:迅捷PDF编辑器和Adobe Acrobat DC。使用迅捷PDF编辑器,用户可以通过选择需要更改的文字内容并设置字体形式、大小和颜色来编辑PDF文件。而使用Adobe Acrobat DC,则可以通过在软件中点击编辑来编辑PDF文件。PDF文件的编辑可以帮助办公人员进行文件内容的修改和定制。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • jvm内存区域与溢出为什么学习jvm木板原理,最短的一块板决定一个水的深度,当一个系统垃圾收集成为瓶颈的时候,那么就需要你对jvm的了解掌握。当一个系统出现内存溢出,内存泄露的时候 ... [详细]
author-avatar
棉花小姐啦啦啦取_649
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有