이 글에서는 특정 참고 가치가 있는 PHP 사용자 로그인 인증 모듈을 소개합니다. 이제 모든 사람과 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다.
로그인 폼의 HTML 코드는 다음과 같습니다.
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>User Login</title> <style type="text/css"> <!— .alert {color: red} .textinput {width:160px} .btn {width:80px} table {border: 3px double;background-color:#eeeeee;} --> </style> </head> <body> <form name="frmLogin" method="post" action="login.php" onSubmit="return doCheck();"> <table border="0" cellpadding="8" width="350" align="center"> <tr><td colspan="2" align="center" class="alert"></td></tr> 用户名: <td><input name="username" type="text" id="username" class="textinput" /></td> </tr> <tr><td>密码:</td> <td><input name="pwd" type="password" id="password" class="textinput" /></td> </tr> <tr><td colspan="2" align="center"> <input type="submit" class="btn" value="登录"> <input type="reset" class="btn" value="重置"> </td> </tr> </form> </body> </html>
위 코드를 login.php 파일로 저장하고 브라우저에서 실행해 보세요.
사용자가 로그인 양식에 로그인 정보를 입력한 후 처리를 위해 데이터가 이 페이지 login.php로 다시 제출됩니다. login.php의 헤더 사용자 이름과 비밀번호가 올바른지 여부를 나타내는 코드입니다. login.php 코드 변경 사항은 다음과 같습니다.
<br/>
<?php require_once('common.php'); // 引入公共文件,其中实现了SQL注入漏洞检查的代码 $username = trim($_POST['username']); // 取得客户端提交的密码并用md5()函数时行加密转换以便后面的验证 $pwd = md5($_POST['pwd']); // 设置一个错误消息变量,以便判断是否有错误发生 // 以及在客户端显示错误消息。 其初值为空 $errmsg = ''; if (!empty($username)) { // 用户填写了数据才执行数据库操作 //--------------------------------------------------------- // 数据验证, empty()函数判断变量内容是否为空 if (empty($username)) { $errmsg = '数据输入不完整'; } //--------------------------------------------------------- if(empty($errmsg)) { // $errmsg为空说明前面的验证通过 // 调用mysqli的构造函数建立连接,同时选择使用数据库'test' $db = @new mysqli("127.0.0.1", "developer", "123456", "test"); // 检查数据库连接 if (mysqli_connect_errno()) { $errmsg = "数据库连接失败! \n"; } else { // 查询数据库,看用户名及密码是否正确 $sql = "SELECT * FROM t_user WHERE f_username='$username' AND f_password='$pwd'"; $rs = $db->query($sql); // $rs->num_rows判断上面的执行结果是否含有记录,有记录说明登录成功 if ($rs && $rs->num_rows > 0) { // 在实际应用中可以使用前面提到的重定向功能转到主页 $errmsg = "登录成功!"; } else { $errmsg = "用户名或密码不正确,登录失败!"; } // 关闭数据库连接 $db->close(); } } } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>User Login</title> <style type="text/css"> <!-- .alert {color: red} .textinput {width:160px} .btn {width:80px} table {border: 3px double;background-color:#eeeeee;} --> </style> </head> <body> <form name="frmLogin" method="post" action="login.php" onSubmit="return doCheck();"> <table border="0" cellpadding="8" width="350" align="center"> <tr><td colspan="2" align="center" class="alert"><?echo $errmsg;?></td></tr> 用户名: <td><input name="username" type="text" id="username" class="textinput" value="<?echo $username;?>" /></td> </tr> <tr><td>密码:</td> <td><input name="pwd" type="password" id="password" class="textinput" /></td> </tr> <tr><td colspan="2" align="center"> <input type="submit" class="btn" value="登录"> <input type="reset" class="btn" value="重置"> </td> </tr> </form> </body> </html>
굵게 표시된 부분은 새로 추가된 코드이며, 대부분의 구문에 대해 자세히 주석을 달았습니다. HTML 형식에 추가된 코드는 주목할 만합니다. 서버측 처리 중에 발생할 수 있는 오류나 프롬프트를 출력하기 위해 첫 번째 행의 셀에 PHP 코드가 추가됩니다. 또한 사용자 이름 입력에 값 속성이 표시됩니다. 상자. 마지막으로 제출한 사용자 이름을 출력하는 PHP 코드를 추가하여 잘못된 비밀번호를 입력하여 로그인할 수 없는 사용자는 다시 시도할 때 비밀번호만 입력하면 됩니다.
login.php를 다시 실행하고 양식에 데이터를 입력하여 로그인을 시도합니다.
사용자 정보 테이블 t_user에서 f_logintimes 필드는 사용자의 로그인 시간을 기록하는 데 사용되고, f_lasttime 필드는 사용자의 마지막 로그인 시간을 기록하는 데 사용되며, f_login 필드는 사용자를 기록하는 데 사용됩니다. 마지막 로그인에 사용된 IP는 주로 사용자 로그인 횟수 및 사용자의 지리적 분포를 계산하는 편의를 제공하기 위해 이 정보를 데이터베이스에 기록합니다. 이러한 데이터는 사용자가 로그인할 때마다 업데이트되어야 합니다. 다음으로 이러한 데이터를 업데이트하는 코드를 추가합니다.
login.php 파일을 열고 헤더의 PHP 코드를 다음과 같이 변경합니다.
<?php ...... if ($rs && $rs->num_rows > 0) { // 在实际应用中可以使用前面提到的重定向功能转到主页 第4 / 6页 $errmsg = "登录成功!"; // 更新用户登录信息 $ip = $_SERVER['REMOTE_ADDR']; // 获取客户端的IP $sql = "UPDATE t_user SET f_logintimes = f_logintimes + 1,"; $sql .= "f_lasttime=now(), f_loginip='$ip' "; $sql .= " WHERE f_username='$username'"; $db->query($sql); } else { $errmsg = "用户名或密码不正确,登录失败!"; } ...... ?>
위의 굵은 부분은 새로 추가된 코드이며, 클라이언트의 IP 주소는 자동 전역 변수에서 먼저 가져옵니다. $_SERVER, SQL 문을 구성하고 해당 문을 실행하여 사용자 로그인 정보를 업데이트합니다. 이 SQL 문에서 f_lasttime 할당은 MySQL의 내부 함수 now()를 호출하여 수행된다는 점은 주목할 가치가 있습니다. MySQL의 now() 함수는 서버의 현재 시간을 반환합니다.
HTTP 프로토콜은 상태 비저장입니다. 그것이 하는 일은 단순히 서버에 요청을 보내고 서버에서 데이터를 얻는 것뿐입니다. 다른 것은 아무것도 모릅니다. 동일한 PHP 파일이 두 번 요청되더라도 두 요청 사이에 연결이 있다고 생각하지 않습니다.
HTTP 프로토콜의 상태 비저장 특성으로 인해 "현재 방문자" 정보 기록과 같은 서로 다른 두 요청 간에 정보를 공유하는 것은 불가능합니다. 로그인 과정에서 사용자의 사용자 이름과 비밀번호가 올바른지 확인되었음에도 불구하고 사용자가 다른 페이지로 이동할 때 로그인 페이지에서 얻은 모든 사용자 정보가 손실되는 것은 사용자가 원하지 않는 일입니다. 동시에, 사용자가 각 페이지에 들어갈 때 확인을 위해 사용자 이름과 비밀번호를 입력하도록 요구하는 것은 비현실적이며, 이로 인해 서로 다른 페이지 간에 정보가 공유될 수 있습니다.
일반적으로 PHP 및 기타 웹 프로그래밍 언어의 경우 쿠키나 세션을 사용하여 이 문제를 해결할 수 있습니다.
쿠키는 클라이언트에 저장되는 작은 파일입니다. 페이지 간에 공유해야 하는 일부 정보가 이 파일에 저장될 수 있습니다. 그러나 쿠키에는 세 가지 단점이 있습니다. 첫째, 크기는 4KB를 초과할 수 없습니다(브라우저마다 제한 사항이 다를 수 있음). 둘째, 사용자는 브라우저 설정에서 쿠키를 비활성화할 수 있습니다. 셋째, 쿠키는 클라이언트에 데이터를 기록하므로 보안이 취약합니다. 세션은 일반적으로 쿠키를 통해 구현됩니다. 사용자가 쿠키를 비활성화하면 세션도 무효화됩니다. 쿠키와 달리 세션은 쿠키를 통해 클라이언트에 정보를 식별할 뿐 실제 정보는 서버에 저장되므로 보안 성능이 크게 향상됩니다. 이제 쿠키 없이 Session을 사용할 수 있는 또 다른 방법, 즉 URL 재작성 기술이 있습니다. 이 방법은 서비스와 상호 작용하기 위해 세션 식별자를 URL의 매개 변수로 사용합니다. 장점은 클라이언트의 쿠키 비활성화로 인해 제한되지 않는다는 점이지만, 사용하기가 더 번거롭다는 단점이 있습니다.
PHP에서 세션을 사용하는 것은 매우 간단합니다. PHP는 세션 처리를 위해 자동 전역 변수 $_SESSION을 제공합니다. 단, PHP 구성 파일에 Session을 자동으로 시작하는 설정이 없으면 Session을 사용하기 전에 session_start() 함수를 호출하여 Session을 시작해야 한다는 점에 유의해야 한다.
login.php를 다시 열고 다음 코드를 굵게 추가하여 사용자 정보를 기록합니다.
<?php ...... if ($rs && $rs->num_rows > 0) { // 使用session保存当前用户 session_start(); $_SESSION['uid'] = $username; // 在实际应用中可以使用前面提到的重定向功能转到主页 $errmsg = "登录成功!"; // 更新用户登录信息 $ip = $_SERVER['REMOTE_ADDR']; // 获取客户端的IP $sql = "UPDATE t_user SET f_logintimes = f_logintimes + 1,"; $sql .= "f_lasttime=now(), f_loginip='$ip' "; $sql .= " WHERE f_username='$username'"; $db->query($sql); } ...... ?>
세션을 남용하지 마세요. 세션의 가장 큰 역할은 페이지 간 상태를 유지하는 것입니다. 많은 초보자들이 Session 기술을 익힌 후에는 Session을 데이터 저장의 마법 무기로 사용하고 많은 데이터를 Session에 배치하기가 쉽습니다. 이 데이터는 Session이 만료될 때까지 공개되지 않으므로 서버에 많은 부담을 주게 됩니다.
이전 섹션에서 사용자 이름을 Session에 저장하는 작업을 완료했기 때문에 사용자의 로그인 여부를 확인하는 것은 매우 간단합니다. 코드는 다음과 같습니다.
<?php session_start(); if (empty($_SESSION['uid'])) { echo "您还没有登录,不能访问当前页面!"; exit; } ?>
通过判断自动全局变$_SESSION中的uid是否为空,就可以判断用户是否已经登录。如果用户没有登录,就提示其无法访问当前页面,并终止程序的运行(或者使用一条重定向语句将页面导向登录页)。
相关推荐:
위 내용은 PHP 사용자 로그인 확인 모듈의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!