基本原則
Secure by default
Secure by default, in software, means that the default configuration settings are the most secure settings possible……
《白帽子講Web安全》將其總結了下面兩條:
- 黑名單與白名單
盡量使用白名單汤徽。
- 最小權限原則
The principle of least privillege requires that in a particular abstraction layer of a computing environment, every module(such as a process, a user, or a program, depending on the subject) must be able to access only the information and resources that are necessary for its legitimate purpose.
簡單地說揽趾,就是系統(tǒng)只授予主體必要的權限竭宰,不要過度授權蹄胰。如:1)數(shù)據庫授權吼具,一般應用程序只需要針對數(shù)據進行增刪改查赡勘,而不需要對表結構進行操作哟冬。2)在Linux操作系統(tǒng)中楼熄,正常情況只需要使用普通賬戶登錄。
縱深防御原則
安全是一個整體浩峡】善瘢縱深防御,其實就是:這個“整體”的不同層次需要實施不同的安全方案翰灾,需要在正確的地方做正確的事缕粹。
數(shù)據與代碼分離原則
“注入”攻擊(如XSS、CRLF注入纸淮、SQL注入平斩、緩沖區(qū)溢出)產生的原因,就是代碼和數(shù)據沒有分離開咽块,而把“數(shù)據”當成“代碼”執(zhí)行了绘面。
不可預測性原則
不可預測性,能有效地對抗基于篡改侈沪、偽造的攻擊揭璃。如:1)操作系統(tǒng)為了提高緩沖區(qū)溢出攻擊的門檻,使用ASLR讓進程的椡ぷ铮基址隨機變化瘦馍。2)使用token防止CSRF攻擊。
同源策略
In computing, the same-origin policy is an important concept in the web application security model.
同源策略是整個Web安全的基礎皆撩。
所謂同源扣墩,就是協(xié)議相同、域名相同扛吞、端口相同呻惕。
主要表現(xiàn)為:
- 無法讀取/寫入不同源的頁面的cookie、localstorage和indexDB滥比。
- 無法操作不同源的頁面的DOM亚脆。
- 默認情況下,不能發(fā)送不同源的ajax請求(當然有特殊辦法)盲泛。
XSS攻擊
- XSS攻擊簡介
Cross-site scripting(XSS) is a type of computer security vulnerability typically found in web applications. XSS enables attacker to inject client-side scripts into web pages viewed by other users.
XSS攻擊濒持,通常指通過”HTML注入”篡改網頁键耕,插入惡意腳本,從而在用戶瀏覽網頁時柑营,控制用戶瀏覽器的一種攻擊屈雄。
雖然叫“跨站腳本攻擊”,但這是歷史原因官套,現(xiàn)在這種攻擊不一定和“跨站”有關酒奶。
XSS防御
-
輸入輸出
- 對用戶輸入的標簽進行過濾/encode。但是這樣做容易誤傷奶赔,因為有些場景就是需要用戶輸入標簽惋嚎。
- 一般建議在將數(shù)據添加到DOM的時候對數(shù)據進行HtmlEncode或JavaScriptEncode,以預防XSS攻擊站刑。
-
HttpOnly
- 頁面被XSS攻擊之后另伍,最常見的攻擊方式就是“cookie劫持”——用js讀取用戶的cookie,并將其發(fā)送到攻擊者的后臺绞旅,實現(xiàn)盜取用戶的登錄態(tài)的目的摆尝。
- 這里可以將比較敏感、重要的cookie設置為HttpOnly玻靡,js就無法獲取被設置為HttpOnly的cookie结榄。
CSRF
Cross-site request forgery, also known as one-click attack or session riding...is a type of malicious exploit of a website where unauthorized commands are transmitted from a user that the website trusts.
跨站請求偽造,可以這么理解:攻擊者在用戶不知情的情況下囤捻,利用cookie發(fā)送的特點臼朗,以用戶的名義發(fā)送惡意請求。
CSRF的本質原因是:請求是可偽造/可預測的蝎土。
假如請求是無法偽造/無法預測的视哑,那么攻擊者自然就無法替用戶偽造并發(fā)起請求:用戶第一次訪問頁面的時候,后臺生成一個token誊涯,存到session和cookie里面挡毅。后續(xù)用戶發(fā)起請求的時候,都在表單中帶上這個token暴构,后臺對token進行校驗跪呈。
這里token是不可預測和不可偽造的。
SQL注入
SQL injection is a code injection technique, used to attack data-driven applications, in which nefarious SQL statements are inserted into an entry field for execution.
發(fā)生SQL注入的本質原因和XSS攻擊一樣取逾,沒有處理好代碼與數(shù)據分離,把用戶輸入的數(shù)據當成代碼運行了耗绿。
防止SQL注入:
- 使用參數(shù)化查詢:將SQL語句和參數(shù)分開提交給DB,而不是自己拼完整的字符串砾隅,這個需要庫的支持误阻。
- 小心地對輸入字符串進行escape,如使用mysql_real_escape_string。
CRLF注入
CRLF也是一種注入攻擊究反,一般是指在http header注入CRLF這兩個字符寻定,導致改變了HTTP包的語義。
在將數(shù)據設置為http header的時候精耐,要注意這個問題狼速。防止攻擊的辦法也很簡單,過濾CRLF這兩個字符即可卦停。