Web安全防範

簡單總結一下日常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表中的所有數據。

主要防範方法

  1. 使用ORM
  2. 驗證輸入類型
  3. 轉義特殊字符

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的行爲類似,不過會把植入的惡意代碼存儲到數據庫中,如在留言區寫入一段重定向代碼,這會導致用戶在訪問留言區頁面時被重定向到一些惡意站點。

防範措施

  1. HTML轉義
  2. 驗證用戶輸入

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網站就會導致刪除賬戶。

防範措施

  1. 正確使用HTTP方法
  2. CSRF令牌效驗

其中CSRF令牌是比較常用的方法,具體做法是在表單提交中添加一些僞隨機數,即CSRF令牌(token),這裏我們就不詳細展開。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章