|
去先说session ' J S; x. _+ O. E0 A
( E# Z) N, h8 u2 V 对SESSION的争论好象一直没有停止过,不过幺麽能理解SESSION的人应该占90以上。 0 w! L. d4 s9 E+ g
但还是讲讲,别嫌老~ 8 A' y: J- L& {9 Z8 G( a
& F) d+ k+ _1 ]! Y0 e, [4 p& D) \
有一些人赞成用SESSION,有一些人不赞成。但这个问题到底要怎么说。不妨听听我的看法 9 F/ v# n$ F+ Z& W3 D) k. i Y# @
3 d1 Y; B1 i/ a! ~. R7 H' o2 K 如果有错误请不要朝丢东西,金条和硬币除外。
' H% c) m& ~3 {! S0 V! Q" k: o* d
* M* I* U- a/ C# m 有些人应该知道我是做江湖程序的,而江湖程序做看中的就是效率,但这里不谈设计,而 ; V& w% q9 Y9 V) k
( B+ v! l; ]& N& k, {
从一些比较实际的角度看SESSION。
: l- \ [5 A1 b& S3 A/ D
7 c4 ]4 L3 S4 v! J/ Y6 b 首先要先说SESSION是干什么的,SESSION是可以存储针对与某一个用户的IE以及通过其当 - A+ R: W5 i% A) x5 D7 G" ~" n" R
" L) f+ [1 a6 K/ u; V2 y( O 前窗口打开的任何窗口具有针对性的用户信息存储机制。为什么要这样说。看下边 : Z8 p4 @1 ?0 Z- a
2 @' A* J& d# ~$ x* c8 f3 K 先研究SESSION是如何启动的,当打开IE以后浏览网站后会发出一个指令请求SESSIONID以
x0 F8 J, u+ T' {# H6 s$ p+ \( H
及对各个类型数据的下载许可,如图片,声音以及FLASH。 # W- A+ \: t2 e0 e0 j) z7 C) ^
数据实际传输内容:IE到服务器 0 t3 \/ d- x+ a, j/ u4 ]! \6 R
GET / HTTP/1.1
% t0 R* R6 x4 P! {Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
( m% _* ]- {" V+ m5 b: B$ IAccept-Language0: zh-cn ( u( C9 ~1 _; G* \
Accept-Encoding: gzip, deflate : U5 d+ G/ u0 y
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
/ e4 \: [2 ?: E1 AHost: www.jh521.com & [1 a0 h0 s: z$ |; [% p, O a% n
Connection: Keep-Alive
8 V5 J: N+ k8 g9 r服务器会返回一个没有被使用的SESSIONID让IE使用,当时IE就对返回SESSIONID做存储
" S+ {) q2 }/ j5 f; m
2 Q, P0 t5 r8 {9 X4 |2 P. J& K" v 并同时返回相关页面的下载数据,如下:服务器到IE ) h/ `" y& c9 q) k9 o; a: z
HTTP/1.1 200 OK + O6 C" d0 N- d8 \6 b
Server: Microsoft-IIS/5.0 1 [0 h1 b$ {; q8 _; s
Date: Sun, 30 Nov 2003 16:41:51 GMT
2 M9 u; S1 o& F* u, {' [Content-Length: 21174..Content-Type: text/html
( m( o6 A: w3 A* a l( x# N$ ~4 ISet-Cookie: ASPSESSIONIDCACBBBRT=IBOMFONAOJFEEBHBPIENJFFC; path=/ 1 M0 m/ v% W8 [' {) V0 P0 Y
Cache-control: private
V( o6 j. L, l1 C# {% }' N然后就是页面HTML代码 . ]8 d. c) M I6 n" T
4 S6 F- [# V$ H3 R+ u3 ?3 F 此时这个IE程序(不是客户机)的SESSIONID就为IBOMFONAOJFEEBHBPIENJFFC
% Z1 {4 y$ u. v, {+ D# I4 |) V$ `" l( {6 q
而当IE在访问任何这个站点的ASP程序的时候,就会把IBOMFONAOJFEEBHBPIENJFFC发送 $ {& H0 ^7 i' C/ Z! ^' }! A) U5 b
) {; S/ v6 p* \* W- j 给服务器,服务器就会知道IBOMFONAOJFEEBHBPIENJFFC是表示你
; n) x- i8 A7 f. c Y; ~9 H而在服务器上设置SESSION("name")="name" ( b( Z ?$ ]+ N7 y# O
完全可以看成是
+ F1 \. e, P# F5 p+ H) T8 uSESSION("IBOMFONAOJFEEBHBPIENJFFC")("name")="name"
3 K+ P$ W5 h1 q: p! W2 j或者 7 F1 A, Q9 i/ I8 W9 v5 ?
SESSION(SESSIONID)("name")="name" 1 c" I: a5 r; @. k. w
这样,SESSION就区分开用户了。 , q4 }3 ?# |- o# |
而当服务器反馈这个ID的时候会看这个ID有没有被使用。如果有在换一个 6 H9 J3 `8 i: z2 e
反正不会让你重复,如果想模拟某人的SESSION的ID来进行欺骗是可以的。不过要获取到
/ F/ Z% }3 B- Z# N2 F2 ]
' | }. t: w% C. V$ A* H' u 对方IE传输信号,并且在保证当时这个SESSIONID没有被取消的情况下才可能实施。
" G, \9 U7 |- ^& D+ {) j) i
6 L4 n9 e* k+ i% D 不过要是我有那时间直接通过POST信号找他NAME和PASS了。我可不费这个劲
% i/ A6 Z6 S: u# s) f8 \: _$ z; P* b0 m9 O9 B
想必一些人明白了了SESSIONID到底是如何工作的 " Y( }4 b# \8 P* Y% Z) f
+ D% D6 m- x" T s, `6 g 那么就在看看COOKIE,有人说SESSIONID就是COOKIE,按照技术上来讲他们不属于同类
5 y6 L0 \0 p5 S/ ]: }0 D: z( u+ e, K9 X* M7 @
但是属于一种工作模式,用户和服务器传输私有数据
8 r7 D$ i A7 |; B, H# P" q4 U8 t1 N! _! k L+ V
当我设置COOKIE的时候,服务器会反馈给IE一个指令。IE通过这个网络指令生成COOKIE并
6 r) L3 j; \! ~1 l+ i& W& R1 _! E, g6 A) W$ m K3 S, I; P8 k
存放,在特定的时候会取得这个这个信息如在访问这个站点并且COOKID有效的时候。
7 [$ D$ v# T7 {3 S# K$ F2 I* e7 u: ~2 Q4 q h/ ] {
那么为什么要用COOKIE而不用SESSION呢
" p7 j/ C+ [$ ^9 \看下区别 ) a* D( D& F1 r! A6 ?
5 C# }- Z# G2 y& t. j
有效时间以及存储方式 传输内容 9 U$ U6 g- ^; g
COOKIE 可设置并在本地保留 明码信息 ! L- a8 [6 g9 O$ j; r
- n% j# j. v* g9 k: F
SESSION 在IE不关闭并服务器不超时 只有SESSIONID , w; p3 ?7 n. W- y4 _
; h; u0 [: J# A( c! ~+ }! f+ Z; ] 当如果想让用户下次登入网站不需要输入用户名或者密码的时候就只能用COOKIE, . m9 N. {4 H* o
' Z9 ]3 f1 n& x6 r 因为他可以保留相当长的时间(在COOKIE记录被删除或者失效日期之前)
8 x3 Q5 R' R, w7 s% L2 f: v# v- O1 R+ k7 T& t
而SESSION就不可以,他不会保留太长时间,而且IE在关闭后就自动清除了SESSIONID记录
/ e( ?' Z. h" Z
7 w2 k {; j5 P- q" V- L 在下次登入的时候会请求新的SESSIONID
4 ?) w7 c9 ]2 ?4 R: Y; i; k* t; ^& x. g
而服务器想通过用户个人变量校验用户的状态的时候,就不能用COOKIE
, ^( g3 t, F" }, c f2 z9 o+ R, L4 A1 z) k- R
如果用设置用户权限是USER。而IE访问的时候就把USER的明码传输到服务器。 % V% h$ U/ N8 \5 f$ a& n
0 }, n6 r) ?; x3 \6 Y- k
那么如果我通过一定手段,比如直接修改COOKIE记录,把USER修改成ADMIN呢~~ ) b- W* G9 h, {( T
2 C0 i, W$ K' Z* i" y( T* N 就麻烦了。
# {7 N, r7 ?( S4 s# d) k7 [3 H
但存储用户名和密码或者网站的配色方案这样的信息,用COOKIE是最好的
! l; _1 T: Y" e& J8 ]2 e1 ^$ g+ F% s+ y! E* {! W
8 I- Z! V' f3 @* Y1 e好,有点累了,在说说这个东西 D Y5 N" B# Z) h: G! c) E( |
Request.ServerVariables("HTTP_REFERER") $ D8 D, ^& Y1 V' d
- r0 ^$ T2 \4 ?* b9 c3 F [ 我想有一些人通过这个Request.ServerVariables("HTTP_REFERER")
- x4 X4 g; a$ Y/ I* A7 w% ]; ]2 u& l来进行一些关键性限制,特别是对付远程提交以及非法侵入。 8 D7 ^5 x# U/ I( T7 a) W
那么我就要提醒下服务器取得的HTTP_REFERER信息完全是IE传输给服务器的,可以模拟
* X' T4 z% ~8 n9 I4 h* s& x/ ~而且难度不大,用不到半个小时就可以用VB做出一个针对HTTP_REFERER入侵程序。 : j5 M) a* ^& d# h
(可惜我原先那他没干正经事情,做WEB游戏挂机程序来的) c h6 _/ q" X' Z& T. x: v- U
|