Open Kumasan850314 opened 1 year ago
index.php 首頁(顯示所有留言)
handle_add_post.php(新增留言 post到這頁)
register.php 註冊頁面
handle_register.php 處理註冊邏輯
login.php 登入表單
handle_login.php 處理登入邏輯
logout.php 登出
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");
token 是隨機產生的,攻擊者只能用猜的。把 token 存到 DB 跟使用者對應起來。 PHP: Set-Cookie: token=gr4298r 瀏覽器: token=grgr4298r
新增一個 function 放在通用的 utils.php,用來獲取隨機產生的 token
function generateToken() { $s = ''; for ($i = 1; $i <= 16; $i++) { $s .= chr(rand(65, 90)); // 產生 15個字是 65~90的數字 chr 會轉大寫英文 } return $s; }
新增成功後再
setcookie("token", $token, $expire);
,這時候前端顯示的就會是 token=OCWHECVTAJAHHPCM 因為在 PHP 寫了一個getNickname()
,會拿 token 去查詢 nickname,所以竄改了 token → 找不到 nickname → 沒有登入狀態
把上面自己寫的 → PHP 內建 session 機制
要用 session 時,都會在 .php 的第一行加上 session_start();
登入成功後:$_SESSION['username'] = $username
首頁讀取 session,$username = $_SESSION['username'],前提首頁也是 PHP ==,這裡我用了 axios 直接跟後端要目前 session 的 username 是什麼,不知道有沒有毛病,先這樣。
怎麼清除 session(登出)呢:
session_start();
session_destroy();
加密可以解密,雜湊不能解密。 雖然雜湊會產生碰撞,但是機率低啦。就算發生碰撞,你也沒辦法知道原本的值是什麼。 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
,
推薦在顯示的時候在做轉換,保持輸入文字的一致。
PHP prepared statement
PHP 語法基礎
輸出
print_r
orvar_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 執行流程
簡單來說有沒有透過 server 執行 .php file
從前端傳資料給後端:GET 與 POST
檢查值建議用
empty()
,用isset()
的話,就算只有 key 沒有 value 也會是 true 唷。?a=&b= → true ※ F12 → Network → Preserrve log,如果勾選,在跨頁面加載請求時,會保留之前的所有請求。就可以看妳發的 request 唷,不用的話再關掉就好。從 PHP 連線到 MySQL 資料庫
之前用的