PHP程式漏洞產生的原因和防範方法

2021-06-22 13:46:55 字數 2331 閱讀 7296

濫用include 

1.漏洞原因: 

include是編寫php**中最常用的函式,並且支援相對路徑。有很多php指令碼直接把某輸入變數作為include的引數,造成任意引用指令碼、絕對路徑洩露等漏洞。看以下**: 

... 

$includepage=$_get["includepage"]; 

include($includepage); 

...很明顯,我們只需要提交不同的includepage變數就可以獲得想要的頁面。如果提交乙個不存在的頁面,就可以使php指令碼發生錯誤而洩露實際絕對路徑(這個問題的解決辦法在下面的文章有說明)。

2.漏洞解決: 

這個漏洞的解決很簡單,就是先判斷頁面是否存在再進行include。或者更嚴格地,使用陣列對可include的檔案作出規定。看以下**: 

$pagelist=array("test1.php","test2.php","test3.php"); //這裡規定可進行include的檔案 

if(isset($_get["includepage"])) //判斷是否有$includepage  } 

if($checkfind==true) 

else 

}這樣就可以很好地解決問題了。 

未對輸入變數進行過濾

1.漏洞原因: 

這個漏洞早在asp中出現過,當時造成的注入漏洞不計其數。但由於php在當時的影響力較小,所以沒有太多的人能夠注意這點。對於php來說,這個漏洞的影響性比asp更大,因為有比較多的php指令碼使用到文字型資料庫。當然也存在sql語句的注入問題。舉個比較經典的例子,首先是資料庫的: 

$id=$_get["id"]; 

$query="select * from my_table where id='".$id."'"; //很經典的sql注入漏洞 

$result=mysql_query($query);

這裡很明顯我們可以用注入來獲得資料庫的其它內容了。這裡就不再詳細敘述,和asp注入一樣的,大家可以看看以前的黑防。然後我們看文字資料庫的問題: 

$text1=$_post["text1"]; 

$text2=$_post["text2"]; 

$text3=$_post["text3"]; 

$fd=fopen("test.php","a"); 

fwrite($fd,"\r\n$text1&line;$text2&line;$text3"); 

fclose($fd);

文字的漏洞可以說是更加嚴重。倘若我們的提交的變數中插入一段很小的php**,就可以另這個文字資料庫test.php變成php後門。甚至插入上傳**,讓我們可以上傳乙個完善的php後門。接著提公升許可權,伺服器就是你的了。 

2.漏洞解決: 

這個漏洞的解決方法其實很簡單,就是嚴格對全部提交的變數進行過濾。對一些敏感的字元進行替換。我們可以借助php提供的htmlspecialchars()函式來替換html的內容。這裡給出一段例子: 

//構造過濾函式 

function flt_tags($text)  } 

$text=htmlspecialchars($text); //html替換 

//這兩行把回車替換為 

$text=str_replace("\r"," ",$text); 

$text=str_replace("\n","",$text); 

$text=str_replace("&line;","│",$text); //文字資料庫分隔符"&line;"替換為全形的"│" 

$text=preg_replace("/\s/"," ",$text); //空格替換 

$text=preg_replace("/\t/"," ",$text); //還是空格替換 

if(get_magic_quotes_gpc()) //如果magic_quotes開啟,則進行\'的替換 

return $text; 

} $text1=$_post["text1"]; 

$text2=$_post["text2"]; 

$text3=$_post["text3"]; 

//過濾全部輸入 

$text1=flt_tags($text1); 

$text2=flt_tags($text2); 

$text3=flt_tags($text3); 

$fd=fopen("test.php","a"); 

fwrite($fd,"\r\n$text1&line;$text2&line;$text3"); 

fclose($fd);

經過一番替換和過濾後,你就可以安全地把資料寫入文字或資料庫了。 

死鎖的產生原因和條件

1 因為系統資源不足。2 程序執行推進的順序不合適。3 資源分配不當等。如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。其次,程序執行推進順序與速度不同,也可能產生死鎖。1 互斥條件 乙個資源每次只能被乙個程序使用。2 請求與保持條件 乙個...

殭屍程序的產生原因和避免方法

殭屍程序的產生 當乙個程序建立了乙個子程序時,他們的執行時非同步的。即父程序無法預知子程序會在什麼時候結束,那麼如果父程序很繁忙來不及wait 子程序時,那麼當子程序結束時,會不會丟失子程序的結束時的狀態資訊呢?處於這種考慮unix提供了一種機制可以保證只要父程序想知道子程序結束時的資訊,它就可以得...

野指標產生的原因和避免方法

struct student stu,pstu intmain void 這是很多人都容易犯的錯誤 定義了結構體變數stu,但結構體內部的char name在定義結構體時只是為其分配了4位元組的記憶體,沒有指向乙個合法的位址,這時其指標指向的區域只是一些亂碼,有事還沒有訪問許可權。這就是我們通常所說...