网站防止非法用户登录的session方式实现

网站都有一个防止非法用户直接登录的session方式被十分普遍地采用,并且可以将用户的登录信息保存一段时间,session方式是一种比较方便安全的登录检查方式,由于session是存放在服务器端的,所以就基本不用担心登录信息被本地用户获得,当然类似于密码之类的比较重要的信息千万不要用session保存,比较session数据其实也和cookie一样,只不过它是放在服务器端的而已。关于session有必要多讲一下,这个东西有点类似于cookie,但又有点不同,不同之处在于session是在服务器端实现,不受客户端浏览器影响,当然关闭cookie也会导致session的功能失常,但这是可以通过URL重写来克服的,即在URL末尾写入session的cookie默认表示符,php是PHPSESSID,链接写成如下形式:
   http;//localhost/session.php?PHPSESSID=diysessionname
然后session_start()启动session,就会自动根据这个传过来的值作为session文件名,自己设置的话就要用到

session_id()函数,这个函数是专门用来设定session文件保存方式的文件名,不过针对大型网站,往往有多台服务器,针对同一台客户机浏览器session是不同的,这时就会用到多服务器共享session方式,这种方式就要比文件保存session方式更高级一点,采用数据库保存,需要自己重写session的处理方式。适合有一定的php基础的人用。

我写了一个用于验证用户是否登录的函数,当用户没有登录直接打开某个页面时就会直接显示未登录状态,而从登录页面跳转到新页面,在新页面就会登录状态,采用session保存登录状态,直到浏览器关闭。闲话不多说了,先来看一下我的验证用户登录状态的函数文件,主要是根据用户提交的数据和页面来判断用户是不是直接点击到管理页面还没有经过登录页面,涉及数据库的操作全部封装在SQLHelp.class.php文件中了,这里用到是检测用户名是否存在和密码是否正确这两个事项。代码如下:

<?php 
	require_once 'SQLHelper.class.php';
	function checkValidat($user,$pwd,$idValue=3){
		if(isset($_GET['id'])){
			$idValue=$_GET['id'];
			if($idValue==1){
				session_destroy();
				header("location:session.php");
			}
		}
		session_start();
		if(!empty($_SESSION['loginuser'])){
			$tempName=$_SESSION['loginuser'];
			if(time()-$tempName[1]>3600){
				unset($_SESSION['loginuser']);//与上次登录时间间隔太久便删除掉记录。
			}
			$sql= new SQLHelper();
			$nicky=$sql->getNicky($tempName[0]);
			if($idValue!=2){//跳过登录页面直接查看的处理
				if($sql->checkUser($tempName[0])){
					echo "登录用户昵称:".$nicky."上次登录时间:".date("H-i-s",$tempName[1]).
					"<a href='session.php?clr=1'>安全退出</a>";
				}
				else {
					echo "未登录!<a href='session.php'>返回登录</a>";
					return false;
				}		
			}
			elseif($idValue==2){
				if($sql->checkUser($user)==0){
					header("location:session.php?error=the user is not exist!");
				}
				$tempPwd=$sql->getPassword($user);
				if($tempPwd!=md5($pwd)){
					header("location:session.php?error=the password is error");
				}
				
				echo "登录用户昵称:".$nicky."上次登录时间:".date("H-i-s",$tempName[1]).
				"<a href='session.php?clr=1'>安全退出</a>";
				//保存用户登录信息
				$loginInfor=array($user,time());
				$_SESSION['loginuser'] = $loginInfor;
				return true;
			}	
		}
		else{
			if($idValue==2){
				$sql= new SQLHelper();
				if($sql->checkUser($user)==0){
					header("location:session.php?error=the user is not exist");
				}
				$tempPwd=$sql->getPassword($user);
				if($tempPwd!=md5($pwd)){
					header("location:session.php?error=the password is error");
				}
				$nicky=$sql->getNicky($user);
				echo "用户昵称:".$nicky.
				"<a href='mao.php?id=1'>安全退出</a>";
				//保存用户登录信息
				$loginInfor=array($user,time());
				$_SESSION['loginuser'] = $loginInfor;
				return true;
			}
			echo "未登录!<a href='session.php'>返回登录</a>";
			return false;		
		}
		
	}
	
?>
以上就是session方式的登录状态检测了!把上面这个文件用require_once 引入任何文件然后在指定地方调用这个函数,就会在指定地方显示登录状态信息了。当然还要写一部分注册页面,要不然怎么登录,当然也可以事先在数据库里面建立好相关的登录信息表,我的就是事先建立了一个表:含有用户名、昵称和密码三个字段,注意密码采用MD5加密后保存,由于MD5产生的字符串长度很长,务必用int类型设定密码字段,我的用varchar(20),结果打入六个字符就无法输入了,真是悲惨。

以下是登录界面代码:

<!Doctype html><html xmlns=http://www.w3.org/1999/xhtml>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
<meta http-equiv=X-UA-Compatible content=IE=EmulateIE7>
<title>www.like.com </title>
<style type="text/css">
<!--
body{
	font-size:20px;
	margin:auto;
	width:400px;
}
form{
	margin:25px 0px;
	border:solid green 3px;
	padding:10px;
	background:gray;
	overflow:hidden;
}
span{float:left;
	display:block-inline;width:90px;padding:5px 0 1px 80px; 
}
-->
</style>
</head>
<body>
<?php //登录页面	
	if(!empty($_COOKIE['user'])) $str = $_COOKIE['user'];
	else $str = "";
	if(isset($_GET['error']))
		echo $_GET['error'];
	if(isset($_GET['clr'])){
		session_start();
		session_destroy();
	}
?>
<form action="mao.php?id=2" method="post">
用户名: <input name="user" type="text" size=30 <?php echo "value='$str'"; ?> /><br /><br />
密码:   <input name="pwd" type="text" size=30 /><br />
是否要保存用户名:<input name="check" type="checkbox" /><br/>
<span><input type="submit" value="登录" /></span><span><input type="reset"/></span>
</form><br /><br/>
<p><?php 
	if(isset($_GET['id']))
		echo $_GET['id'];
?></p>
<form action="regester.php" method="post">
用户名: <input name="user" type="text" size=30 /><br />
<br/>
昵称:   <input type="text" name="nicky" /><br/>
密码:   <input name="pwd" type="text" size=30 /><br />
<span><input type="submit" value="注册" /></span><span><input type="reset"/></span>
</form>
<p>
<?php 
	if(isset($_GET['delete'])){
		if(isset($_POST['deleteUser'])){
			$viewer=$_POST['deleteUser'];
			$viewer=trim($viewer);
		}
		else {
			$viewer="";
		}
		require_once 'SQLHelper.class.php';
		$sql = new SQLHelper();
		$sql -> deleteUser($viewer);
	}
?>
</p>
<form action="session.php?delete=1" method="post">
用户名: <input type="text" name="deleteUser" size=30 /><br/>
<span><input type="submit" value="删除用户" /></span><span><input type="reset"/></span>
</form>

就这么多了,花了三天时间,主要的难点有以下几个,一、各种对数据库的操作。二、对用户登录的用户名、密码是如何检测,事先要进行那些检查,例如空字符串等等。三、用户直接在地址栏输入某个页面,如何判断这种情况,并决定是否让其跳转到登录页面,比如注册成功页面就必须跳转到注册页面,要不然就乱套了。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值