2014年9月21日 星期日

PHP 登入概念實作

雜事很多,莫名其妙就要用到某一個語言, 由於有人問,於是要用PHP快速建立一個登入的網站
首先,我們的登入網站需要Session判斷是否有登入,如果沒有就跳轉到login.php,

index.php 首頁寫法:
判斷Session, Cookie是否有登入,或是錯誤登入,如果沒有登入,就跳轉到login.php,如果是登入狀態就顯示內容

login.php 登入寫法:
放置form表單,並且action傳送到connect.php做登入判斷
判斷GET方法 名稱error 是0就顯示 "帳號密碼錯誤", 是1就顯示: 連線錯誤,資料庫未開!


connet.php 登入處理寫法:
接收login.php傳來的post方法,username, password一定都要有值,然後才可以連接Mysql資料庫,搜尋是否有username存在,如果存在,就搜尋該username的password(先加密MD5) 存不存在, 如果都存在,就建立session代表登入,

register.php 註冊處理寫法:
放置form表單,並且action傳送到 connect_join.php檔案
*在此不驗證危險字元

connect_join.php檔案:
接收register傳來的post方法,如果username, password都有值,就做新增的動作, 然後移動到login.php

logout.php檔案:
登出session後跳轉login.php

程式碼寫法:

login.php寫法:

<!DOCTYPE html>
<html>
<head>
 <title>Login</title>
</head>
<body style="font-family: '微軟正黑體'">
 <?php if(isset($_GET["error"])){
  if($_GET["error"] == 0) echo "<h2 style='color:red'>帳號或密碼錯誤</h2>";
  if($_GET["error"] == 1) echo "<h2 style='color:purple'>登入失敗,#資料庫</h2>";
                if($_GET["error"] == 2) echo "<h2 style='color:blue'>登入失敗,#不能為空</h2>";
 }?>
 <form action="connect.php" method="post">
  帳號<input type="text" name="username"/><br/>
  密碼<input type="password" name="password"/>
  <br /><input type="submit" value="登入" style="font-family: '微軟正黑體'">
 </form>
</body>
</html>

connect.php寫法:
*首先在SQL中新增一個 test_now 的資料庫, 然後新增一個users的資料表(欄位數:2), 然後第一個欄位使用username當作名稱,第二個使用password當作名稱。

,username資料型態使用varchar 長度 32 相當於 varchar(32)
,password資料型態使用varchar 長度 64 相當於 varchar(64)


然後我們再新增那個欄位新增一個使用者,唯password這個欄位要使用函數的下拉選單,選擇MD5, 然後兩個欄位自訂填上, 在此填入 帳號admin, 密碼root
,然後您會看到他剛剛寫出一個sql的語法,顯然我們在之後會很輕鬆新增資料!

程式碼:
<?php if($_POST["username"] == null || $_POST["password"] == null) header("Location: login.php?error=2"); ?>
<?php session_start(); ?>
<meta charset="utf-8">
<?php
 $link = mysql_connect('localhost','admin','root'); //建立連線
 if(!$link)
  die("抱歉伺服器已掛, 自己的網站自己救");//掛掉
    else
     echo "Connect finish, now loading...";

    mysql_set_charset('utf8',$link);//編碼設定

   if([email protected]_select_db('test_now')) header("Location: login.php?error=1"); // '@' 不顯示錯誤, 選擇不了db

   $usernames = $_POST["username"];
   $userpassword = md5($_POST["password"]);//加密使用者的密碼

   $sql = "select * from users where username = '$usernames'";
   $result = mysql_query($sql);
   $row = @mysql_fetch_row($result);
   

   if($usernames != null && $userpassword != null && $row[0]==$usernames && $row[1] == $userpassword){ //查詢結果拿來判斷
     $_SESSION["username"] = $usernames; //建立登入的session
     mysql_free_result($result);
     mysql_close($link);
     echo '<meta http-equiv=REFRESH CONTENT=1;url=index.php>';
   }else{
    mysql_free_result($result);
    mysql_close($link);
    header("Location: login.php?error=0");
   } 
?>

index.php寫法:
<?php session_start(); ?>
<!DOCTYPE html>
<html>
<head>
 <title>index</title>
</head>
<body>
 <?php if(isset($_SESSION["username"]) != null){//檢查Session是否登入 ?>
  <p>恭喜你登入了, <a href="logout.php">登出</a></p>
 <?php }else{ header("Location: login.php"); } //跳轉登入 ?>
</body>
</html>

logout.php寫法:
<?php session_start(); unset($_SESSION["username"]); header("Location: login.php");?>

register.php寫法:
<!DOCTYPE html>
<html>
<head>
 <title>Register</title>
</head>
<body style="font-family:'微軟正黑體'">
 <?php if(isset($_GET['error'])){
    if($_GET['error'] == 0) echo "<h2 style='color:red'>帳號密碼不能為空!</h2>";
    if($_GET['error'] == 1) echo "<h2 style='color:red'>伺服器掛掉!</h2>";
  }?>
 <form action="connect_join.php" method="post">
  註冊帳號: <input type="text" name="username" /><br>
  註冊密碼: <input type="password" name="password" /><br>
  <input type="submit" value="註冊" style="font-family:'微軟正黑體'"/>
 </form>
</body>
</html>

connect_join.php寫法:
<?php
 if(isset($_POST['username'])==null || isset($_POST['password']) == null){//判斷帳號密碼是否為空
  header("Location: register.php?error=0");
 }else{
  $link = mysql_connect('localhost','admin','root');//建立連線
  if(!$link){
   die("伺服器已掛,自己的伺服器自己救!");
  }else{
   echo "Connect finish, now loading...";
  }

  mysql_set_charset('utf8',$link);//編碼設定

  if([email protected]_select_db('test_now')) header("Location: register.php?error=1"); // '@' 不顯示錯誤, 選擇不了db

  $un = $_POST['username']; //設定帳號
  $up = $_POST['password']; //設定密碼
  
  $result = mysql_query("INSERT INTO users(username,password) VALUES('$un',MD5('$up'));",$link);//插入查詢資料:新增
     if(!$result){
      die("伺服器已掛,自己的伺服器自己救 #2");
      exit;
     }
     mysql_close($link);
     header("Location: login.php");
 }
?>
Register這個區塊,在 mysql_query上,查詢語法已經在先前吐出來了,直接拿來用即可!


完成。

缺點:
*安全性差
*檔案多
*速度慢
*本範例只適用於快速建立概念,並非認真的進行最佳化和各方面顧慮的開發, 僅用於教學。

網站撰寫安全建議參考:
OWASP: https://www.owasp.org
漏洞修補: http://exp.tw/
teahour.fm: http://teahour.fm/2014/02/18/interview-with-allenown.html

沒有留言:

張貼留言

© ERIC RILEY , 自由無須告知轉貼
Background Japanese Sayagata by Olga Libby