PHP開發web應用安全總結

XSS跨站腳本

概念:惡意攻擊者往Web頁面裏插入惡意html代碼,當用戶瀏覽該頁之時,嵌入其中Web裏面的html代碼會被執行,從而達到惡意用戶的特殊目的。javascript

危害:php

  1. 盜取用戶COOKIE信息。
  2. 跳轉到釣魚網站。
  3. 操做受害者的瀏覽器,查看受害者網頁瀏覽信息等。
  4. 蠕蟲攻擊。

描述:反射型跨站。GET或POST內容未過濾,能夠提交JS以及HTML等惡意代碼。html

代碼:java

[php]  view plain  copy
 
  在CODE上查看代碼片派生到個人代碼片
  1. <?php echo $_GET['msg']; ?>  
  2. //正常URL  
  3. user.php?msg=henhao  
  4. //帶JS的URL  
  5. user.php?msg=<script>alert(1)</script>  
  6. //惡意跳轉URL  
  7. user.php?msg=<script>window.history.back(-1);</script>  


解決方法:mysql

輸出過濾,PHP端輸出到view的模板頁面上的數據都須要通過過濾:程序員

[php]  view plain  copy
 
  在CODE上查看代碼片派生到個人代碼片
  1. /** 
  2.  * 安全過濾類-過濾HTML標籤 
  3.  *  Controller中使用方法:$this->controller->filter_html($value) 
  4.  * @param  string $value 須要過濾的值 
  5.  * @return string 
  6.  */  
  7. public function filter_html($value) {  
  8.     if (function_exists('htmlspecialchars')) return htmlspecialchars($value);  
  9.     return str_replace(array("&", '"', "'", "<", ">"), array("&", """, "'", "<", ">"), $value);  
  10. }  



CSRF跨站攻擊

概念:CSRF跨站請求僞造,也被稱成爲「one click attack」或者session riding,一般縮寫爲CSRF或者XSRF,是一種對網站的惡意利用。XSS利用站點內的信任用戶,而CSRF則經過假裝來自受信任用戶的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊每每不大流行(所以對其進行防範的資源也至關稀少)和難以防範,因此被認爲比XSS更具危險性。web

危害:強迫受害者的瀏覽器向一個易受攻擊的Web應用程序發送請求,最後達到攻擊者所須要的操做行爲。sql

例子:數據庫

[html]  view plain  copy
 
  在CODE上查看代碼片派生到個人代碼片
  1. <img src=「http://a.com/addfriend.php?id=123」/>   

1. 上面是一個圖片的html標籤,可是src中是一個添加id爲123好友的新增好友連接。瀏覽器

2. 惡意用戶能夠將這段代碼植入其它網站網頁上面,甚至能夠img設置爲0,0,讓用戶不知不覺中點擊這個連接,達到用戶並不像加這我的好友,可是添加的目的。

3. 當不少人都無心加了id爲123這我的爲好友的時候,id爲123的惡意用戶就有權限來查看這些人的信息,甚至能夠發送不少惡意的信息,達到惡意用戶的目的。

解決方法:

1. http://a.com/addfriend.php?id=123 使用POST方法會相對安全一點。

2. 採用相似隨即碼或者令牌的形式,讓用戶操做惟一性。 (每次用戶登陸網站隨機生成一個token,存放在cookie中,用戶的全部操做中都須要通過token驗證)

 

帶上這個init_token,而後每次請求都去驗證一下就行了。token在瀏覽器打開的時候生效,關閉瀏覽器再打開瀏覽器的時候會變化

flash安全問題

例子:

[html]  view plain  copy
 
  在CODE上查看代碼片派生到個人代碼片
  1. http://images.sohu.com/bill/s2010/liulin/nokia/1602600902.swf?clickthru=javascript:alert(1)  


解決方法:

在網站根目錄中,添加crossdomain.xml文件,這個文件主要是控制flash的域訪問。

淘寶的:http://www.taobao.com/crossdomain.xml

[html]  view plain  copy
 
  在CODE上查看代碼片派生到個人代碼片
  1. <?xml version="1.0" ?>    
  2. <cross-domain-policy>    
  3. <allow-access-from domain="*.taobao.com" />    
  4. <allow-access-from domain="*.taobao.net" />    
  5. <allow-access-from domain="*.taobaocdn.com" />    
  6. <allow-access-from domain="*.tbcdn.cn" />    
  7. <allow-access-from domain="*.allyes.com" />    
  8. </cross-domain-policy>   

sql注入安全問題

概念:所謂SQL注入,就是經過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。

危害:

1. 查詢數據庫中敏感信息。

2. 繞過認證。

3. 添加、刪除、修改服務器數據。

4. 拒絕服務。?id=(BENCHMARK(100000000, MD5(RAND()));

例子:

[sql]  view plain  copy
 
  在CODE上查看代碼片派生到個人代碼片
  1. $sql = "SELECT name FROM users WHERE id = '". $_GET['id'] . "'";  

當ID值爲:1’ or 1=’1  SQL語句(已測試能夠注入):

[sql]  view plain  copy
 
  在CODE上查看代碼片派生到個人代碼片
  1. SELECT name FROM users WHERE id = ‘1’ or 1=’1 ‘  

說明:1=1的時候,條件語句WHEREOR以前的不起做用。 ‘的做用是組裝SQL語句。

解決方法:

SQL組裝的時候,對外部變量以及全部變量都進行過濾:

PHPWIND中,能夠用sqlEscape、sqlImplode、sqlSingle、sqlMulti等函數過濾組裝。過濾主要是一些’單引號這些能夠破壞SQL組裝的數據。

[php]  view plain  copy
 
  在CODE上查看代碼片派生到個人代碼片
  1. /** 
  2.  * SQL組裝-私有SQL過濾 
  3.  * @param  string $val 過濾的值 
  4.  * @param  int    $iskey 0-過濾value值,1-過濾字段 
  5.  * @return string 
  6.  */  
  7. private function build_escape_single($val, $iskey = 0) {  
  8.     if ($iskey === 0) {  
  9.         if (is_numeric($val)) {  
  10.             return " '" . $val . "' ";  
  11.         } else {  
  12.             return " '" . addslashes(stripslashes($val)) . "' ";  
  13.         }  
  14.     } else {  
  15.         $val = str_replace(array('`', ' '), '', $val);  
  16.         return ' `'.addslashes(stripslashes($val)).'` ';  
  17.     }  
  18. }  

 

XML注入安全問題

概念:和SQL注入原理同樣,XML是存儲數據的地方,若是在查詢或修改時,若是沒有作轉義,直接輸入或輸出數據,都將致使XML注入漏洞。攻擊者能夠修改XML數據格式,增長新的XML節點,對數據處理流程產生影響。

危害:

1. 攻擊者能夠新增XML節點

2. 破壞原來的XML結構,影響業務流程,甚至產生嚴重的錯誤。

例子:

[php]  view plain  copy
 
  在CODE上查看代碼片派生到個人代碼片
  1. $xml = "<USER role=guest><name>「 . $_GET[‘name’] . "</name><email>「 . $_GET[‘email’] . "</email></USER>";  

須要獲得的XML結構:

[php]  view plain  copy
 
  在CODE上查看代碼片派生到個人代碼片
  1. <?xml version="1.0" encoding="UTF-8"?>     
  2. <USER role=guest>    
  3. <name>user1</name>    
  4. <email>user1@a.com</email>    
  5. </USER>   

惡意代碼:

[php]  view plain  copy
 
  在CODE上查看代碼片派生到個人代碼片
  1. user1@a.com</email></USER><USER role=admin><name>test</name><email>user2@a.com   

意外的XML文檔:

[php]  view plain  copy
 
  在CODE上查看代碼片派生到個人代碼片
  1. <?xml version="1.0" encoding="UTF-8"?>    
  2. <USER role=guest>    
  3. <name>user1</name>    
  4. <email>user1@a.com</email>    
  5. </USER>    
  6. <USER role=admin>    
  7. <name>test</name>    
  8. <email>user2@a.com</email>    
  9. </USER>   

解決方法:

1. 對php處理XML文檔的時候,進行標籤過濾

2. 儘可能減小直接被外部訪問到xml文檔,能夠採用文件名用散列方法等。

 

url跳轉漏洞

概念:Web應用程序接收到用戶提交的URL參數後,沒有對參數作」可信任URL」的驗證,就向用戶瀏覽器返回跳轉到該URL的指令。

危害:釣魚網站

例子:

http://m.yahoo.cn/log.php?c=web&u=http://www.163.com

解決方法:

對跳轉的php函數進行進一步優化,使頁面跳轉能夠在可信任的範圍內。 例如能夠有跳轉域名白名單方法,這個訪問各大公司使用比較多

 

文件系統跨越漏洞

概念:對文件目錄參數沒有進行過濾,致使惡意用戶能夠經過在參數中輸入一些執行命令,或者跨越訪問的行爲,來超出用戶的訪問權限。

例子:經過一個或多個../跨越目錄限制

[php]  view plain  copy
 
  在CODE上查看代碼片派生到個人代碼片
  1. $fp = fopen("image/{$_GET['filename']}", 'r');  

Getfile?filename=../../../../etc/passwd

解決方法:

1. 對文本操做的時候必定要謹慎,不可信任

2. 嚴格使用phpwind中安全類庫 escapePath函數

 

系統命令漏洞

概念:用戶提交的參數用於執行系統命令的參數。

解決:

1. 謹慎使用系統命令,對使用系統命令的地方須要進行安全評審

2. 對命令語句進行嚴格過濾

 

文件上傳漏洞

概念:Web應用程序在處理用戶上傳的文件時,沒有判斷文件的擴展名是否在容許的範圍內,或者沒檢測文件內容的合法性,就把文件保存在服務器上,甚至上傳腳本木馬到web服務器上,直接控制web服務器。

狀況:

1. 未限制擴展名

2. 未檢查文件內容

3. 病毒文件

解決方法:

1. 使用安全的,可信任的上傳組件。

2. 檢查文件擴展名,保證文件的類型正確。

3. 檢查文件內容,保證用戶不僞造文件類型。

 

任意文件下載漏洞 

解決方法:

1. Apache虛擬目錄指向

2. Java/PHP讀取文件

 

權限控制漏洞 

概念:屬於業務邏輯上的安全管理。

訪問控制:

1. 水平訪問:Web應用程序接收到用戶請求,修改某條數據時,沒有判斷數據的所屬人,或判斷數據所屬人時,從用戶提交的request參數(用戶可控數據)中,獲取了數據所屬人id,致使惡意攻擊者能夠經過變換數據ID,或變換所屬人id,修改不屬於本身的數據。

2. 垂直訪問:因爲web應用程序沒有作權限控制,或僅僅在菜單上作了權限控制,致使的惡意用戶只要猜想其餘管理頁面的URL,就能夠訪問或控制其餘角色擁有的數據或頁面,達到權限提高目的。

存在狀況:

1. URL級別的。(例如論壇須要操做評分的時候,有一個提交的URL地址,該地址提交過去,若是不作權限判斷,那麼惡意用戶就能夠隨意的拿這個URL地址來進行惡意行爲)

2. 菜單級別。(會員中心或者後臺管理中心,會有菜單,管理員能夠看到多個功能,普通管理員只能看到一部分功能。可是若是你對管理員操做的功能區不作權限判斷,那麼普通管理員只要猜想或者獲取管理區的URL,就能夠進行管理員操做了)

危害:

1. 屬於業務邏輯的漏洞,這些危害性是巨大的,可讓普通用戶就可能獲取管理員的權限,對網站進行惡意破壞或者作非法行爲。

解決方案:

1. 項目先期,作一份詳細的權限規劃文檔。

2. 在開發中嚴格按照權限文檔的要求去作權限。

3. 後期測試須要覆蓋權限這一塊功能區。

4. 程序員須要常常注意這些方面的要求。

 

cookie安全設置

解決:

cookie httponly flag : 在用到用戶名登錄密碼之類的安全性比較高的cookie的時候,能夠在cookie中設置httponly屬性,該屬性只容許php等訪問cookie,而不容許js訪問。

cookie secure flag : 在涉及到https這樣的狀況,須要對cookie加密傳輸,那麼能夠設置這個屬性

 

session安全

1. SESSION是保存在服務器端的,具備比COOKIE必定的安全性。

2. 使用COOKIE的時候,若是長時間沒有動做,能夠設置一個時間值,來對COOKIE進行過時。

3. 儘可能讓用戶每次的cookie值都是不一樣的,這樣能夠保證cookie被盜取也不能長期使用的問題。

 

網絡請求數據都須要判斷

 

HTTPS

敏感信息,請走HTTPS

出處:http://blog.csdn.net/erjian666/article/details/53289763

相關文章
相關標籤/搜索