相信大家在各種技術文章都看到過SQL隱碼攻擊、XSS和CSRF這三個名詞,但是我覺得有一部分人可能並不清楚這三個詞的真正含義。接下來,我就說下這三個名詞的含義,希望對大家能有所幫助。
SQL隱碼攻擊
SQL隱碼攻擊是屬於注入式攻擊,這種攻擊是因為在專案中沒有將程式碼與資料(比如使用者敏感資料)隔離,在讀取資料的時候,錯誤的將資料作為程式碼的一部分執行而導致的。
典型的例子就是當對SQL語句進行字串拼接的時候,直接使用未轉義的使用者輸入內容作為變數。這時,只要在sql語句的中間做修改,比如加上drop、delete等關鍵字,執行之後後果不堪設想。
說到這裡,那麼該怎麼處理這種情況呢?三個方面:
1、過濾使用者輸入引數中的特殊字元,降低風險。
2、禁止通過字串拼接sql語句,要嚴格使用引數繫結來傳入引數。
3、合理使用資料庫框架提供的機制。就比如Mybatis提供的傳入引數的方式 #{},禁止使用${},後者相當於是字串拼接sql,要使用引數化的語句。
總結下,就是要正確使用引數化繫結sql變數。
XSS
XSS:跨站指令碼攻擊,Cross-Site Scripting,為了和前端的css避免重名,簡稱為XSS,是指通過技術手段,向正常使用者請求的HTML頁面中插入惡意指令碼,執行。
這種攻擊主要是用於資訊竊取和破壞等目的。比如2011年的微博XSS攻擊事件,攻擊者利用了微博釋出功能中未對action-data漏洞做有效的過濾,在釋出微博資訊的時候帶上了包含攻擊指令碼的URL,使用者訪問就會載入惡意指令碼,導致大量使用者被攻擊。
關於防範XSS上,主要就是通過對使用者輸入的資料做過濾或者是轉義,可以使用框架提供的工具類HtmlUtil。另外前端在瀏覽器展示資料的時候,要使用安全的API展示資料。比如使用innerText而不是innerHTML。
CSRF
跨站請求偽造,在使用者並不知情的情況下,冒充使用者傳送請求,在當前已經登入的web網站上執行惡意操作,比如惡意發帖,修改密碼等。
大致來看,與XSS有重合的地方,前者是黑客盜用使用者瀏覽器中的登入資訊,冒充使用者去執行操作。後者是在正常使用者請求的HTML中放入惡意程式碼,XSS問題出在使用者資料沒有轉義,過濾;CSRF問題出現在HTTP介面沒有防範不守信用的呼叫。
防範CSRF的漏洞方式:
1、CSRF Token驗證,利用瀏覽器的同源限制,在HTTP介面執行前驗證Cookie中的Token,驗證通過才會繼續執行請求。
2、人機互動,例如簡訊驗證碼、介面的滑塊。
之前在會議上也有一個思考,在人機驗證這塊,如果不用驗證碼的方式,用介面上的滑塊這種方式,而且滑塊還是第三方的。在APP的註冊、登入使用這種人機驗證的方式的話,如果第三方出現了問題,那麼自己的APP就完全崩掉了,發版之後的APP什麼也改不了。
這個問題,你們能想到解決方案嗎?在下一篇文章中,我會說一下討論的結果。
希望這點分享會對每個讀者有所幫助,如果有什麼好的建議,可以在留言區告訴我。
這樣的分享我會一直持續,你的關注、轉發和點贊是對我最大的支援,感謝。