Web安全防範

簡單總結一下平常web開發中會出現的一些安全問題,以Flask框架爲例javascript

注入攻擊(Injection)

注入攻擊主要包括系統命令注入,SQL注入,NoSQL注入,和ORM注入等,這裏咱們簡單介紹一下SQL注入java

攻擊原理

在編寫SQL語句時,若是直接將用戶傳入的輸入做爲參數使用字符串拼接的方式插入到SQL查詢中的話,攻擊者則能夠利用SQL語句篡改,竊取數據庫的信息。python

攻擊實例

@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表中的全部數據。web

主要防範方法

  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)指跨域請求僞造,這是一種近年來才逐漸被大衆瞭解的攻擊方式。cookie

攻擊原理

攻擊者利用用戶在瀏覽器中保存的認證信息,向對應的站點發送僞造請求。如用戶登陸了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),這裏咱們就不詳細展開。

相關文章
相關標籤/搜索