Kumasan850314 / kumasan850314.github.io

0 stars 0 forks source link

[筆記/BE101] 用 PHP 與 MySQL 學習後端基礎 #19

Open Kumasan850314 opened 1 year ago

Kumasan850314 commented 1 year ago

PHP 語法基礎

輸出 print_r or var_dump

Apache 與 PHP 原理簡介

request(test.php) → apache(server) → php → output → apache →response

資料庫基礎

server → 專門處理請求、回應的程式 資料庫系統 → 專門處理資料的程式 NoSQL 使用場景: 使用者 Log

Table schema 簡介

「編碼與排序」最小單位是欄位名稱,如果沒有選就會依序往上找,從欄位名稱 → 資料表 → 資料庫。 正常來說選資料庫的編碼就好了。

比較常用的東西

屬性 unsigned,表示不會有負數 例如型態 TINYINT 是 -128~127,如果屬性選了 unsigned 就會變成 0~255 id INT AUTO_INCREMENT 保證 ID 遞增但不保證連續 username VARCHAR(20) 文章內容 TEXT/LONGTEXT(就不限定長度了) created_at DATETIME 預設值 CURRENT_TIMES 時間是資料庫的時區

Index、Unique 這些有什麼用?

Unique 唯一值 Index 簡單來說建立索引可以減少查詢時間,但是也需要一些資料庫空間、建立索引的時間。它可以是複合欄位,例如把帳號密碼建立成複合索引。

MySQL 語法基礎

※刪除,做的可能是新增一個欄位 is_delete 1: 刪除、0: 正常資料

初探 PHP

必看!在開始前一定要做的事:Disable cache

F12 → Network → Disable cache 把快取關掉(打勾),避免檔案改了,但網頁還是用快取==,如果打開了還有問題就代表跟快取沒關係嚕

再次複習 PHP 執行流程

image 簡單來說有沒有透過 server 執行 .php file

從前端傳資料給後端:GET 與 POST

檢查值建議用 empty(),用 isset() 的話,就算只有 key 沒有 value 也會是 true 唷。?a=&b= → true ※ F12 → Network → Preserrve log,如果勾選,在跨頁面加載請求時,會保留之前的所有請求。就可以看妳發的 request 唷,不用的話再關掉就好。 image

從 PHP 連線到 MySQL 資料庫

之前用的

<?php
// 下次可以加上 date_default_timezone_set("Asia/Taipei");
// PDO 連線設定
$options = [
    PDO::ATTR_PERSISTENT => false,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false,
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4'
];
//資料庫連線
try {
    $PDO = new PDO('mysql:host=127.0.0.1;port=3306;dbname=merchandise_record', 'root', '', $options);
    $PDO->exec('SET CHARACTER SET utf8mb4');
} catch (PDOException $e) {
    throw new PDOException($e->getMessage());
}
Kumasan850314 commented 1 year ago

真正的實戰:留言板 - 初階實作篇

  1. 規劃產品路由與功能
    index.php 首頁(顯示所有留言)
    handle_add_post.php(新增留言 post到這頁)
  2. 規劃資料結構以及建置資料庫 ID、暱稱、留言內容、時間
  3. 規劃會員功能與路由
    register.php 註冊頁面
    handle_register.php 處理註冊邏輯
    login.php 登入表單
    handle_login.php 處理登入邏輯
    logout.php 登出
  4. 規劃會員資料結構以及建置 database ID、username、暱稱、密碼、時間

該怎麼記住登入狀態?Cookie 簡介與實作

HTTP stateless HTTP 是無狀態機制的,所以透過 cookie 來實做,cookie 是不能防止在瀏覽器上被惡意更改的。 從 server 端設置 cookie,Set-Cookie: user_id=1 → 瀏覽器會幫忙設置 user_id=1。之後在訪問相同頁面,瀏覽器會自動帶上 cookie。設置好,會是在當前的目錄底下,所以當前的目錄都可以存取這個 cookie。 設置成功就可以到 F12 → application → 左側 cookie 看到了

PHP SetCookie

  $expire = time() + 3600 * 24 * 30; // 30天 
  setcookie("username", $data[0], $expire);

PHP 取消 cookie (登出

setcookie("username", "", time() - 3600); // 原本是+3600 -3600變過去時間
header("Location: index.html");

修正問題:通行證機制簡介與實作(Session)

token 是隨機產生的,攻擊者只能用猜的。把 token 存到 DB 跟使用者對應起來。 PHP: Set-Cookie: token=gr4298r 瀏覽器: token=grgr4298r

PHP 內建 session 機制

把上面自己寫的 → PHP 內建 session 機制 要用 session 時,都會在 .php 的第一行加上 session_start(); 登入成功後:$_SESSION['username'] = $username

  1. 產生 SESSION ID (token)
  2. 把 username 寫入檔案
  3. set-cookie: sesssion-id

首頁讀取 session,$username = $_SESSION['username'],前提首頁也是 PHP ==,這裡我用了 axios 直接跟後端要目前 session 的 username 是什麼,不知道有沒有毛病,先這樣。

  1. 從 cookie 讀取 PHPSESSID(TOKEN)
  2. 從檔案裏面讀取 SESSION ID 內容
  3. 放到 $_SESSION

怎麼清除 session(登出)呢:

session_start();
session_destroy();

加密與 Hash

加密可以解密,雜湊不能解密。 雖然雜湊會產生碰撞,但是機率低啦。就算發生碰撞,你也沒辦法知道原本的值是什麼。 JS 懶人包:

<script src='https://cdnjs.cloudflare.com/ajax/libs/js-sha256/0.9.0/sha256.min.js'></script>
 sha256(password)

發現問題:XSS

所有使用者可以輸入的地方都要注意! 因為我用 Vue 它自動幫我檔掉了 XD。Vue 的安全措施

例如在 input 輸入 <script>alert('hacked!')</script>

PHP 可以用 htmlspecialchars

推薦在顯示的時候在做轉換,保持輸入文字的一致。

發現問題:SQL Injection

PHP prepared statement

  1. $sql = '........';
  2. $stmt = $PDO -> prepare($sql);
  3. $result = $stmt -> execute([$parm]);
  4. 拿資料 $stmt -> get_result();
Kumasan850314 commented 1 year ago

真正的實戰:留言板 - 新增功能篇

  1. 編輯暱稱
  2. 編輯留言
  3. 刪除留言
  4. 分頁