如果在用户认证系统中保证同一用户同一时间唯一使用? 那就做个过期判断,例如加一个 login_time 字段,记录登陆时间;如果用户退出,则 Enable ;如果用户想登陆,则先查看 login_time 是否过期,如果没过期,再看Enable... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个问题我主要想解决用户非正常退出的话,由于enable字段状态为不可用,所以即使用户本身也进入不了! 检查 login_time 是否过期,如果过期则允许登陆。 OK!照您的说法,假设login_time的时间是:2003-05-30 00:12:00,那么当用户非正常断线时,他重新进入的话,login_time肯定是过期的了,他是可以登录了.但是,如果他使用的同时有其他非法用户使用该密码登录的话,login_time依然是过期的呀! 我是说还要检查 login_time 是否过期,要定义其过期时间,例如10分钟;每个页面都重新更新数据库里的 login_time ,如果发现它与当前时间超过10分钟,则要求其重新登陆(在线用户);或允许其登陆(未登陆用户) $sql = "select login_time from table";$result = mysql_query($sql);$theDateTime= mysql_result($result,0,'login_time');$hour = intval(substr($theDateTime,11,2));$minute = intval(substr($theDateTime,14,2));$second = intval(substr($theDateTime,17,2));$month = intval(substr($theDateTime,5,2));$day = intval(substr($theDateTime,8,2));$year = intval(substr($theDateTime,0,4));$login_time= mktime($hour, $minute, $second, $month, $day, $year);$nowTime = date("Y-m-d H:i:s");$minute = intval(substr($nowTime,14,2));$second = intval(substr($nowTime,17,2));$month = intval(substr($nowTime,5,2));$day = intval(substr($nowTime,8,2));$year = intval(substr($nowTime,0,4));$now_time = mktime($hour, $minute, $second, $month, $day, $year);if(($nowTime - login_time)>600){ //上次登陆时间到现在大于600秒,允许登陆...} 检查是不是同一个IP是不是可以做到呢?如果在同一时间有两个不同的IP则kill掉。呵呵!个人看法,抛砖引玉。 我是用ustb的办法解决的,也就是用ip机制,不过要注意直接ip与代理ip均要能识别出来!时间机制不能根本解决问题! to istrue(象) 时间机制为什么不能根本解决问题? 这样吧test.php<?phpinclude "user.php";?>hellouser.php<?phpsession_start();$conn = mysql_connect("chizhou");mysql_select_db("test");if($_SESSION['name']) { // 修改用户最后刷新时间 mysql_query("update users set satart=NOW() where name='{$_SESSION['name']}'");}mysql_query("delete from users where (NOW()-start)>500"); // 5分钟未刷新if($_POST['cmd']) { // 用户登录判断 $name = $_POST['name']; $query = "select name,start,NOW(),NOW()-start from users where name='$name'"; $rs = @mysql_query($query) or die("非法库操作"); if(mysql_num_rows($rs) == 0) { // 新用户注册 mysql_query("insert into users values ('$name',NOW())"); $_SESSION['name'] = $name; }else { echo "对不起,用户[$name]已登录<br>"; }}if(! $_SESSION['name']) { echo <<< FORM<form action="" method=post><input type=text name=name><input type=submit name=cmd></form>FORM; exit();}?> ## 数据表的结构 `users`#CREATE TABLE users ( name varchar(10) NOT NULL default '', start datetime NOT NULL default '0000-00-00 00:00:00') TYPE=MyISAM; Mistruster(弱智d) 你把你的流程图贴出来呀!单纯用时间机制如果绝对不能根本解决问题!!我现在想到的是结合ip或session机制! 我建议的方法:每次登陆成功后:注册客户端的session,读出_COOKIE["PHPSESSID"]与登陆时间值,记入数据数。每次登陆检测时:检查session是否有效,有效当然是在正常在线的用户,无效则检测客户端送上来的_COOKIE["PHPSESSID"]值(如客户端没有提交,则必为新用户)。上述值与数据库中的对应值比较,检查当前时间值与库中时间值的差,可设如在3分钟内,则判定为旧用户非正常断线重接!上述只是一个非常简单的想法,完整的登陆验证过程我可是编了一个20k的文件代码(不包括说明) 初来此版,多说几句!!! 关于身份验证 1。从外部防止用户名、密码被截。安装ssl,使用传输加密。 2。严格区分get、post与session变量。特别在php中的register_globals = On时。3。预登陆检测,防止用户使用应用程序访问服务器。如果送回的预置值与服务器中存放的值不同,则放弃该登陆操作。 4。登陆ip注册。5。ip锁定检测,如该ip用户名密码错误次数太多,则判定该ip在探测用户名、密码,因定锁定它。6。用户名、密码非法字符检测。7。用户名、密码正确性检测。包括找到的用户资料唯一性检测,在php与mysql搭配中体现中mysql_num_rows()==1检测。8。检测用户上次正确登陆ip与本次登陆ip,根据ip变换的时间配置来放弃或通过此次登陆。此操作可以在用户泄密的情况保证不被非法访问。9。检测该用户是否已经登陆,根据用户的是否唯一登陆的配置来放弃或通过此次登陆。10。工作环境等等等检测11。对不起,我吃饭去了........ 我觉得最简单的就是使用session来判断比较简单一些session里面把用户名写入,当本用户使用一个的时候,写入临时库当再次使用的时候首先检查是否已经存在在临时库中 ,若存在则拒绝登陆 当用户关闭浏览器的时候或者一段时间没有动作可以起用服务器上的进程将这个session删除应该可以吧 经过我的思考,参考了各位大虾的点子,我想出如下解决方案:数据库字段:password,enable,session_id,last_loggin_time,当用户登录时,改变enable的状态为false,同时产生一个唯一的session变量(其IP地址),记录登录时间,并更新到数据库中去.每浏览一个页面都更新一次登录时间,这样非法用户即使知道这一个password,因为enable状态为false,也无法登录,这样就解决了正常使用状态下的问题.如果由于用户非正常退出,在重新登录时可以首先看enable状态,如果为false,则比较session_id(IP地址)是否相等,如果相等则证明是用户不小心关闭浏览器,但网络连接正常,允许登录,如IP不相等则看登录时间之间的差值,例如不允许20分钟内重复登录则设定如果现在的时间和最后一次登录时间如相差小于1200秒,不允许登录,如超过则允许登录!这个方案由于采用session收集客户端IP地址,对客户端来说要求低,而保密性更高,还可保证由于客户端非正常关闭浏览器重新打开登录时不需要间隔太长时间(如20分钟).但同时兼顾到了由于网络中断或其他原因引起的安全要求.另外实现起来也比较容易.请大家看一下这个解决方案如何,还有没有其他的安全性问题?多谢!!! 可以这样啊~用户登陆,进入数据库online表,进入后定时刷新页面,更新用户在线时间~另外设置超时时间~~~另外,同一用户在同一时间只能一次在线,就只要在用户登陆的时候检测他是不是已经在online表中就可以了,如果在,就表示第二 个不能登陆了,告诉他已经在线!一家之言! 我的意见:可以有一个字段记录一个登录的唯一标识,如seesionid,登录时把这个标识记为目前登录用户的标识,做操作时如果发现这个用户的标识与数据库里不一致则关闭连接或做其它处理,好处是不用处理什么超时,和不正常退出, 因为那个标识一定会是最新的一次登录的,以前登录的会给踢掉或关闭连接(看你要怎么处理咯)坏处是, 有新的登录时旧的登会给禁止, 如果用户是还在线上的可能会不知道发生什么事, 这就要求程序给出足够的提示,:P个人意见只做参考. 求php中文分词源码 菜鸟问一个数组问题。 想开发一个超大型的论坛 下载的 MRBS 系统,登录的时候有段代码不解?? 求助求助 php支持其他扩展文件的设置? 放假啦散分,顺便show一下花了20天做出来的论坛半成品。 ★★★★如何换这种日期格式???★★★★★ 我这个上传怎么得不到文件名和类型? 问一个问题 图形处理,乱码问题。 如何将数据库中的TEXT类型的数据按输入数据库时的样式显示出来?
每个页面都重新更新数据库里的 login_time ,
如果发现它与当前时间超过10分钟,则要求其重新登陆(在线用户);
或允许其登陆(未登陆用户)
$result = mysql_query($sql);
$theDateTime= mysql_result($result,0,'login_time');
$hour = intval(substr($theDateTime,11,2));
$minute = intval(substr($theDateTime,14,2));
$second = intval(substr($theDateTime,17,2));
$month = intval(substr($theDateTime,5,2));
$day = intval(substr($theDateTime,8,2));
$year = intval(substr($theDateTime,0,4));
$login_time= mktime($hour, $minute, $second, $month, $day, $year);
$nowTime = date("Y-m-d H:i:s");
$minute = intval(substr($nowTime,14,2));
$second = intval(substr($nowTime,17,2));
$month = intval(substr($nowTime,5,2));
$day = intval(substr($nowTime,8,2));
$year = intval(substr($nowTime,0,4));
$now_time = mktime($hour, $minute, $second, $month, $day, $year);if(($nowTime - login_time)>600)
{
//上次登陆时间到现在大于600秒,允许登陆...
}
如果在同一时间有两个不同的IP则kill掉。呵呵!
个人看法,抛砖引玉。
也就是用ip机制,
不过要注意直接ip与代理ip均要能识别出来!
时间机制不能根本解决问题!
时间机制为什么不能根本解决问题?
test.php
<?php
include "user.php";
?>
hellouser.php
<?php
session_start();$conn = mysql_connect("chizhou");
mysql_select_db("test");
if($_SESSION['name']) { // 修改用户最后刷新时间
mysql_query("update users set satart=NOW() where name='{$_SESSION['name']}'");
}
mysql_query("delete from users where (NOW()-start)>500"); // 5分钟未刷新if($_POST['cmd']) { // 用户登录判断
$name = $_POST['name'];
$query = "select name,start,NOW(),NOW()-start from users where name='$name'";
$rs = @mysql_query($query) or die("非法库操作");
if(mysql_num_rows($rs) == 0) { // 新用户注册
mysql_query("insert into users values ('$name',NOW())");
$_SESSION['name'] = $name;
}else {
echo "对不起,用户[$name]已登录<br>";
}
}
if(! $_SESSION['name']) {
echo <<< FORM
<form action="" method=post>
<input type=text name=name>
<input type=submit name=cmd>
</form>
FORM;
exit();
}
?>
# 数据表的结构 `users`
#CREATE TABLE users (
name varchar(10) NOT NULL default '',
start datetime NOT NULL default '0000-00-00 00:00:00'
) TYPE=MyISAM;
你把你的流程图贴出来呀!
单纯用时间机制如果绝对不能根本解决问题!!
我现在想到的是结合ip或session机制!
每次登陆成功后:
注册客户端的session,读出_COOKIE["PHPSESSID"]与登陆时间值,记入数据数。每次登陆检测时:
检查session是否有效,有效当然是在正常在线的用户,
无效则检测客户端送上来的_COOKIE["PHPSESSID"]值(如客户端没有提交,则必为新用户)。
上述值与数据库中的对应值比较,检查当前时间值与库中时间值的差,
可设如在3分钟内,则判定为旧用户非正常断线重接!上述只是一个非常简单的想法,完整的登陆验证过程我可是编了一个20k的文件代码(不包括说明)
关于身份验证
1。从外部防止用户名、密码被截。安装ssl,使用传输加密。
2。严格区分get、post与session变量。特别在php中的register_globals = On时。
3。预登陆检测,防止用户使用应用程序访问服务器。如果送回的预置值与服务器中存放的值不同,则放弃该登陆操作。
4。登陆ip注册。
5。ip锁定检测,如该ip用户名密码错误次数太多,则判定该ip在探测用户名、密码,因定锁定它。
6。用户名、密码非法字符检测。
7。用户名、密码正确性检测。包括找到的用户资料唯一性检测,在php与mysql搭配中体现中
mysql_num_rows()==1检测。
8。检测用户上次正确登陆ip与本次登陆ip,根据ip变换的时间配置来放弃或通过此次登陆。此操作可以在用户泄密的情况保证不被非法访问。
9。检测该用户是否已经登陆,根据用户的是否唯一登陆的配置来放弃或通过此次登陆。
10。工作环境等等等检测
11。对不起,我吃饭去了..
......
当再次使用的时候首先检查是否已经存在在临时库中 ,
若存在则拒绝登陆 当用户关闭浏览器的时候或者一段时间没有动作可以起用服务器上的进程将这个session删除应该可以吧
用户登陆,进入数据库online表,进入后定时刷新页面,更新用户在线时间~
另外设置超时时间~~~
另外,同一用户在同一时间只能一次在线,就只要在用户登陆的时候检测他是不是已经在online表中就可以了,如果在,就表示第二 个不能登陆了,告诉他已经在线!一家之言!
可以有一个字段记录一个登录的唯一标识,如seesionid,
登录时把这个标识记为目前登录用户的标识,
做操作时如果发现这个用户的标识与数据库里不一致则关闭连接或做其它处理,好处是不用处理什么超时,和不正常退出, 因为那个标识一定会是最新的一次登录的,
以前登录的会给踢掉或关闭连接(看你要怎么处理咯)坏处是, 有新的登录时旧的登会给禁止, 如果用户是还在线上的可能会不知道发生什么事, 这就要求程序给出足够的提示,:P个人意见只做参考.