0328
Web Security
XSS(Cross-Site Scripting) 跨站式腳本漏洞
例如:在留言裡寫<h1>title</h1>,發布時就會出現放大的title
那如果今天放的是<script>window.location="http://google.com"</script>留言發布後,每個進來的人都會被送到google網頁
後果:可以偷cookie、偷資料、可以把你導到釣魚網站、被竄改頁面
解法:echo htmlspecialchars($str, ENT_QUOTES, 'utf-8')
ENT_QUOTES就是把該跳脫的字元跳脫掉
輸出時再跳脫就好,存在資料庫要按照原始的樣子
SQL Injection
攻擊者能夠注入(inject)一些東西,執行他想要的結果(登入、刪除table、撈出使用者資料...)
SQL指令中帳密的地方原為:
$sql = "Select * From users Where username='$username' and password='$password'";
若在帳號的地方輸入' or 1=1 -- 則任何人皆可登入,因為SQL會變成:
$sql = "Select * From users Where username='' or 1=1 --' and password='$password'";
--是SQL的註解所以不會讀取,前面1=1為true,所以一定可以執行,電腦會用第一筆id來讓你登入
解決方法:prepare statement
原始
$sql = "Select * From users Where username='$username' and password='$password'";
$result = $conn->query($sql);
更改後
$stmt = $conn->prepare("Select * From users Where username=? and password=?");
$stmt->bind_param("ss", $username, $password); // s代表string,這裡有兩個變數,所以是ss
$stmt->execute();
$result = $stmt->get_result();
通常我們把member_id存在cookie,當作登入的證明
但因為cookie是存在client端的,所以是可以改的!
只要把member_id改成別人,就能以那個人的身份登入
解法:session機制
有人登入後,就拿一張通行證給他,也就是所謂的session id,以後就靠這個通行證知道他是誰,在cookie裡就只存這個通行證id,其他資訊都會在server端存起來,所以必須要有一個database可以用。
這樣不是跟資料庫id一樣嗎,不能拿資料庫裡的id當session id嗎?
資料庫id只是數字,可以自己亂改,輕易得知別人的資訊,但session id是一連串隨機亂碼,駭客不容易查到別人的session id
生成session id的方法
利用https://www.php.net/manual/en/function.uniqid.php 產生
資料庫:開一個database table(users_certificate),裡面有兩欄->id和username(session_id、帳號),註冊之後會生成一個session id,把session id和帳號一起存在database裡面
程式:檢查cookie裡有沒有session id,有的話,根據session id撈資料出來之後,看是否符合這個人,以驗證有這個人的存在
1.會員輸入帳號密碼,按下登入
2.若錯誤,返回錯誤訊息
3.若正確,亂數產生一個通行證id,並且在資料庫裡面記下通行證ID與會員ID的對應關係
4.把通行證ID設置到cookie
5.下次再發Request來,browser就會把通行證ID一起帶上來
6.檢查通行證ID是否有對應到的ID,有的話就代表是那個人,可以把那個人的資料撈出來,驗證是否存在
實作過程:
- 在註冊的地方創建一個session id,在user創建帳號後讀取其user_id,把user_id和session_id放進users_certificate裡
- 當user登入時,若帳密正確,會針對user資料(user_id)找出此帳號的session_id,並存進cookie中
- 跳至主面前,也要檢查此session_id是否真有放進cookie,若有,則檢查是否真有此session_id,若有則登入成功!
問題:如果有人的session_id被偷走,則還是可以偽造身份
那怎麼偷呢?
利用XSS在留言裡打
<script>
sendRequest(document.cookie)
</script>
user一進來這個網頁,cookie就被偷走,駭客就可以仿造你的身份進來網頁
假如有一天你的網站被攻擊,資料庫被偷走,使用者的密碼就外洩了
解法:資料庫不會直接儲存使用者的密碼,而是會用雜湊後的結果
Hash function
種類:MD5(危險)、SHA-1、SHA-256、bcrypt
用途:1.檢查檔案完整性 2.儲存密碼
操作:https://www.php.net/manual/en/function.password-hash.php
實作過程
- 先hash註冊的密碼並放進資料庫中->使用password_hash()
- 在登入的地方驗證使用者輸入且hash後的值來比對是否符合資料庫存的值->使用password_verify()
假設今天有個銀行的轉帳頁面,網址是http://bank.com?to=123&money=10
今天駭客改成自己的帳號,錢改多一點,並且把這網址散佈出去
那所有點擊這個網址的人都會轉帳過去
解法:CSRF token
cookie vs session
cookie:瀏覽器可以存東西的地方
session:在server方的通行證機制
其他資安問題 https://blog.techbridge.cc/2017/05/07/owasp/
0328
Web Security
頁面上可以被人執行任意javascript
XSS(Cross-Site Scripting) 跨站式腳本漏洞
例如:在留言裡寫
<h1>title</h1>,發布時就會出現放大的title那如果今天放的是<script>window.location="http://google.com"</script>留言發布後,每個進來的人都會被送到google網頁
後果:可以偷cookie、偷資料、可以把你導到釣魚網站、被竄改頁面
解法:echo htmlspecialchars($str, ENT_QUOTES, 'utf-8')
ENT_QUOTES就是把該跳脫的字元跳脫掉
輸出時再跳脫就好,存在資料庫要按照原始的樣子
可以被人執行SQL指令
SQL Injection
攻擊者能夠注入(inject)一些東西,執行他想要的結果(登入、刪除table、撈出使用者資料...)
SQL指令中帳密的地方原為:
若在帳號的地方輸入
' or 1=1 --則任何人皆可登入,因為SQL會變成:--是SQL的註解所以不會讀取,前面1=1為true,所以一定可以執行,電腦會用第一筆id來讓你登入
解決方法:prepare statement
原始
更改後
可以偽造其他人身份登入
通常我們把member_id存在cookie,當作登入的證明
但因為cookie是存在client端的,所以是可以改的!
只要把member_id改成別人,就能以那個人的身份登入
解法:session機制
有人登入後,就拿一張通行證給他,也就是所謂的session id,以後就靠這個通行證知道他是誰,在cookie裡就只存這個通行證id,其他資訊都會在server端存起來,所以必須要有一個database可以用。
這樣不是跟資料庫id一樣嗎,不能拿資料庫裡的id當session id嗎?
資料庫id只是數字,可以自己亂改,輕易得知別人的資訊,但session id是一連串隨機亂碼,駭客不容易查到別人的session id
生成session id的方法
利用https://www.php.net/manual/en/function.uniqid.php 產生
資料庫:開一個database table(users_certificate),裡面有兩欄->id和username(session_id、帳號),註冊之後會生成一個session id,把session id和帳號一起存在database裡面
程式:檢查cookie裡有沒有session id,有的話,根據session id撈資料出來之後,看是否符合這個人,以驗證有這個人的存在
1.會員輸入帳號密碼,按下登入
2.若錯誤,返回錯誤訊息
3.若正確,亂數產生一個通行證id,並且在資料庫裡面記下通行證ID與會員ID的對應關係
4.把通行證ID設置到cookie
5.下次再發Request來,browser就會把通行證ID一起帶上來
6.檢查通行證ID是否有對應到的ID,有的話就代表是那個人,可以把那個人的資料撈出來,驗證是否存在
實作過程:
問題:如果有人的session_id被偷走,則還是可以偽造身份
那怎麼偷呢?
利用XSS在留言裡打
user一進來這個網頁,cookie就被偷走,駭客就可以仿造你的身份進來網頁
密碼的安全性問題
假如有一天你的網站被攻擊,資料庫被偷走,使用者的密碼就外洩了
解法:資料庫不會直接儲存使用者的密碼,而是會用雜湊後的結果
Hash function
種類:MD5(危險)、SHA-1、SHA-256、bcrypt
用途:1.檢查檔案完整性 2.儲存密碼
操作:https://www.php.net/manual/en/function.password-hash.php
實作過程
CSRF
假設今天有個銀行的轉帳頁面,網址是http://bank.com?to=123&money=10
今天駭客改成自己的帳號,錢改多一點,並且把這網址散佈出去
那所有點擊這個網址的人都會轉帳過去
解法:CSRF token
cookie vs session
cookie:瀏覽器可以存東西的地方
session:在server方的通行證機制