# 資訊安全(雜湊加密、SQL Injection、XSS、CSRF) > 此篇內容節錄並改寫自 [讓我們來談談 CSRF](https://blog.techbridge.cc/2017/02/25/csrf-introduction/#post-comment-wrapper) 和 [1](https://github.com/Lidemy/mentor-program-4th-ahwei777/blob/master/homeworks/week11/hw3.md) [2](https://github.com/Lidemy/mentor-program-4th-small-leaf/blob/master/homeworks/week11/hw3.md) ## 請說明雜湊跟加密的差別在哪裡,為什麼密碼要雜湊過後才存入資料庫 雜湊與加密最大的差別在於,雜湊是不可逆的,而加密可逆。使用者的密碼先經過雜湊函式再存入資料庫,即便防止資料庫遭入侵,攻擊者也無法直接看到明碼。 雜湊的特性: + 不可逆,沒有辦法從結果去逆推回原本的內容。 + **不定長度**、**無窮可能**的輸入,都會得到**固定長度**的雜湊值。 + 不同的輸入也有可能得到相同的雜湊值,這種情形稱為碰撞(collision)。 ## `include`、`require`、`include_once`、`require_once` 的差別 require 與 include 除了引入檔案失敗之後的行為不同之外,可以看成是相同的。 include 引入的檔案發生錯誤的話,會顯示警告,會繼續執行後面的程式碼; 而 require 則是會顯示錯誤,立刻終止程式,不再往下執行。 require_once 和 include_once 會判斷檔案是否重複引入,如果沒有才會去執行引入動作。 ## 請說明 SQL Injection 的攻擊原理以及防範方法 攻擊原理:攻擊者利用組合、拼湊的方式注入夾帶惡意 SQL 指令,夾帶進去的惡意指令就會被資料庫伺服器誤認為是正常的 SQL 指令而執行,因此遭到破壞或是入侵。 防範方法:利用 prepare statement 使資料庫不會將攻擊者輸入的內容當成程式碼來執行。 ## 請說明 XSS 的攻擊原理以及防範方法 全名為 Cross-site scripting 即「跨網站指令碼」。 攻擊原理:攻擊者注入惡意程式碼(通常是 HTML 及 JavaScript),目的有竊取 Cookie、將頁面導向釣魚網站等等。 防範方法:將注入的惡意程式碼跳脫字元。 PHP 有內建 `htmlspecialchars()`,JavaScript 可以自己寫一個 `escape()` function 例: ``` js function escape(unsafe) { return unsafe .replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, """) .replace(/'/g, "'"); } ``` ## 請說明 CSRF 的攻擊原理以及防範方法 全名為 Cross-site request forgery 即「跨站請求偽造」又稱作 one-click attack。 攻擊原理:攻擊者利用瀏覽器自動帶上 Cookie 的機制,欺騙用戶的瀏覽器,以受害者的名義傳送惡意請求去做一些未經過授權的操作。 範例: 1. 使用者已登入過 A 網站,Cookie 存有登入狀態 2. 使用者再進入惡意網站,該網站將導向 A 網站的偽造 Request包裝成按鈕或圖片等等 3. 使用者點下惡意網站包裝後的元素後,送出偽造 Request 並自動帶上 Cookie 4. A 網站的伺服器核對 Cookie 之後判定為本人發送的 Request,並執行惡意操作 防範方法: 客戶端:每次使用完網站就登出,讓認證狀態無法維持被利用。 伺服器端: + 檢查 Referer:request 的 header 裡面會帶一個欄位叫做 referer,代表這個 request 是從哪個地方過來的,可以檢查這個欄位看是不是合法的 domain,不是的話直接 reject 掉即可。需要注意的地方有三點: + 有些瀏覽器可能不會帶 referer, + 有些使用者可能會關閉自動帶 referer 的這個功能,這時候你的 server 就會 reject 掉由真的使用者發出的 request。 + 判定是不是合法 domain 的程式碼必須要保證沒有 bug + 圖型、簡訊驗證:網路銀行轉帳或消費時需要輸入簡訊認證碼 + CSRF token:在 form 裡面加上一個 hidden 的欄位,name 為 csrftoken,值為 server 隨機產生,並存在 server 的 session 中,在 submit 後,透過比對表單中的 csrftoken 與 session 內的值是否一致,藉此判斷是否為本人所發送的 request + Double Submit Cookie:方式與上相同,但改儲存在使用者端的 cookie 內,伺服器收到資料時比對 cookie 內的 token 與 form 內的 token 是否相等。 + 設定 SameSite cookie:原理就是幫 Cookie 再加上一層驗證,分為兩種模式,第一種為 `strict 模式`任何來自不同網域的 request 都不會帶上 cookie;第二種為 `Lax 模式`,放寬了一些限制,例如說 `<a>`, `<link rel="prerender">`, `<form method="GET">` 這些都還是會帶上 cookie。但是 POST 方法 的 form,或是只要是 POST, PUT, DELETE 這些方法,就不會帶上 cookie,但 `Lax 模式`之下就沒辦法擋掉 GET 形式的 CSRF,這點要特別注意一下。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up