关于web的用户身份认证问题...300分(300分)

  • 主题发起人 主题发起人 cAkk
  • 开始时间 开始时间
C

cAkk

Unregistered / Unconfirmed
GUEST, unregistred user!
大家可能都去过www.xdrive.com,xxx.freediskspace.com这样的提供"网络硬盘"站点,
一个用户登陆之后,就可以操作她自己的资源,请问是怎样认证的?

我知道可以用cookie,但是cookie安全性太差了,不能用在重要的地方.
其实类似的还有那些webmail站点,它们是怎样实现身份认证,又是怎样
在当前session里面保存认证信息的?
 
我都想知道
 
我K!!!

刚写了不下500字!一发送,送不出去!
一怒之下,不发了!
:(~~~~~~~~~~
 
再发一遍吧!求求你了!!!
 
其实我也想知道!
 
aimingoo:
可以不在卖关子吗?
 
根据ip和端口判断用户难道不行么,其实也没难的,
就是自己做个专用服务端不就行了(这东西也用不着和iis和apache一样支持cgi或isapi,所以不麻烦)。



注意需要connect alive!
 
cAKK:现在不能访问国外站点,还没去看,不过,用操作系统的验证(比如NT和IIS)
是否安全性会好点呢?另外,如果像楼上说的,写专用服务器程序,ASTA不是有个现
成的网络硬盘吗?验证以后用IP的确是个有趣的注意,没试过……
 
1.IIS应该可以实现,不过我想知道那些站点怎么实现的? 比如提供webmail的站点.
2."专用服务器程序"是不是要重头写一个完整的webserver? 还要支持cgi/isapi??
太麻烦了吧?
3.ASTA的网络硬盘是什么? 我怎么没看到?
 
2.呵呵,是不是ISAPI FILTER可以搞定?没写过……
3.实际上就是个远端文件管理嘛,自己写也很方便的啦
1.还没去看……
 
>>实际上就是个远端文件管理嘛,自己写也很方便的啦
我不想用特殊的服务器,因为客户段必须用浏览器访问的呀

BTW: 你现在怎么不能访问国外了? 这么惨? :-(
 
呵呵,用ActiveX吧——晓得你不会用它……

我是用免费帐号,所以不能出国,是惨——没钱啊
 
iis如果要用session那就只能用cookie了,
自己做个webserver也不是难事么!又不用支持cgi和isapi.
这个webserver的主要功能就是上传下载了,http协议还是可以实现这些的
 
在JSP中,一般是使用Session.AddAttribute来完成你的功能,此Session占用Server
端内存,所以是相当安全的.当然最好在用完后remove一下就行了.
 
不是简单的要再发一下下的问题,因为我还得重输一回,而自己又没有事发作个备份。所
以...才会这样愤怒!

很久以来,我在写ISAPI时都为这个问题所困扰,所以一直也在试图解决它。
这个问题其实应该分成两个部分:
1. 安全注册,即“怎样实现身份认证”;
2. 注册状态保存,即“在当前session里面保存认证信息”。

首先,必须明白HTTP是一个无状态的协议,即TCP/IP连接是非长效的,两个HTTP请求之间
没有关系,也不存在保存状态/或者关系的方法。
但是,我们可能有这样一个需求:
在一个社区系统中,用户只需要一次注册,接下来的所有操作都以这个用户身份进行的,
不需求再一进行注册。例如在FreeDriver中的操作一样。
FreeDriver中的操作还有一个特殊的地方:在一个注册中,所有的操作在同一个IE的页面
中不需要注册。但重新打开一个IE进入时,就需要注册了。关于这一点的实现,在后面的
行文中再讨论。

这个需求的特殊地方就是两个IE的HTTP请求之间要保存一下用户的注册状态信息。显然,
正常的HTTP方法是实现不了的。

在ASP中,这个需求实现起来似乎很容易:ASP中有Application和Session对象,可以在两
个HTTP请求中通过Session来保存一些状态数据(当然是任意格式的)。也可以在Application
中做这些,两者的选择更多的在于你的爱好。--哈哈...
但是,ASP真的解决问题了么?不,没有。
在ASP中,Appliction的对象由ASP解释器在服务器端用内存方法实现,它必须使用Lock/UnLock
方法来作全局保护,大量的Application属性引用,无疑将ASP应用频繁置于单线程处理方式。
这就意味着服务器端产生大量的HTTP请求,ASP队列堵塞。
在ASP中,Session是用Cookies来实现的,因此,Session实际上有超时限制。这很有趣。
有没有想过,一个用户在网吧上网,他注册进入一个社区系统,进行一些操作。三分钟后,它
退出了。接下来下一个用户就可以直接用这个用户的身份和帐号在社区里#℃!$%℃!了。
哈哈,很可怕。原因很简单。因为Session的没有超时。其实就是Cookies没有超时。

上面所提到的用Session方法来保存信息出现的问题可以用两个方法来解决:
之一:就是让用户在退出社区时按下“退出...”按钮,而不是IE右上角的那个小叉。但是,你
能保证他按了吗?
之二:用脚本在IE中写Document.OnUnload事件处理程序。当用户关闭主窗口时,你向服务器发
一个“退出”的消息。然后服务器端释放Session和Cookies。但是,很可恶的是,IE并不在OnUnload
处理后为你发出的消息--一个HTTP请求--做任何的延时,这就是说:有可能你的“退出”
信息还没有向服务器端发送,你的IE就已经已经关系了。

之所以花这样多的文字来说明ASP的实现方法和缺陷,就是因为ASP的解释器其实也是一个ISAPI
应用,同样的问题也会出现在我们自己开发的ISAPI中。
要想在Perl/PHP之类不通过ISAPI实现的解释器中实现状态保存,几乎是不可能的。当然,如果
你愿意用Cookies这种方法的话,是例外。

接下来回到上面的两个问题:“安全注册”,“注册状态保存”在Delphi的ISAPI中的实现。

第一个很简单:那就是HTTP的安全补充协议:SSL。
SSL的目的主要是在服务器和客户端之间安全地通过HTTP协议传送数据。在两个物理设备之间数据
将通过编码方式传送,Cookies也可以通过编码方式保存。这样即可以做到数据安全。
这里是关于SSL的一个实例:
http://www.ritlabs.com/ftp/pub/tinyweb/tinyweb.zip
http://www.ritlabs.com/ftp/pub/tinyweb/tinyssl.zip
可惜的是TinySSL并没有源码。
这是一个涉及SSL的源代码包,你可以看看,我没有研究过它。
http://www.inprises.com/control/ipworks4 with ssl delphi.zip
这是一个实现SSL的HTTP组件(TAdvHttp V 1.1),但没有源代码:
http://www.delphipages.com/uploads/WebRelated/advhttp.zip
随便补充一点,许多的商业性网站,以及FreeDriver都是用SSL来保障用户的密码安全的。

第二个问题在ISAPI没有解决方法。
但是,你可以防照前面谈到ASP上的实现方法来处理它们,只要你能够忍受用户在网吧之类的使用
固定IP的情况时上网、以及无法有效地清除Cookies值所导致的副面效果即可。哈哈……
不过,另外也有一些旁门左道。我在仔细研究过UBB(Ultimate Bulletin Board)的代码--Perl写
的--之后,发现它的实现方法很有趣。哈哈……下面谈谈,或者是一个很不错的ISAPI实现思路。
在UBB中,第一次注册后,UBB开始创建Cookies,同时,为接下来在返回页面中生成的每一个的URL
附加一个一个Session ID。这样,只有同时满足Cookies_UserName + Cookies_UserID + Session_ID
三个条件的一个URL请求才被认为是合法的。在全部窗口都关闭之后,无法得到正确的Session_ID,
这样即可得到一个安全的全程注册。
事实上,这里的条件可以表达为:
Remote_IP + Cookies_UserName + Cookies_UserID + Session_ID + Cookies_TimeOut
这样可以更加安全。这种方法其实是利用了URL/Post Request来保存两个请求间的状态信息。
这种方法只能是相对安全的,因为IE的临时文件可能暴露一些信息。
不过,还有什么是IE的临时文件不会暴露的???!!!
 
写完了,才发现还有一些应该补充的:

to timerri:
--------------
不能用IP来判定。因为网吧用的是通常是固定IP。
专用服务端也并不能解决,因为HTTP就是无状态/非长效连接的协议。怎么实现都是这样。:(

to CJ:
--------------
ISAPI FILTER不是用来干这个的,解决不了这个问题。
如果能的话,ASP中实现就不用这么麻烦了。——它的解释器就是一个ISAPI FILTER。
ActiveX是一个方法,但实在太黑暗了。你相当于给用户安装了一个客户端程序。哈哈,不过,
不要忘了还要用户第一次进入时那一个安全认证。——反正我不敢选“确认”。

另外:
--------------
居然忘了还有另一种解决问题的方法。就是HTTP的Push/Pull技术。
在ISAPI的实现上,Push意味着一个活动连接保持到全部Push操作结束。这样两个Push动作
之间就可以存在状态。换一个角度来看,事实上,IIS为一个Push请求在ISAPI与IE之间打
开了一个TCP/IP活动连接。
显然,这是一个很不错的解决方法。但仔细看看Push的协议就明白,Push动作之前必须完
全保持连贯。这种连贯在一些实例中是不必要的(比如BBS发贴子)。Push通常用来实现聊天
室和动态图片(如计数器。)。
当然,如果你愿意细心地去处理网页以保证所有Push到Client的网页都连贯的话,也不是做
不到的。但这样的话,另一个可怕的问题就跳出来了。
——由于Push意味着HTTP活动连接的开销,那么,大量的Push就意味着服务器端大量的TCP/IP
活动连接。IIS可能因为资源耗尽而崩溃。这尤其会表现在象社区/聊天室这样的系统上。
解决问题的方法:不要用Push……哈哈……
 
to amingoo
对于http协议的connect keep alive,我们可以使客户的ip+端口唯一来确定用户,但是这样做会出一些问题,比如用户用弹出新窗口时服务器会认为是一个新的用户进行连接。
不过对于单窗口操作(也就是单连接)来说,这是个绝对可行的方法!
asp中的session没你说的那样差,不信你可以试试用两个ie同时打开两个社区,结果是两个ie的sessionID都不相同,也就是说,只要关闭了本连接的ie(无论用什么方法),再次打开的窗口都不会使用上次的sessionID!!!!

to all
在asp中session也是用cookie来实现的,建立连接时服务器会发送一个sessionID(随机产生)作为cookie给客户端
客户端下次连接时就会向服务器发送这个sessionID,服务器就根据这个sessionID唯一确定用户,当然重要的信息还是保存在服务器上(不是cookie中),这样就达到了既能保存重要信息,又保证安全。
由于sessionID有过期的限制,所以要猜中sessionID是几乎不可能的!
按照这种方式我们就可以做出我们自己的服务器实现上述要求了
 
oh...哈,timerri,connect keep alive是ASP中的概念吧。我不用ASP,只对它有些
概念性的了解,不能对这个东东多说什么。但我怀疑它实际用的是push,因为HTTP协
议没有保持连接的方法。关于这个我正在查资料。
不过想来,如果“使客户的ip+端口”来确定用户的话,可能并不是绝对有效的。当一

在asp中session使用cookie时可能不一定是在返回页“当前”作用域。它可以设置在
HTTP请求DOMAIN的全部作用域。比如大富翁论坛就是。在注册大富翁后打开两个IE,
你会发现都不需要再次注册。这个Cookies的值被存在了DOMAIN域,所有向这个服务器
发的请求都不需要再注册。
 
那也得看 这两个 ie 是怎么打开的, 用 ctrl + n 是这样的,
但重新点开一个就不行的。
 
后退
顶部