簡單總結一下日常web開發中會出現的一些安全問題,以Flask框架爲例
注入攻擊(Injection)
注入攻擊主要包括系統命令注入,SQL注入,NoSQL注入,和ORM注入等,這裏我們簡單介紹一下SQL注入
攻擊原理
在編寫SQL語句時,如果直接將用戶傳入的輸入作爲參數使用字符串拼接的方式插入到SQL查詢中的話,攻擊者則可以利用SQL語句篡改,竊取數據庫的信息。
攻擊實例
@app.route('/student')
def get_table():
password = request.args.get('password')
cur = db.execute('SELECT * FROM students WHERE password='%s;'
% password)
results = cur.fetchall()
return results
如果攻擊者輸入的值爲"or 1=1--",這意味着會返回students表中的所有數據;或者輸入"; drop table users; --",會刪除students表中的所有數據。
主要防範方法
- 使用ORM
- 驗證輸入類型
- 轉義特殊字符
XSS攻擊
XSS(Cross-Site Scripting)即跨站腳本攻擊,爲了避免與CSS層疊樣式表產生命名衝突,用X來表示Cross(交叉)
攻擊原理
XSS其實是注入攻擊的一種,通過將代碼注入被攻擊者的網站中,用戶一旦訪問便會執行被注入的惡意腳本。其中,XSS攻擊主要分爲反射型XSS攻擊和存儲型XSS攻擊兩種。
攻擊示例
反射型XSS攻擊
反射型XSS又稱爲非持久型XSS,當某個站點存在XSS漏洞時,可以通過URL注入惡意腳本,當用戶訪問這個URL時,就會執行攻擊腳本。
@app.route('hello')
def hello():
name = request.args.get('name')
response = '<h1>Hello, %s</h1>' % name
return response
如果用戶輸入一段javascript代碼,如訪問http://example.com/hello/<script>alert('hahah');</script>
,客戶端介紹到響應後,瀏覽器就會執行這段代碼,當然這個示例代碼不會構成任何威脅,但這意味着可以執行任意的js代碼,鬼知道攻擊者會做些什麼!
存儲型XSS攻擊
存儲型XSS也被稱爲持久型XSS,它和反射型XSS的行爲類似,不過會把植入的惡意代碼存儲到數據庫中,如在留言區寫入一段重定向代碼,這會導致用戶在訪問留言區頁面時被重定向到一些惡意站點。
防範措施
- HTML轉義
- 驗證用戶輸入
CSRF攻擊
CSRF(Cross Site Request Forgery)指跨域請求僞造,這是一種近年來才逐漸被大衆瞭解的攻擊方式。
攻擊原理
攻擊者利用用戶在瀏覽器中保存的認證信息,向對應的站點發送僞造請求。如用戶登錄了A網站,認證信息保存在cookie中,當用戶訪問惡意網站B時,攻擊者通過B網站發送一個僞造的請求提交到A網站服務器上,這會讓A網站誤以爲請求來自於自己的網站,從而可以讓攻擊者成功篡改某些信息。
攻擊示例
假設服務器端刪除用戶賬戶的視圖操作爲
@app.route('/account/delete')
def delete_account():
if not current_user.authenticated:
abort(401)
current_user.delete()
return 'deleted!'
當用戶登錄後,只要訪問https://example.com/account/delete
就會刪除賬戶,那麼在攻擊者的網站上,只要創建一個顯示圖片的img,其中的src的屬性加入刪除賬戶的URL,當用戶訪問B網站時,瀏覽器解析網頁會自動向該鏈接發送請求,此時你的登錄信息就保存在瀏覽器的cookie中,因此,僅僅是訪問B網站就會導致刪除賬戶。
防範措施
- 正確使用HTTP方法
- CSRF令牌效驗
其中CSRF令牌是比較常用的方法,具體做法是在表單提交中添加一些僞隨機數,即CSRF令牌(token),這裏我們就不詳細展開。