一个技术问题

时间:2021-08-04 12:06:37
现在要在多个服务器上做网络通行证。虽然有很多方案,但可行性不多,我们要做的事情是不要依赖客户端如cookie,ip验证只依服务器端session进行验证,各位有什么好主意吗?

请注意:
1,一个客户端在多个服务器上的session id是不一样的
2,一定要在服务器端验证,也可以不用session
3,回答前请先说明同客户端,在不同的服务器上操作有何共同点(非客户端)

最好提些实质的回答。

37 个解决方案

#1


我觉得用一个中心服务器,即如果一个用户登陆了,那么信息写到此中心服务器数据库,其他服务器遇到用户访问,先根据IP访问中心数据库,便可知道此用户是否已经登陆。

#2


谢谢你!不过我在上面已经说明了,不能根据ip,因为一个网吧的ip常常是一样的,很容易出问题。

#3


使用数据库是最好的办法

session+数据库

ip认证的话不大妥(当然要看到底是做什么的。)

#4


这个问题其实很简单

只过我们过分的靠现成的东西

假如现在没有session /没有 cookie

你怎么做用户认证呢?

session的运行机制我想不难理解。

如果客户端cookie被禁止了,session在地址栏会出现什么?

这些机制足以完成你现在需要的东西。只靠数据库就行了。其实辅助

看看 Discuz!的这个地址
forumdisplay.php?fid=1&sid=mgtN9wAy

sid=mgtN9wAy  就足够了。


每个登陆的用户,我们为他创建一个唯一的id ,也就是我们给他自定义的session id
同时在数据库创建相关的数据。

我们只要保证在客户端存在这个“session id”查询数据库

便能找到相关的 “session”数据

#5


至于我们自定义的session id


我们可以采用几种方式确保它存在,现成的cookie,session,地址

三种,你认为客户端不可以信任,也可以不采用,或者作为辅助。

#6


谢谢老大!但是假如用sid就可以验证,那岂不是太不安全了?肯定还有其它的信息。cookie不到万不得已,不想用它。

另外,你说的session id在不同的域名,不同的服务器上会变的,根本就无法把客户端和服务器端对应起来。我在开头已经说明了。

#7


哦,没有看清楚。你说的自已要定义的session id正是我们所要东西。但这个session id怎么得到(不用cookie或ip),还不得而知。但应该往这方面想。

#8




你没有明白我的意思

我说的“session id”已经加了引号了,是指我们自定义的session id

不是 php提供的 session id


但是假如用sid就可以验证,那岂不是太不安全了?

// php 提供的session不也是依靠 session id 去判断服务器端的应该读取具体那个文件?
安全问题你完全可以用自定义的算法的去创建“session id”!另外你可以加上前缀什么之类。总之这些可以靠各种手段去保证它的安全。上面只是一点手段而已。还有其他,可以想想的。

#9


但这个session id怎么得到(不用cookie或ip),还不得而知。但应该往这方面想。
// session 的机制你应该多少了解些吧

//我们可以采用几种方式确保它存在,现成的cookie,session,跟地址

#10


呵呵,我是说这个session id如何固定下来,如何和客户端相对应。

因为我从一个网站上,到另外一个网站上时单纯用session_id()得到的session id是要变化的。
所以需要找一个不变的东西,来构造自己的session id,而不是采用原来的session那个所谓的“机制”生成的。

cookie实在是不想用,单用session肯定不行,因为每个服务器里的session不一样。

我也说了,也不能用ip,因为如果在网吧,很多都是一样的。所以你说的地址不能是ip.故还需要找其它的session id.

#11


我是说这个session id如何固定下来,如何和客户端相对应。

因为我从一个网站上,到另外一个网站上时单纯用session_id()得到的session id是要变化的。
所以需要找一个不变的东西,来构造自己的session id,而不是采用原来的session那个所谓的“机制”生成的。


///////////  看来我的表达能力的真很差  :(         555555555555

我说的 session id 加了引号了,不是php的session id
http://community.csdn.net/Expert/topic/3132/3132551.xml?temp=.7485315

.7485315    就是我的“session id”,.7485315是你程序生成的。存放于数据库中

比如表session
sid(varchar)     data(text)

当地址接收地址
http://community.csdn.net/Expert/topic/3132/3132551.xml?temp=.7485315
查询表session
select * from session where sid='$_GET[temp]'
取得data的数据  再explode

取得已经存放的数据

#12


select * from session where sid='$_GET[temp]'


sid的值

你可以通过“cookie,session,跟地址”几种方式去取得,或则只用跟地址也可以!~~

你担心数据库中存在的sid值给人猜中什么的
你可以加上时间限制、过期什么的。
也可以给你创建sid的时候采种什么乱七八糟的算法/加密,反正人家不能猜到又是唯一的就行。



反正思路就是这样。

#13


按照 chinaworker(网络混混 Ken.Hrcn.CN) 这位朋友说的,

如果用户登录了一台web服务器上的某个web站点,同时服务器端也在数据库中记录了针对该用户的一个唯一标识,那么当用户浏览另一台服务器的某个web站点的页面时,服务器端如何识别该用户?

#14


to :12789(大陌) 

我已经说了

><  >< 次了

你可以通过“cookie,session,跟地址”几种方式去取得,或则只用跟地址也可以!~~

#15


“chinaworker(网络混混 Ken.Hrcn.CN)” 说的有道理,可以通过“跟地址”的方式去判断。

#16


混混的方法不错,
session_id本来就是为了它的唯一性而使用的
如果自定义可以自己做算法,
比如用当时的unix 时间戳的MD5后的串,在唯一性和安全性上我觉得都应该是不错的选择,

个人意见,仅供参考!

#17


大家不用完全把精力放在session id 上,
单从 login_name & password 上,做编码就足够了.

对于你的这种情况,我比较赞同混混的第一个方法
-----------------------------------------------
看看 Discuz!的这个地址
forumdisplay.php?fid=1&sid=mgtN9wAy
sid=mgtN9wAy  就足够了。
-----------------------------------------------
对于楼主的顾虑,不知道你担心的安全问题具体在哪?

#18


用url肯定不行的,每个链接都要加一个sid?discuz做的根本就不依赖那个sid....

#19


我想听听唠叨的看法

#20


-----------------------------------------------------------------
混混的方法不错,
session_id本来就是为了它的唯一性而使用的
如果自定义可以自己做算法,
比如用当时的unix 时间戳的MD5后的串,在唯一性和安全性上我觉得都应该是不错的选择
----------------------------------------------------------------

关键所在是,用url传递首先是下下策,cookie也比它安全;其次是如何让每台服务器都能识别这个客户端

#21


.........................................

#22


不知道这样行不行~~~

每个服务器都有一把密钥(可放于全局变量中)而客户端也生成一个随机密钥(SESSION中)用这两把密钥进行运算的结果放到数据库里~~~~而需要这样一个算法:每个服务器的密钥通过这个算法和另一把密钥进行运算的结果相同。(简单的XOR似乎就可以做到。)

这样应该满足楼主的意思了

#23


可能你所说我没有理解。

但在url后面加上sid=xx,以后根据这个sid来验证,不会被采用的。即使安全性没问题,实现起来再方便也不会用它。我觉得这是不明智的。

也不用再和discuz的相比了,那是无意义的,稍微懂点的就知道,sid不是用来身份验证的

#24


我觉得cookie+数据库就可以了,混混同意你的看法。

#25


to mikespook:

非常感谢你的回答。现在的问题是那个"客户端生成一个随机密钥",浏览每台服务器都是会变的,除非用cookie存放或者url...,我们现在想用前者,用url是不可能的。

#26


数据库不支持远程连接。。。呵呵所以现在考虑每个用户登陆时,用cookie记录标识,用文件(可以考虑用session)记录信息,以后只要根据这两个验证就行了。

#27


最后说一次:


session是怎么运行的!
1.当客户端的ie支持cookie,那么session实际上是通过cookie去记录当前用户在服务器端所产生的id址。
2.当你的ie不支持cookie的时候,session_id自动跟在地址后面,为的就是能让服务端能够获取之前服务器产生记录session文件的文件名(既客户端的session id).

不过这一切操作都是由php是自行操作而已

我现在跟你说的只是模拟他的运行机制。

也就是原本服务器上产生的session文件存放到数据库以便多服务器共用,而他的session id我们也自己生成。

我们所以要做的就是确保我们生成的session id跟随客户端。(方法可以是:cookie,session,跟地址,没有光说跟地址一种方法!!!!!!!)

其机制完全跟session一样!这一切操作是我们写的不是php程序自带的。


the end

#28


如果要唯一的确认一个用户,那么就必须在浏览器和服务器间传递一个标识。这一点应该是都认同的了吧?

这个标识如何产生,并不是主要问题。
问题的关键是如何有效的安全的传递这个标识。
安全性由低到高,分别是
url参数
cookie
ssl

session是一个特例,就php而言:
如果客户端cookie不可用,则以url参数方式传递
如果客户端cookie可用,则以cookie方式传递


#29


同意chinaworker(网络混混 Ken.Hrcn.CN)的方法
个人感觉要在http协议下维护一个状态,本质上就那么几种方法。

#30


问题的关键是如何有效的安全的传递这个标识。

///////////////////////////

1.数据库中的(session)数据我们同样是有时间有效性。
2.标识(session id)我们自定义,谁知道我们的算法(如果能猜到只能证明一点,写程序的人太~~~~~~~~~)。

举例 sessin_idsubstr(md5(md5(md5(md5(time())))), 1 , 22)

中间的md5几次

谁知道?  这其实算法都很多。。。

如果这样不安全,同样session也不安全。

你可以连sessin都不用,换其他了。

#31


另外一个生活上的问题:

如果你觉得这样不够安全,请问,你手机冲值卡是怎么冲值的???


人家电信也就一个号码

如果不安全,那是不是人家可以猜出电信的手机冲值卡号码盗用了???

电信的手机冲值卡  商业价值够高了吧!?人家都不怕被猜!!~~~~~~~~~~~~??

#32


多谢徐老师~~~
我对ssl不熟悉。所以尽可能的用cookie了

to chinaworker:
多谢了。
1,没有验证,不敢说
2,地址后面跟PHPSESSID=xxx ,是由php.ini设置的,session.use_trans_sid = 1

你说的那几种方法,用url可以排除,用session也不可能(如果可以,就不用这么麻烦了),所以只剩下cookie好用

其次,我上面提到了, mysql不支持远程连接,所以现在我在想用文件的方式模拟session

#33


MYSQL支持远程连接吧?我用过的啊~~~~

PS:如果真的很在乎安全的话,你可以看看RES三层加密~~~只要客户端用私钥,所有服务器端都用公钥就可以了~~~~

#34


没有绝对的安全。。
mysql支持远程连接的,可能是你的mysql服务器禁止了你远程连接的权限

#35


to ice_berg16
这个偶晓得啊,但由于其它原因,各服务器是几乎独立的,所以没有打开这个权限。

服务器不是我管的,呵呵,不要让俺打开mysql远程连接

多谢大家的帮忙。读数据库不是个好办法,因为用户每走一步,都要去这个数据库读一次,效率上面有些问题,所以现在打算用文件代替它,每个登入用户对应一个文件,这样就好多了

#36


http就是那几种跟服务器联系。要不你在客户端取得cpu,硬盘序号存入每台服务器。
然后登录是判断下。

#37


楼上的不要吓我啊~~

#1


我觉得用一个中心服务器,即如果一个用户登陆了,那么信息写到此中心服务器数据库,其他服务器遇到用户访问,先根据IP访问中心数据库,便可知道此用户是否已经登陆。

#2


谢谢你!不过我在上面已经说明了,不能根据ip,因为一个网吧的ip常常是一样的,很容易出问题。

#3


使用数据库是最好的办法

session+数据库

ip认证的话不大妥(当然要看到底是做什么的。)

#4


这个问题其实很简单

只过我们过分的靠现成的东西

假如现在没有session /没有 cookie

你怎么做用户认证呢?

session的运行机制我想不难理解。

如果客户端cookie被禁止了,session在地址栏会出现什么?

这些机制足以完成你现在需要的东西。只靠数据库就行了。其实辅助

看看 Discuz!的这个地址
forumdisplay.php?fid=1&sid=mgtN9wAy

sid=mgtN9wAy  就足够了。


每个登陆的用户,我们为他创建一个唯一的id ,也就是我们给他自定义的session id
同时在数据库创建相关的数据。

我们只要保证在客户端存在这个“session id”查询数据库

便能找到相关的 “session”数据

#5


至于我们自定义的session id


我们可以采用几种方式确保它存在,现成的cookie,session,地址

三种,你认为客户端不可以信任,也可以不采用,或者作为辅助。

#6


谢谢老大!但是假如用sid就可以验证,那岂不是太不安全了?肯定还有其它的信息。cookie不到万不得已,不想用它。

另外,你说的session id在不同的域名,不同的服务器上会变的,根本就无法把客户端和服务器端对应起来。我在开头已经说明了。

#7


哦,没有看清楚。你说的自已要定义的session id正是我们所要东西。但这个session id怎么得到(不用cookie或ip),还不得而知。但应该往这方面想。

#8




你没有明白我的意思

我说的“session id”已经加了引号了,是指我们自定义的session id

不是 php提供的 session id


但是假如用sid就可以验证,那岂不是太不安全了?

// php 提供的session不也是依靠 session id 去判断服务器端的应该读取具体那个文件?
安全问题你完全可以用自定义的算法的去创建“session id”!另外你可以加上前缀什么之类。总之这些可以靠各种手段去保证它的安全。上面只是一点手段而已。还有其他,可以想想的。

#9


但这个session id怎么得到(不用cookie或ip),还不得而知。但应该往这方面想。
// session 的机制你应该多少了解些吧

//我们可以采用几种方式确保它存在,现成的cookie,session,跟地址

#10


呵呵,我是说这个session id如何固定下来,如何和客户端相对应。

因为我从一个网站上,到另外一个网站上时单纯用session_id()得到的session id是要变化的。
所以需要找一个不变的东西,来构造自己的session id,而不是采用原来的session那个所谓的“机制”生成的。

cookie实在是不想用,单用session肯定不行,因为每个服务器里的session不一样。

我也说了,也不能用ip,因为如果在网吧,很多都是一样的。所以你说的地址不能是ip.故还需要找其它的session id.

#11


我是说这个session id如何固定下来,如何和客户端相对应。

因为我从一个网站上,到另外一个网站上时单纯用session_id()得到的session id是要变化的。
所以需要找一个不变的东西,来构造自己的session id,而不是采用原来的session那个所谓的“机制”生成的。


///////////  看来我的表达能力的真很差  :(         555555555555

我说的 session id 加了引号了,不是php的session id
http://community.csdn.net/Expert/topic/3132/3132551.xml?temp=.7485315

.7485315    就是我的“session id”,.7485315是你程序生成的。存放于数据库中

比如表session
sid(varchar)     data(text)

当地址接收地址
http://community.csdn.net/Expert/topic/3132/3132551.xml?temp=.7485315
查询表session
select * from session where sid='$_GET[temp]'
取得data的数据  再explode

取得已经存放的数据

#12


select * from session where sid='$_GET[temp]'


sid的值

你可以通过“cookie,session,跟地址”几种方式去取得,或则只用跟地址也可以!~~

你担心数据库中存在的sid值给人猜中什么的
你可以加上时间限制、过期什么的。
也可以给你创建sid的时候采种什么乱七八糟的算法/加密,反正人家不能猜到又是唯一的就行。



反正思路就是这样。

#13


按照 chinaworker(网络混混 Ken.Hrcn.CN) 这位朋友说的,

如果用户登录了一台web服务器上的某个web站点,同时服务器端也在数据库中记录了针对该用户的一个唯一标识,那么当用户浏览另一台服务器的某个web站点的页面时,服务器端如何识别该用户?

#14


to :12789(大陌) 

我已经说了

><  >< 次了

你可以通过“cookie,session,跟地址”几种方式去取得,或则只用跟地址也可以!~~

#15


“chinaworker(网络混混 Ken.Hrcn.CN)” 说的有道理,可以通过“跟地址”的方式去判断。

#16


混混的方法不错,
session_id本来就是为了它的唯一性而使用的
如果自定义可以自己做算法,
比如用当时的unix 时间戳的MD5后的串,在唯一性和安全性上我觉得都应该是不错的选择,

个人意见,仅供参考!

#17


大家不用完全把精力放在session id 上,
单从 login_name & password 上,做编码就足够了.

对于你的这种情况,我比较赞同混混的第一个方法
-----------------------------------------------
看看 Discuz!的这个地址
forumdisplay.php?fid=1&sid=mgtN9wAy
sid=mgtN9wAy  就足够了。
-----------------------------------------------
对于楼主的顾虑,不知道你担心的安全问题具体在哪?

#18


用url肯定不行的,每个链接都要加一个sid?discuz做的根本就不依赖那个sid....

#19


我想听听唠叨的看法

#20


-----------------------------------------------------------------
混混的方法不错,
session_id本来就是为了它的唯一性而使用的
如果自定义可以自己做算法,
比如用当时的unix 时间戳的MD5后的串,在唯一性和安全性上我觉得都应该是不错的选择
----------------------------------------------------------------

关键所在是,用url传递首先是下下策,cookie也比它安全;其次是如何让每台服务器都能识别这个客户端

#21


.........................................

#22


不知道这样行不行~~~

每个服务器都有一把密钥(可放于全局变量中)而客户端也生成一个随机密钥(SESSION中)用这两把密钥进行运算的结果放到数据库里~~~~而需要这样一个算法:每个服务器的密钥通过这个算法和另一把密钥进行运算的结果相同。(简单的XOR似乎就可以做到。)

这样应该满足楼主的意思了

#23


可能你所说我没有理解。

但在url后面加上sid=xx,以后根据这个sid来验证,不会被采用的。即使安全性没问题,实现起来再方便也不会用它。我觉得这是不明智的。

也不用再和discuz的相比了,那是无意义的,稍微懂点的就知道,sid不是用来身份验证的

#24


我觉得cookie+数据库就可以了,混混同意你的看法。

#25


to mikespook:

非常感谢你的回答。现在的问题是那个"客户端生成一个随机密钥",浏览每台服务器都是会变的,除非用cookie存放或者url...,我们现在想用前者,用url是不可能的。

#26


数据库不支持远程连接。。。呵呵所以现在考虑每个用户登陆时,用cookie记录标识,用文件(可以考虑用session)记录信息,以后只要根据这两个验证就行了。

#27


最后说一次:


session是怎么运行的!
1.当客户端的ie支持cookie,那么session实际上是通过cookie去记录当前用户在服务器端所产生的id址。
2.当你的ie不支持cookie的时候,session_id自动跟在地址后面,为的就是能让服务端能够获取之前服务器产生记录session文件的文件名(既客户端的session id).

不过这一切操作都是由php是自行操作而已

我现在跟你说的只是模拟他的运行机制。

也就是原本服务器上产生的session文件存放到数据库以便多服务器共用,而他的session id我们也自己生成。

我们所以要做的就是确保我们生成的session id跟随客户端。(方法可以是:cookie,session,跟地址,没有光说跟地址一种方法!!!!!!!)

其机制完全跟session一样!这一切操作是我们写的不是php程序自带的。


the end

#28


如果要唯一的确认一个用户,那么就必须在浏览器和服务器间传递一个标识。这一点应该是都认同的了吧?

这个标识如何产生,并不是主要问题。
问题的关键是如何有效的安全的传递这个标识。
安全性由低到高,分别是
url参数
cookie
ssl

session是一个特例,就php而言:
如果客户端cookie不可用,则以url参数方式传递
如果客户端cookie可用,则以cookie方式传递


#29


同意chinaworker(网络混混 Ken.Hrcn.CN)的方法
个人感觉要在http协议下维护一个状态,本质上就那么几种方法。

#30


问题的关键是如何有效的安全的传递这个标识。

///////////////////////////

1.数据库中的(session)数据我们同样是有时间有效性。
2.标识(session id)我们自定义,谁知道我们的算法(如果能猜到只能证明一点,写程序的人太~~~~~~~~~)。

举例 sessin_idsubstr(md5(md5(md5(md5(time())))), 1 , 22)

中间的md5几次

谁知道?  这其实算法都很多。。。

如果这样不安全,同样session也不安全。

你可以连sessin都不用,换其他了。

#31


另外一个生活上的问题:

如果你觉得这样不够安全,请问,你手机冲值卡是怎么冲值的???


人家电信也就一个号码

如果不安全,那是不是人家可以猜出电信的手机冲值卡号码盗用了???

电信的手机冲值卡  商业价值够高了吧!?人家都不怕被猜!!~~~~~~~~~~~~??

#32


多谢徐老师~~~
我对ssl不熟悉。所以尽可能的用cookie了

to chinaworker:
多谢了。
1,没有验证,不敢说
2,地址后面跟PHPSESSID=xxx ,是由php.ini设置的,session.use_trans_sid = 1

你说的那几种方法,用url可以排除,用session也不可能(如果可以,就不用这么麻烦了),所以只剩下cookie好用

其次,我上面提到了, mysql不支持远程连接,所以现在我在想用文件的方式模拟session

#33


MYSQL支持远程连接吧?我用过的啊~~~~

PS:如果真的很在乎安全的话,你可以看看RES三层加密~~~只要客户端用私钥,所有服务器端都用公钥就可以了~~~~

#34


没有绝对的安全。。
mysql支持远程连接的,可能是你的mysql服务器禁止了你远程连接的权限

#35


to ice_berg16
这个偶晓得啊,但由于其它原因,各服务器是几乎独立的,所以没有打开这个权限。

服务器不是我管的,呵呵,不要让俺打开mysql远程连接

多谢大家的帮忙。读数据库不是个好办法,因为用户每走一步,都要去这个数据库读一次,效率上面有些问题,所以现在打算用文件代替它,每个登入用户对应一个文件,这样就好多了

#36


http就是那几种跟服务器联系。要不你在客户端取得cpu,硬盘序号存入每台服务器。
然后登录是判断下。

#37


楼上的不要吓我啊~~