雲端教學課程
PHP Login
先下載上次最後的檔案同步一下 :
網路上很多範例都有漏洞
php登入範例login.php
PHP Login Page Example.
記得外部進來的資料都要先處理過。
入侵示範 :
帳號admin, 密碼 ' or ''=',藍色部份是從外部進來的資料。
原理 : select * from `member`
where `username`='admin' and `password`='' or '' = ''
先來個簡單的範例
PHP部份
<?php session_start(); //開始SESSION $user_name = 'kai'; //預設帳號 $user_password = sha1('123456'); //預設密碼 $message = ''; //訊息 if(isset($_POST['user_name']) && isset($_POST['user_password'])){ //判斷帳密是否正確 if($_POST['user_name'] == $user_name && sha1($_POST['user_password']) == $user_password ){ $_SESSION['user_name']=$user_name; $message = '登入成功!'; }else{ $message = '帳密有誤!'; }}elseif(isset($_GET['action'])){unset($_SESSION['user_name']); } ?>
先來個簡單的範例
HTML部份
<p><?php echo $message;?></p> <?php if( isset($_SESSION['user_name']) ){ ?> <p>你已經登入了!</p> <p><a href="?action=logout">我要登出</a></p> <?php }elseif( isset($_GET['action']) ){?> <p>登出成功</p> <p><a href="index.php">回到登入頁面</a></p><?php }else{?> <!--登入表單--><form action="index.php" method="post"> <label for="user_name">帳號</label> <input type="text" id="user_name" name="user_name" /> <label for="user_password">密碼</label> <input type="password" id="user_password" name="user_password" /> <input type="submit" value="登入" /> <input type="reset" /> </form><?php }?>
畫面、流程先規劃再想程式

規劃出來的 View
- 會員登入 ( member_login.php )
- 會員登出 ( member_logout.php )
- 會員註冊 ( member_register.php )
- ...
會員登入
view\member_login.php
<form action="" method="post">
<label for="user_name">帳號</label>
<input type="text" id="user_name" name="user_name" />
<label for="user_password">密碼</label>
<input type="password" id="user_password" name="user_password" />
<input type="submit" value="登入" />
<input type="reset" />
</form>會員登出
view\member_logout.php
<p>登出成功!</p>
<p><a href="?action=list">回留言版</a></p>
<p><a href="?action=list">重新登入</a></p>
會員註冊
view\member_register.php
<form action="" method="post">
<label for="user_name">帳號</label>
<input type="text" id="user_name" name="user_name" />
<label for="user_password">密碼</label>
<input type="password" id="user_password" name="user_password" />
<label for="user_password2">確認密碼</label>
<input type="password" id="user_password2" name="user_password2" />
<input type="submit" value="註冊" />
<input type="reset" />
</form>開始寫會員model
model\member.php
建立member物件。
<?php
class member{
function __construct( PDO $db){
$this->db = $db;
}
}
<?php
session_start();
登入
model\member.php
<?php class member{ ... function login( $member ,$password){ $db = $this->db; $stmt = $db->prepare("SELECT * FROM `member` WHERE " . "`member` = :member " . "AND `password` = :password"); $stmt->execute(array( ':member' => $member, ':password' => sha1($password) ));if( $stmt->rowCount() == 1 ){//是否有符合的資料 $user = $stmt->fetchAll(PDO::FETCH_ASSOC); $_SESSION['user'] = $user[0];//把會員資料寫進SESSION裡 return true;//登入成功 }else{ return false;//登入失敗 } } }
登出
model\member.php
<?php
class member{
...
function logout(){
session_destroy();
return true;
}
}
註冊
model\member.php
<?php class member{ ... function register( $member ,$password){ $db = $this->db; $stmt = $db->prepare("INSERT INTO `member`" . "(`member`,`password`,`create_date`)" . "VALUES ( :member , :password , NOW() )"); $stmt->execute(array( ':member' => $member, ':password' => sha1($password) ));if( $stmt->rowCount() == 1 ){//是否有符合的資料 return true;//註冊成功 }else{ return false;//註冊失敗 } } }
修改 '主要' Controller
index.php?model=模組名稱&action=模組內頁
- 建立一個controller資料夾。
- 在裡面建一個空白PHP檔名叫message.php。
- 把屬於message的controller移進去。
- 修改index.php再測試 ?model=message&action=list
<?php
require 'config.php';
$model = array(
'message',
'member'
);
if( in_array( $_GET['model'] , $model) ){
require 'model/' . $_GET['model'] . '.php' ;
require 'controller/' . $_GET['model'] . '.php' ;
}
開始寫controller
controller\member.php
index.php?model=member&action=error_page
沒帶action參數或是參數錯誤直接顯示錯誤頁面
<?php
if( isset( $_GET['action'] ) ){
$member = new member($db);
switch($_GET['action']){
default :
require 'view/error.php';
}
}else{
require 'view/error.php';
} controller - 會員登入
- index.php?model=member&action=login - 登入畫面
- index.php?model=member&action=login_post - 處理登入
case 'login': require 'view/member_login.php'; break;case 'login_post': if( isset($_POST['user_name']) && isset($_POST['user_password']) ){if( $member->login($_POST['user_name'] , $_POST['user_password']) ){ header("Location: ?model=message&action=list"); }else{ header("Location: ?model=member&action=login&error=1"); } } else{ header("Location: ?model=member&action=login&error=2"); } break;
controller - 會員登出
index.php?model=member&action=logout
使用$member的登出方法後,把登出成功畫面引入。
case 'logout' :
$member->logout();
require 'view/member_logout.php';
break; controller - 會員註冊
-
index.php?model=member&action=register - 註冊畫面
-
index.php?model=member&action=register_post - 處理
case 'register' : require 'view/member_register.php'; break; case 'register_post' : if( isset($_POST['user_name']) && isset($_POST['user_password']) && isset($_POST['user_password2']) ){ if( $_POST['user_password'] != $_POST['user_password2']){ header("Location: ?model=member&action=register&error=1");}elseif( $member->register($_POST['user_name'] , $_POST['user_password']) ){ header("Location: ?model=message&action=list"); }else{ header("Location: ?model=member&action=register&error=2"); } } else{ header("Location: ?model=member&action=register&error=3"); } break;
修改view,讓流程串起來
view\member_login.php
<!--加入註冊連結--> <p><a href="?model=member&action=register">註冊</a></p><!--指定POST到member的login_post位置--> <form action="?model=member&action=login_post" method="post">
<p>登出成功!</p>
<p><a href="?model=message&action=list">回留言版</a></p>
<p><a href="?model=member&action=login">回登入頁</a></p><form action="?model=member&action=register_post" method="post">修改留言版的view
view/message_list.php
<?php if(isset($_SESSION['user'])){?>
<p>歡迎<?php echo $_SESSION['user']['member'];?>登入!<a href="?model=member&action=login">[登出]</a></p>
<?php }else{?>
<p><a href="?model=member&action=login">[登入]</a></p>
<?php }?>
回家作業
- 把會員登入跟留言版串起來,有登入才能留言。
- 每個會員獨立的留言版 ( URL再帶一個參數)。
- 會員個人檔案畫面。
- 研究無名小站的發文、貼相片流程。
- 試著寫發文、回應、相簿。
發文、回應、相簿寫完後會開始CSS切版、CSS教學。
php-login
By jackai
php-login
- 3,555