1.SQL注入------常見的安全性問題。
解決方案:前端頁面需要校驗用戶的輸入數據(限制用戶輸入的類型、范圍、格式、長度),不能只靠后端去校驗用戶數據。一來可以提高后端處理的效率,二來可以提高后端數據的安全。
后端不要動態sql語句,使用存儲過程查詢語句。限制用戶訪問數據庫權限。后端接受前端的數據時要過濾一些特殊字符(如:“--”等字符)
后端如果出現異常的話,要使用自定義錯誤頁,防止用戶通過服務器默認的錯誤頁面找到服務器漏洞。
java版
安全查詢(參數化查詢)
//獲取參數,拆分參數
String custname = request.getParameter("customerName"); String query = "SELECT account_balance FROM user_data WHERE user_name = ? ";
//創建連接 PreparedStatement pstmt = connection.prepareStatement( query );
//將參數格式化 pstmt.setString( 1, custname);
//獲取查詢結果 ResultSet results = pstmt.executeQuery();
安全查詢(存儲過程)
//獲取參數
String custname = request.getParameter("customerName");
try {
//調用數據庫的存儲過程 CallableStatement cs = connection.prepareCall("{call sp_getAccountBalance(?)}"); //將參數格式化
cs.setString(1, custname);
//獲取查詢結果 ResultSet results = cs.executeQuery();
} catch (SQLException se) { }
不安全查詢
String query = "SELECT account_balance FROM user_data WHERE user_name = " + request.getParameter("customerName"); //動態查詢,直接拼接字符串 try {
//創建連接 Statement statement = connection.createStatement();
//獲取查詢結果 ResultSet results = statement.executeQuery( query ); }
PS:大多數的網站都是使用默認的錯誤頁面。(不要建議這樣做,容易暴露站點信息)
2.XSS攻擊------相對復雜的安全性問題
攻擊方式:基於DOM的XSS即通過瀏覽器來直接運行js腳本,無須提交服務器,從客戶端的代碼引起的。
如:其實就是發送一個合法的地址加自己的腳本,比如:www.xxx.com/search?wd=<script>...</script>
受害者點擊的是www.xxx.com/search?wd=<script>...</script>鏈接,然后受害者的瀏覽網頁就加入這個惡意代碼。
存儲XSS攻擊即通過輸入框提交js腳本或者上傳文件到服務器,從網站的數據庫引起的攻擊。
反射XSS攻擊即通過url提交js腳本到服務器,從受害人的請求發起引起的攻擊。
解決方案:后端輸出頁面的時候需要進行轉換html實體。嚴格過濾用戶輸入。如:<script>
轉義成 <script>
補充:前端url重定向,比如是采用sso登錄模式重定向,容易出現跳轉到其他域。
比如:www.xxx.com/login?redirect=http://abc.com
解決方案:后端針對重定向域進行判斷。
前端文件上傳,比如是上傳控件上傳一些非指定格式的文件。
解決方案:前后端針對文件類型進行判斷。
前端文件下載,比如是下載一些資料(doc,excel,mp4)。
解決方案:后端嚴格控制文件下載的權限,限制下載文件類型,文件目錄。
PS:xss攻擊的地方很多,html、css、js都有可能會被注入威脅。
3.CSRF攻擊------比xss攻擊更危險的安全性問題
攻擊方式:受害者打開網站A,登陸網站A,網站A保存一些cookies在本地(沒有關閉瀏覽器),受害者又打開網站B,網站B保存一些惡意cookies,並向網站A發送受害者的請求(網站B利用
受害者攻擊網站A)。受害者打開網站B,網站B誘使受害者進行網站A的操作。(假官網盜取用戶資料)
解決方案:驗證 HTTP Referer 字段,給用戶分配token。
4.SSRF攻擊------變種CSRF攻擊的安全性問題
攻擊方式:常見於分布式站點或者分布式服務器。攻擊者能巧妙繞過目標服務器的防火牆,控制目標內網的服務器,通過內部服務器與其他服務器進行交互,從而進行惡意的修改目標服務器
上的數據。
解決方案:內部服務器需要設置認證帳號密碼,切記默認帳號。
內部服務器禁用其他通信協議,只保留https/http協議。
內部防火牆把內部服務器的ip或者域名加入黑名單,防止內部服務器濫用發送請求。
5.DoS攻擊------常見的具有破壞性的安全性問題(如果是分布式攻擊的話就是DDos攻擊)
攻擊方式:Ping Flood攻擊即利用ping命令不停的發送的數據包到服務器。
SYN Flood攻擊即利用tcp協議原理,偽造受害者的ip地址,一直保持與服務器的連接,導致受害者連接服務器的時候拒絕服務。
解決方案:設置路由器與交換機的安全配置,即設置防火牆。(涉及到硬件問題我就不多說了,只是提醒一下)
6.DNS緩存污染------常見的網站不可訪問的問題
攻擊方式:第三方可信賴的域名服務器緩存了一些DNS解析,但被別人制造一些假域名服務器封包污染了,指向錯誤網址。
解決方案:備多個域名服務器商。
7.ARP欺騙------常見的竊取資料的安全性問題
攻擊方式:利用ARP欺騙,偽造成網關或目標地址,導致受害者與目標計算機都無法正常通信,讓受害者的數據經過攻擊者的電腦,從而抓取別人的用戶信息。(僅限於局域網)
解決方案:強烈要求數據必須加密傳輸,啟動https協議。
PS:ARP 即 Address Resolution Protocol(地址解析協議),是一種用於接收設備MAC地址的協議。
MAC 即 Media Access Control (媒體訪問控制),用於表明設備在網絡上的身份(網卡的身份號),具有全球唯一性。這里的唯一性指當前網絡的網卡的身份號是唯一的,不代表MAC
地址不可修改,MAC地址有兩種修改方式,一是硬件擦寫,重新把MAC地址寫進設備,二是軟件修改,在系統上修改MAC地址。
8.中間人攻擊(會話劫持)-----常見的竊取資料的安全性問題
攻擊方式:劫持會話cookies,把受害者(A)與受害者(B)之間通信經過攻擊者的電腦。(常見於在線聊天系統)
解決方案:用戶進行二次驗證,隨機產生會話ID,會話cookies設置httponly(某些情況下httponly設置無效)。
增加http請求頭信息。判斷是否是真實用戶的請求。
使用https協議。
PS:cookies有兩種。
會話cookies : 建立會話的cookies,關閉瀏覽器失效。
持久性cookies : 持久保存本地的cookies,到期失效。
cookies也可以進行XSS,CSRF攻擊。(把惡意代碼存放到cookies里面)
補充:因為現在大多數的web項目都采用前后端分離的模式開發。前端就通過ajax請求與后台交互,傳統的sessionid保存在cookies或者是存放在url是不安全的。所以大多數的web項目都采用基於token鑒權機制來識別用戶身份。
比如JSON WEB TOKEN驗證機制。
JSON WEB TOKEN(簡稱JWT)是一種基於json,通過http請求頭中Authorization字段進行前后端身份驗證的規范。此規范靈活性強,效率高,大多數現代web應用都采用這種方法進行身份驗證。
JWT是由三個部分組成,分別頭部、載荷與簽名。
{ "alg": "HS256", //消息認證碼算法,當然還有其他算法。 "typ": "JWT" //標記類型 } //頭部 . //需要這個.符號 { "jti": "51d84ac1-db31-4c3b-9409-e630ebbb83df", //JWT的Id "username": "XXX", //這個不是固定的,可以添加多個自定義字段 "sub":"logon", //主題字段 "nbf":"1452356445", //JWT接收時間 "iss": "xdfsdf", //發行主體字段 "exp": "1452349372" //過期時間字段 } //載荷 . //需要這個.符號 HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret ) //簽名
對應生成json字符串
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 //頭部 . eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ //載荷 . SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c //簽名
注意:千萬不要依賴 “exp” 字段來處理token過期失效或者是管理會話狀態。因為這個token是在客戶端,而不在服務端。所以服務端必須保存token,即用戶登錄系統后,
服務端會返回一個token(token值一般由sessionId、userId等各種參數與簽名算法生成,token不應該包含敏感參數,如password)給客戶端,並保存一個token在緩存數
據庫(如:redis),客戶端每次請求帶token,服務端獲取token后通過加密算法生成的字符 ,然后匹配自己存放在緩存數據庫的token進行比較。
9.后門 -----常見的軟件漏洞問題
后門是指一種繞過安全性控制而獲取對程序或系統訪問權的方法。在軟件的開發階段,程序員常會在軟件內創建后門以便可以修改程序中的缺陷。如果后門被其他人知道,
或是在發布軟件之前沒有刪除,那么它就成了安全隱患。常見於一些熱補丁更新軟件。
攻擊方式:使用webshell提交惡意的動態網頁到網站服務器,然后執行惡意的動態頁面(如:www.XXX.xom/惡意頁面.jsp)。
使用滲透測試工具,掃描網站服務端開放端口,訪問敏感目錄(上傳,下載,管理后台頁面),從而竊取站點的關鍵信息或破壞系統文件與數據。
使用滲透測試工具,通過目標網站所在的主機上存放的其他網站進行注入攻擊。(web站點旁注攻擊)
解決方案:所有軟件(配置文件,服務器,數據庫等)使用必須采用強密碼,禁止使用弱密碼,禁止使用統一相同帳號與密碼。
使用非對稱后門接口(即非對稱加密接口)進行軟件更新,避免對稱后門接口(即對稱加密接口),給服務端程序加殼處理。
使用蜜罐技術。(蜜罐是指一個包含各種漏洞的系統,模擬一個或多個易受攻擊的主機,給黑客提供一個容易攻擊的目標。)
補充:旁注攻擊類型相對復雜,不僅僅只有web站點上旁注攻擊,還有密碼學上旁注攻擊。
密碼學上旁注攻擊是通過測量目標計算機的CPU、電源、系統緩存、wifi信號頻率、故障信息、硬件運作聲音、硬件運作溫度,來逆推計算機傳輸中的加密信息的密鑰,從而破解截獲的
重要信息。( 密碼學上旁注攻擊是種綜合性強的攻擊手段,唯一解決方案就是控制硬件運作頻率或隨機改變軟件執行順序)
10.爬蟲攻擊-----常見的非攻擊性的安全性問題
網絡爬蟲嚴格意義上不是一種web攻擊手段,但卻對服務器造成一定的傷害,不容忽視這種攻擊。
攻擊方式:常見於搜索引擎爬蟲或者一些前端測試工具,如:PhantomJs,puppeteer等,這些工具可以模擬用戶操作,進行網絡爬蟲請求。
解決方案:鑒別請求ip,鑒別請求次數,鑒別請求點擊連接,鑒別請求數據格式,比如cookie,Referer等字段,必要時需要人工時刻監控網站情況,定期要更新前端頁面結構。
PS:以上方案都不能徹底解決網絡爬蟲問題,容易誤傷真實用戶。
補充:准確判斷正規爬蟲與惡意爬蟲。
根據訪問者的ip來查看主機域名,對於(Baiduspider、Googlebot)正規爬蟲的域名加入過濾白名單,保證正規爬蟲能正常對本站點進行SEO。
總結:當然,還用很多攻擊的手段沒有列出來,原因是不常見,而且已經有點偏向於網絡黑客方面,與web開發方面無關。以上問題在web開發中需要值得注意的。
解決方案只是一般防御策略,並不能徹底解決這些問題,俗話說得好,道高一尺,魔高一丈。web安全是一個長期值得研究的問題。