簡單總結一下平常web開發中會出現的一些安全問題,以Flask框架爲例javascript
注入攻擊主要包括系統命令注入,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
XSS(Cross-Site Scripting)即跨站腳本攻擊,爲了不與CSS層疊樣式表產生命名衝突,用X來表示Cross(交叉)數據庫
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的行爲相似,不過會把植入的惡意代碼存儲到數據庫中,如在留言區寫入一段重定向代碼,這會致使用戶在訪問留言區頁面時被重定向到一些惡意站點。服務器
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網站就會致使刪除帳戶。
其中CSRF令牌是比較經常使用的方法,具體作法是在表單提交中添加一些僞隨機數,即CSRF令牌(token),這裏咱們就不詳細展開。