Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

作業

注意:這週的 hw1~hw4 是連續的作業,只要交一份就好,不用每一個都特地交一個

hw1:加強留言板

在上次的作業中,只有顯示留言而已。

而這次的作業,我們要再多加幾個功能,讓這個留言板變得更完整。

  1. 會員可以刪除自己的留言
  2. 會員可以編輯自己的留言
  3. 會員在自己的留言底下回覆的話,背景要顯示不同的顏色

hw2:幫密碼穿衣服

在課程中有提到上次寫的會員系統的缺陷之一,那就是密碼存明碼。密碼存明碼的風險就是一旦你的伺服器被入侵,資料庫被偷走的時候,使用者的密碼就外洩了。

你可能會問說:「所以,難道資料庫不能存密碼嗎?」

是的,我們要改存「另外一種形式」。

這是什麼意思呢?有一種東西叫做:Hash function,中文翻作雜湊函數,這個函數的重點就是它是單向的。你輸入 123 可以得到 202cb962ac59075b964b07152d234b70,但你沒辦法從 202cb962ac59075b964b07152d234b70 推出輸入是 123。

聽起來很神奇對吧?

所以我們的密碼就必須利用這種 hash function,在存入資料庫以前先轉變成另外一種形式。在驗證密碼的時候也是同理,我們不驗證密碼,而是驗證hash_function(password)跟資料庫裡面所存的密碼是不是一致。

這樣一來,就算我們的資料庫整個被偷走,駭客們還是不知道使用者的密碼是什麼(或其實是說很難知道啦,要花很多時間)。

PHP 在 5.5 以上提供了兩個函式:password_hashpassword_verify,請你利用這兩個函式把之前會員註冊跟登入的頁面改寫,讓你的系統變得更安全一點。

hw3:通行證

在上一週的作業裡面,我們把會員的帳號存在 Cookie 裡面,藉此判斷會員是不是已經登入了,以及驗證身份。可是這樣子做其實會有問題產生,首先,先跟我唸一遍資安金句:

千萬不要相信來自 Client 端的資料

為什麼?因為只要是存在 Client 端的資料,都是可以被篡改的。假設有人把 Cookie 裡面的會員帳號改成:admin,那他就可以以管理員的身份登入了。

那要怎麼辦才好呢?

你可以回想你要去商業辦公大樓面試的時候,通常會要你在櫃檯換證。換了證之後,認證不認人,你的證是誰,你就是誰。在會員系統的實作上面,我們也可以參考這一個機制。

  1. 會員輸入帳號密碼,按下登入
  2. 若錯誤,返回錯誤訊息
  3. 若正確,亂數產生一個通行證 ID,並且在資料庫裡面記下通行證 ID 與會員 ID 的對應關係
  4. 把通行證 ID 設置到 Cookie
  5. 下次再發 Request 來,就會把通行證 ID 一起帶上來
  6. 檢查通行證 ID 是否有對應到的 ID,有的話就代表是那個人

我們引入了通行證的機制以後,就不用怕有人會竄改 Client 端的資料了,除非通行證被偷走,不然不可能用猜的把通行證 ID 猜出來。(所以你的通行證 ID 通常會長得很像亂碼)

現在這個作業,就要你把會員系統的驗證換成上面這個通行證的機制,你會需要在資料庫新增一個 Table 來儲存通行證跟帳號的對應關係,可參考以下結構:

Table 名稱:users_certificate

欄位名稱 欄位型態 說明
id VARCHAR(32) 通行證 id
username VARCHAR(16) 帳號

hw4:修補漏洞

如同我在課程中提過的,上週做出來的網頁裡面,會有兩個網頁最知名的漏洞:

  1. SQL Injection
  2. XSS

現在請你試試看對你上週做出來的網頁做這兩種攻擊,看看是否能成功,並且修補這兩個漏洞。

hw5:簡答題

  1. 請說明 SQL Injection 的攻擊原理以及防範方法
  2. 請說明 XSS 的攻擊原理以及防範方法
  3. 請說明 CSRF 的攻擊原理以及防範方法
  4. 請舉出三種不同的雜湊函數
  5. 請去查什麼是 Session,以及 Session 跟 Cookie 的差別
  6. includerequireinclude_oncerequire_once 的差別