session使用方法
在PHP开发中对比起Cookie,session 是存储在服务器端的会话,相对安全,并且不像 Cookie 那样有存储长度限制,本文简单介绍 session 的使用。
_\_Z.h_?;r2g!q/N31737
'k_T$S1\_x.n_q_b31737 由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容。实际上在服务器端的 Session 文件,PHP 自动修改 session 文件的权限,只保留了系统读和写权限,而且不能通过 ftp 修改,所以安全得多。PHPChina 开源社区门户_k%W%e2C_Y
_y_A'oO_t_D31737PHPChina 开源社区门户_?+s9|:h7a
对于 Cookie 来说,假设我们要验证用户是否登陆,就必须在 Cookie 中保存用户名和密码(可能是 md5 加密后字符串),并在每次请求页面的时候进行验证。如果用户名和密码存储在数据库,每次都要执行一次数据库查询,给数据库造成多余的负担。因为我们并不能 只做一次验证。为什么呢?因为客户端 Cookie 中的信息是有可能被修改的。假如你存储 $admin 变量来表示用户是否登陆,$admin 为 true 的时候表示登陆,为 false 的时候表示未登录,在第一次通过验证后将 $admin 等于 true 存储在 Cookie,下次就不用验证了,这样对么?错了,假如有人伪造一个值为 true 的 $admin 变量那不是就立即取的了管理权限么?非常的不安
_\_Z.h_?;r2g!q/N31737
'k_T$S1\_x.n_q_b31737 由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容。实际上在服务器端的 Session 文件,PHP 自动修改 session 文件的权限,只保留了系统读和写权限,而且不能通过 ftp 修改,所以安全得多。PHPChina 开源社区门户_k%W%e2C_Y
_y_A'oO_t_D31737PHPChina 开源社区门户_?+s9|:h7a
对于 Cookie 来说,假设我们要验证用户是否登陆,就必须在 Cookie 中保存用户名和密码(可能是 md5 加密后字符串),并在每次请求页面的时候进行验证。如果用户名和密码存储在数据库,每次都要执行一次数据库查询,给数据库造成多余的负担。因为我们并不能 只做一次验证。为什么呢?因为客户端 Cookie 中的信息是有可能被修改的。假如你存储 $admin 变量来表示用户是否登陆,$admin 为 true 的时候表示登陆,为 false 的时候表示未登录,在第一次通过验证后将 $admin 等于 true 存储在 Cookie,下次就不用验证了,这样对么?错了,假如有人伪造一个值为 true 的 $admin 变量那不是就立即取的了管理权限么?非常的不安
全。
5K
Z_b%c___p_C31737
_k_k-N3F_B_l_z_[_}
R31737 而 Session 就不同了,Session 是存储在服务器端的,远程用户没办法修改 session 文件的内容,因此我们可以单纯存储一个 $admin 变量来判断是否登陆,首次验证通过后设置 $admin 值为 true,以后判断该值是否为 true,假如不是,转入登陆界面,这样就可以减少很多数据库操作了。而且可以减少每次为了验证 Cookie 而传递密码的不安全性了(session 验证只需要传递一次,假如你没有使用 SSL 安全协议的话)。即使密码进行了 md5 加密,也是很容易被截获的。PHPChina 开源社区门户 K"i(@8i_j#{_\ F ~,S
PHPChina 开源社区门户-Z.F K;m+K8s.Z+_
当然使用 session 还有很多优点,比如控制容易,可以按照用户自定义存储等(存储于数据库)。我这里就不多说了。
_p n_o_y_w u31737
6\ N_i*f_`_n_m31737 session 在 php.ini 是否需要设置呢?一般不需要的,因为并不是每个人都有修改 PHP.ini
5K
Z_b%c___p_C31737
_k_k-N3F_B_l_z_[_}
R31737 而 Session 就不同了,Session 是存储在服务器端的,远程用户没办法修改 session 文件的内容,因此我们可以单纯存储一个 $admin 变量来判断是否登陆,首次验证通过后设置 $admin 值为 true,以后判断该值是否为 true,假如不是,转入登陆界面,这样就可以减少很多数据库操作了。而且可以减少每次为了验证 Cookie 而传递密码的不安全性了(session 验证只需要传递一次,假如你没有使用 SSL 安全协议的话)。即使密码进行了 md5 加密,也是很容易被截获的。PHPChina 开源社区门户 K"i(@8i_j#{_\ F ~,S
PHPChina 开源社区门户-Z.F K;m+K8s.Z+_
当然使用 session 还有很多优点,比如控制容易,可以按照用户自定义存储等(存储于数据库)。我这里就不多说了。
_p n_o_y_w u31737
6\ N_i*f_`_n_m31737 session 在 php.ini 是否需要设置呢?一般不需要的,因为并不是每个人都有修改 PHP.ini
的权限,默认 session 的存放路径是服务器的系统临时文件夹,我们可以自定义存放在自己的文件夹里,这个稍后我会介绍。
!s_r[ f,A_v_g`31737
&C J_j!c!a_V6T_L31737 开始介绍如何创建 session。非常简单,真的。
.K_R_M.S/u ]_r31737
_H?SA!a*U_u31737 启动 session 会话,并创建一个 $admin 变量:
+T ?
}_t%|*a9z_}4O_J31737PHPChina 开源社区门户_V3L Y_t_l_T_q(s_~
!s_r[ f,A_v_g`31737
&C J_j!c!a_V6T_L31737 开始介绍如何创建 session。非常简单,真的。
.K_R_M.S/u ]_r31737
_H?SA!a*U_u31737 启动 session 会话,并创建一个 $admin 变量:
+T ?
}_t%|*a9z_}4O_J31737PHPChina 开源社区门户_V3L Y_t_l_T_q(s_~
<?PHP PHPChina 开源社区门户!Q_[$R(U s_i#@(w // 启动 session PHPChina 开源社区门户 S6X_L0Q#I/S J ] session_start(); 6X_d*z0m-d_`%Y_n.|31737// 声明一个名为 admin 的变量,并赋空值。PHPChina 开源社区门户_O_T_?_t!ir $_session["admin"] = null; PHPChina 开源社区门户!d%R6Q%W6~(I_m)J/cA ?> |
_e_f;|(J_Y#W)Z{31737
如果你使用了 Seesion,或者该 PHP 文件要调用 Session 变量,那么就必须在调用 Session 之前启动它,使用正则化算法调用 session_start() 函数。其它都不需要你设置了,PHP 自动完成 session 文件的创建。
_~_S$M"\2K'r_r31737PHPChina 开源社区门户.e_X"p_]5}3`
执行完这个程序后,我们可以到系统临时文件夹到这个 session 文件,一般文件名形如:sess_4c83638b3b0dbf65583181c2f89168ec,后面是 32 位编码后的随机字符串。用编辑器打开它,看一下它的内容:
_v/L_P_z)~%s2A
K31737
2]3@$t_F_y { S!~ P31737 admin|N;
VI_O_}_^.n"C1\31737PHPChina 开源社区门户_k J"j_D D_g)q3k_J.z
?_}
一般该内容是这样的结构:PHPChina 开源社区门户"|_e B_a_m_[ x_\5|Y([,O-[_a
PHPChina 开源社区门户!D"m(T:a9Q)? q
变量名|类型:长度:值;
_~_S$M"\2K'r_r31737PHPChina 开源社区门户.e_X"p_]5}3`
执行完这个程序后,我们可以到系统临时文件夹到这个 session 文件,一般文件名形如:sess_4c83638b3b0dbf65583181c2f89168ec,后面是 32 位编码后的随机字符串。用编辑器打开它,看一下它的内容:
_v/L_P_z)~%s2A
K31737
2]3@$t_F_y { S!~ P31737 admin|N;
VI_O_}_^.n"C1\31737PHPChina 开源社区门户_k J"j_D D_g)q3k_J.z
?_}
一般该内容是这样的结构:PHPChina 开源社区门户"|_e B_a_m_[ x_\5|Y([,O-[_a
PHPChina 开源社区门户!D"m(T:a9Q)? q
变量名|类型:长度:值;
}_y_P"b'c_U%k/V31737PHPChina 开源社区门户 i nH^_d l$G_f/n_|)r
并用分号隔开每个变量。有些是可以省略的,比如长度和类型。PHPChina 开源社区门户6`/W!w_A*__L;Y8~&U
PHPChina 开源社区门户_b/H#J_T_t+[
我们来看一下验证程序,假设数据库存储的是用户名和 md5 加密后的密码:PHPChina 开源社区门户)m9x_F_e_[ {
1g$V_E_N&K K_R_@31737
<?PHP PHPChina 开源社区门户8d q5s__ {_d $@)m!B_y%[_i_I_@_m31737// 表单提交后... m2q!e_j3e!`31737$posts = $_POST; 6?@_[6J M_Q$u31737// 清除一些空白符号 #W:e:b.l-C31737foreach ($posts as $key => $value)PHPChina 开源社区门户*y_b*y_c_u ]"__| {PHPChina 开源社区门户_t,a_E h_y_E2T/W_? $posts[$key] = trim($value); PHPChina 开源社区门户_c_w%L4I_e%B_} } _F1n)N [1w_}f/N31737$password = md5($posts["password"]); t*t_V&b_F*I_S_a,B31737$username = $posts["username"]; PHPChina 开源社区门户Q.I!H_k9t e_h C_A_t_W3y_B M31737$query = "SELECT `username` FROM `user` WHERE `password` = '$password'"; PHPChina 开源社区门户_t,?#\*I \_P // 取得查询结果 _\8J2]-y_{31737$userInfo = $DB->getRow($query); PHPChina 开源社区门户_JV2[_T(W%s_}#g_~v+N PHPChina 开源社区门户_K#m7v_^W0c_@ if (!empty($userInfo)) !`_U-v7} K31737{ PHPChina 开源社区门户8__R_Q8n0^3S_r7l'v Q if ($userInfo["username"] == $username) PHPChina 开源社区门户_v_F.K#a_|_s_o7Y_l { PHPChina 开源社区门户6Z"~_^-v_X_l*~_k // 当验证通过后,启动 session PHPChina 开源社区门户$FW_P V_W o_Q2g_~ session_start(); PHPChina 开源社区门户 I'H_W9J_C%Z#^ // 注册登陆成功的 admin 变量,并赋值 true PHPChina 开源社区门户'C_x,u_L*S_N,x+`.Q $_session["admin"] = true; PHPChina 开源社区门户.W/I'n/b_P_R } /?+t6A u_N#xT31737elsePHPChina 开源社区门户)E%y_?6~_d r4Z`{ { 9P T%L_es31737die("用户名密码错误"); -u_Q/g_?_w_W_|8i31737} PHPChina 开源社区门户!R-`_w9o5A#M#G_c9m ] } _c/@!B2m_o31737elsePHPChina 开源社区门户 i3H_}"b$K_X0t { _Z+{b!\3n&I_b_y!\31737die("用户名密码错误"); B_i_L+Y1]_A31737} |
PHPChina 开源社区门户,O$u_~
PO/O_|
我们在需要用户验证的页面启动 session,判断是否登陆:
j_F)m_d_e_|_O_?_k31737PHPChina 开源社区门户&z_l_z*__F_S_z
PO/O_|
我们在需要用户验证的页面启动 session,判断是否登陆:
j_F)m_d_e_|_O_?_k31737PHPChina 开源社区门户&z_l_z*__F_S_z
<?PHP PHPChina 开源社区门户"w*pf9N w // 防止全局变量造成安全隐患 _d_k8^_I"m5G_V6M }_w H!A31737$admin = false; P F_i x,S_f_u_[31737 _H:?_U_](Y31737// 启动会话,这步必不可少 PHPChina 开源社区门户_{_a_A_@'i,g.KA:o session_start(); z_d8n(h_G_CR31737 2k_U_x_Z,gf+j31737// 判断是否登陆 PHPChina 开源社区门户_|_O D ^_q_E_uq_e_@ if (isset($_SESSION["admin"]) && $_session["admin"] === true) PHPChina 开源社区门户_yD'A_W_M+M_f!t2D { :B-y_b2c s/~_q31737echo "您已经成功登陆"; _T_x_g P_@__K_q*H!K31737} 4n2K_l3v_Y_q8Q31737else PHPChina 开源社区门户7s&K7x_TW4J_V*T_q_Z { _e%F2_6o1__b h y/[31737// 验证失败,将 $_session["admin"] 置为 false $F#r.c7^3S:g31737$_session["admin"] = false; PHPChina 开源社区门户-J;o_O,[-gdY ` die("您无权访问"); PHPChina 开源社区门户_N_\_G'U.K_N [/{ } U_];K_A_d-E.v_N_@31737 _k_t1S_Y3a_[_S"K.R:Z31737?> |
_u_[_k_n|q)w.x"r_B31737 是不是很简单呢?将 $_session 看成是存储在服务器端的数组即可,我们注册的每一个变量都是数组的键,跟使用数组没有什么分别。
6v3m_n_l!K,?_a31737PHPChina 开源社区门户 O_|*E5v_h c,D_^-y;}
如果要登出系统怎么办?销毁 session 即可。
!s_i_`!q$V&sH$Y_D#C31737PHPChina 开源社区门户4\_v_P_B7|_L/Y_di
<?PHP PHPChina 开源社区门户1B \5Y;L_i"l ?5^ ;Q_l_z_t)k_m)I4I_P_v31737session_start(); T_A_F I_f_E31737// 这种方法是将原来注册的某个变量销毁 !v_}.C_Q_`9?_O1r31737unset($_session["admin"]); _O_q/\2R_J h31737// 这种方法是销毁整个 session 文件 )M(Y B;i_a_w8M.b!M31737session_destroy(); _D_c_p_f P_c_T(F%b,{31737> |
PHPChina 开源社区门户_r_u1@3v"v_g_U_G8j
_ Session 能否像 Cookie 那样设置生存周期呢?有了 Session 是否就完全抛弃 Cookie 呢?我想说,结合 Cookie 来使用 session 才是最方便的。
!c_t a4^_V31737PHPChina 开源社区门户(q2`/m7Z2K_^
Session 是如何来判断客户端用户的呢?它是通过 Session ID 来判断的,什么是 Session ID,就是那个 Session 文件的文件名,Session ID 是随机生成的,因此能保证唯一性和随机性,确保 Session 的安全。一般如果没有设置 Session 的生存周期,则 Session ID 存储在内存中,关闭浏览器后该 ID 自动注销,重新请求该页面后,重新注册一个 session ID。
_w6F1Q%{_^31737PHPChina 开源社区门户 q:Z_h_T:J_a
_ 如果客户端没有禁用 Cookie,则 Cookie 在启动 Session 会话的时候扮演的是存储 Session ID 和 session 生存期的角。PHPChina 开源社区门户_r
u"c7?_n_p__
6R_{~_?_J2i$F31737 我们来手动设置 session 的生存期:
'j&m,X @_B_U_R0D31737
o_y_U:s_I_Z![31737
_ Session 能否像 Cookie 那样设置生存周期呢?有了 Session 是否就完全抛弃 Cookie 呢?我想说,结合 Cookie 来使用 session 才是最方便的。
!c_t a4^_V31737PHPChina 开源社区门户(q2`/m7Z2K_^
Session 是如何来判断客户端用户的呢?它是通过 Session ID 来判断的,什么是 Session ID,就是那个 Session 文件的文件名,Session ID 是随机生成的,因此能保证唯一性和随机性,确保 Session 的安全。一般如果没有设置 Session 的生存周期,则 Session ID 存储在内存中,关闭浏览器后该 ID 自动注销,重新请求该页面后,重新注册一个 session ID。
_w6F1Q%{_^31737PHPChina 开源社区门户 q:Z_h_T:J_a
_ 如果客户端没有禁用 Cookie,则 Cookie 在启动 Session 会话的时候扮演的是存储 Session ID 和 session 生存期的角。PHPChina 开源社区门户_r
u"c7?_n_p__
6R_{~_?_J2i$F31737 我们来手动设置 session 的生存期:
'j&m,X @_B_U_R0D31737
o_y_U:s_I_Z![31737
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论