이 글에서는 세션 제어를 통한 PHP 인증의 예를 소개합니다. 신원 인증은 세션을 통해 데이터를 제출하는 것입니다. 도움이 필요한 친구들이 와서 알아볼 수 있습니다.
세션 제어의 개념은 웹사이트의 세션을 기반으로 사용자를 추적할 수 있다는 것입니다. 자세한 코드는 여기에 정리되어 있어 도움이 필요한 친구들이 참조할 수 있습니다.
개요
http 프로토콜은 상태 비저장이며 각 요청에 대해 서버는 사용자를 구별할 수 없습니다. PHP 세션 제어는 사용자의 신원을 증명하는 키(암호화된 세션 문자열)를 제공합니다. 서버는 이 키로 열 수 있는 상자(데이터베이스, 메모리 데이터베이스 또는 파일)를 저장합니다. 사용자의 다양한 변수정보.
기존 PHP 세션 사용
<?php //page1.php 启动一个会话并注册一个变量 session_start(); $_SESSION['user_var'] = "hello,codekissyoung!"; //这里的可以将$_SESSION理解为用户的箱子,实际的实现是php在服务器端生成的小文件 ?>
<?php //page2.php session_start(); echo $_SESSION['user_var'];//通过钥匙访问自己的箱子内的变量 $_SESSION['user_var'] = "bey,codekissyoung!"; ?>
<?php //page3.php 销毁钥匙,一般在用户注销时,访问page3.php文件 session_start(); session_destroy(); ?>
질문입니다. 열쇠는 어디에 있나요? 사용자에게 키를 주는 동작을 못 보셨나요?
이 작업은 뒤에서 PHP에 의해 수행됩니다. page1.php를 방문하고 프로그램이 실행되면 session_start();, PHP는 현재 일부 조건(사용자 IP, 브라우저 번호, 시간)에 따라 이를 생성합니다. 등) PHPSESSID 변수입니다. http 응답이 클라이언트에 반환된 후 이 PHPSESSID는 이미 브라우저 쿠키에 저장되어 있습니다. 이 도메인 이름을 다시 방문할 때마다 PHPSESSID가 서버로 전송됩니다. 이 PHPSESSID는 제가 여기서 말하는 사용자 키입니다.
또 다른 질문, 이 PHPSESSID의 보안은 도난 당하기 쉬운가요, 위조가 쉬운가요, 변조가 쉬운가요?
HTTPS를 사용하면 변조를 방지할 수 있습니다. PHPSESSID를 사용하지 말고, 위조 방지를 위해 사용자용 비밀키를 생성하세요. 도난당하기 쉬운지에 대해서는 실제로 연구된 바가 없습니다. 예를 들어, 컴퓨터가 인터넷에 연결되어 있고 해커가 컴퓨터에 침입하는 경우입니다.
생성된 비밀 키를 브라우저 쿠키에 저장
쿠키 설정
setCookie('key','value',time()+3600);
쿠키 삭제
setCookie('key','',time()-1);
싱글 사인온 실현: 세션 공유
싱글 사인온: 여러 하위 시스템이 하나의 로그인으로 액세스를 제공하는 사용자 인증 시스템을 공유합니다. 모든 하위 시스템에.
이 시나리오를 상상해 보세요. 서버 A와 B의 PHP 환경이 동일하다고 가정합니다. 사용자는 서버 A에서 키를 얻은 다음 서버 B에 액세스하기 위해 키를 가져갔습니다. 그는 서버 B를 알고 있습니까?
분명히 그렇지 않습니다. 서버는 A 서버에서 생성된 키를 인식하지 못합니다.
해결 방법: 사용자가 A 또는 B를 방문하든 생성된 키는 C(동일한 데이터베이스 또는 캐싱 시스템)에 저장됩니다. 사용자가 A 또는 B를 다시 방문하면 A와 B 모두 C에게 질문합니다. :이 사용자의 키가 맞습니까? 맞다면 사용자는 A나 B에 보관된 상자를 사용할 수 있습니다.
<?php session_regenerate_id();//重置 session 字符 $session_info=array('uid'=>$uid,'session'=>session_encrypt(session_id().time())); //下一步将,$session_info 存到 C 中 ?>
다음은 세션 제어를 통해 인증을 구현하는 PHP의 예입니다.
인증 적용 주체: authmain.PHP
<?php //开启一个会话 session_start(); if((!isset($userid))||(!isset($password))) { $userid=$_POST['userid']; $password=$_POST['password']; //连接数据库 $db_conn=new mysqli("localhost", "root", "","auth"); if(mysqli_connect_errno()){ echo '连接数据库失败:'.mysqli_connect_error(); exit(); } //执行SQL查询语句 $query="SELECT * FROM authorized_users WHERE name='".$userid."' and password=sha1('".$password."')"; $result=$db_conn->query($query); if($result->num_rows>0){ //注册一个会话变量 $_SESSION['valid_user']=$userid; } //断开数据库连接 $db_conn->close(); } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>身份验证</title> </head> <body> <h1>主页</h1> <?php //判断用户是否已经登录 if(isset($_SESSION['valid_user'])){ echo $_SESSION['valid_user'].',您好,你已经登录'; echo '<a href="logout.php">退出登录</a><br/>'; }else{ if(isset($userid)){ echo '您没有登录成功'; }else{ echo '您还没有登录<br/>'; } ?> <form method="post" action="authmain.php"> <p>用户名:<input type="text" name="userid"></p> <p>密码:<input type="password" name="password"></p> <p><input type="submit" name="submit" value="登录"></p> </form> <?php } ?> <br/> <a href="members_only.php">登录进入</a> </body> </html>
웹사이트의 유효한 사용자 확인:members_only.php
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>身份验证</title> </head> <body> <?php //启用会话 session_start(); echo '<h1>会员有效</h1>'; if(isset($_SESSION['valid_user'])){ echo "<p>".$_SESSION['valid_user'].",您好,您已经登录成功</p>"; echo '<p>会员可享受折扣优惠</p>'; }else{ echo '<p>您还没有登录成功</p>'; echo '<p>只有登录成功才能查看此页</p>'; } echo '<a href="authmain.php">返回主页</a>'; ?> </body> </html>
세션 변수를 로그아웃하고 세션을 삭제합니다. .php
<?php //启用会话 session_start(); $olduser=$_SESSION['valid_user']; //注销会话变量 unset($_SESSION['valid_user']); //销毁会话 session_destroy(); ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>退出登录</title> </head> <body> <h1>您退出登录了!</h1> <?php if(!empty($olduser)){ echo '退出登录了<br/>'; }else{ echo '您没有登录过,所以当然也不存在退出登录<br/>'; } ?> <a href="authmain.php">返回主页</a> </body> </html>
위 내용은 세션 제어를 통해 인증을 구현하는 PHP의 예제 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!