加密:是1對1,且可以解密 雜湊:是多對一,不可還原 因為避免資料庫被駭,密碼被竊取,經過雜湊後,就算放進資料庫也不可被還原成原本的密碼,較為安全。
1、include函數:在找不到檔案時,只會觸發Warning所以不對程式有任何影響。
2、require函數:找不到檔案時,會觸發Fatal Error使程式停止。
3、include_once 函數:在 include 時,會檢查是否已經 include 過,如果是,就不再載入。
4、require_once 函數:在 require 時,會檢查是否已經 require 過,如果是,就不再載入。
補充:PHP require 用來引入一個 PHP 檔案。
例如:
如果no.php文件不存在,echo '123'這句是不執行的,在require時就停止了。
在include如果no.php文件不存在,echo '123'這句是可以繼續執行的.
SQL Injection 是將惡意構造的字串,注入原本的SQL語法當中。
可以使用 prepared statement:用mysql內建的機制做字串拼接。
將原本使用字串拼接的部分,改為使用參數傳入值,資料庫不會將參數的內容視為 SQL 指令的一部份來執行,藉此來避免 SQL Injection。
防範方法:
1、使用 Regular expression 驗證過濾輸入值與參數中惡意代碼,將輸入值中的單引號置換為雙引號。
2、限制輸入字元格式並檢查輸入長度。
3、資料庫設定使用者帳號權限,限制某些管道使用者無法作資料庫存取。
XSS攻擊:跨站腳本攻擊(Cross-Site Scripting)
XSS是指通過利用網頁開發時留下的漏洞,惡意在別人網站上輸入程式碼,使使用者載入並執行攻擊者惡意製造的網頁程式。
防範方法:
法1:htmlspecialchars ,過濾掉輸入中的所有特殊字符,這樣就能消滅絕大部分的XSS攻擊。
法2:使用HTTP頭指定類型。header.set("Content-Type","text/javascript")
,這樣就可以讓瀏覽器解析javascript代碼,而不會是html輸出。
CSRF全名是 Cross Site Request Forgery( 跨站請求偽造):駭客在其他網頁塞入一個「 目標 domain 」 的連結,偷偷發 request( 利用隱藏圖片或隱藏表單 )。
普遍防禦CSRF的方法有兩種:
1、檢查 referer欄位
2、加入驗證token:CSRF
補充:
1、瀏覽器端的防禦:SameSite cookie ( 最推薦 ):其原理就是幫 Cookie 再加上一層驗證,不允許跨站請求。
實際舉例
我們可以想像cookies就像是每個人身上的筆記本,當你在A銀行登入之後,A銀行在你的筆記本上蓋了個印章,有這個印章之後,接下來三個小時內你的所有動作都不需要重複驗證身分。但你在這三小時內又跑去逛了其他網頁,很不巧的就逛到了駭客B架設的惡意網頁,這個惡意網頁偷偷複製了你的cookie筆記本的印章,跑去打A銀行的轉帳API,請A銀行把你的存款匯10萬元到駭客B自己的帳戶,由於A銀行認印章不認人,所以就接受了這筆匯款請求。
所以無辜的你,只是登入了A銀行的帳戶,同時逛逛網拍、找找資料,突然間就損失了10萬塊! 這就是CSRF可怕的地方。
1、檢查 referer欄位:確認需求的來源,http協定中就有一個referer欄位記錄著這個請求是從哪個網站發出來的,只要不是銀行網站發出來的請求,網站這邊一律不接受!
2、加入驗證token:CSRF的核心概念,就是銀行不知道發出請求的人是不是攻擊者,只要使用者能提出一個唯一且保密的序號,攻擊者拿不到這個序號,就不能偽裝成使用者,而這個序號,就是我們稱的CSRF Token,
這個Token是由銀行server產生,並且加密存在session中的,其他人無法仿造,只有透過server給使用者,並在一定時間內刷新。
當使用者想做任何交易的時候,銀行server就會請使用者提供CSRF Token,如果不能提供,就代表這次的請求就是攻擊者,那銀行server就不予理會。