国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP程序漏洞產生的原因和防范方法

2024-05-04 22:53:38
字體:
來源:轉載
供稿:網友
    濫用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
{
 $includepage=$_get["includepage"];
 foreach($pagelist as $prepage)
 {
  if($includepage==$prepage) //檢查文件是否在允許列表中
  {
   include($prepage);
   $checkfind=true;
   break;
  }
 }
 if($checkfind==true){ unset($checkfind); }
 else{ die("無效引用頁!"); }
}


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

  小提示:有此問題的函數還有:require(),require_once(),include_once(),readfile()等,在編寫的時候也要注意。

  未對輸入變量進行過濾

  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)
{
 $badwords=array("操你媽","fuck"); //詞匯過濾列表
 $text=rtrim($text);
 foreach($badwords as $badword) //這里進行詞匯的過濾
 {
  if(stristr($text,$badword)==true){ die("錯誤:你提交的內容含有敏感字眼,請不要提交敏感內容。"); }
 }
 $text=htmlspecialchars($text); //html替換
 //這兩行把回車替換為

 $text=str_replace("/r"," ",$text);
 $text=str_replace("/n","",$text);
 $text=str_replace("&line;","│",$text); //文本數據庫分隔符"&line;"替換為全角的"│"
 $text=preg_replace("http://s{ 2 }/"," ",$text); //空格替換
 $text=preg_replace("http://t/"," ",$text); //還是空格替換
 if(get_magic_quotes_gpc()){ $text=stripslashes($text); } //如果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);


  經過一番替換和過濾后,你就可以安全地把數據寫入文本或數據庫了。

國內最大的酷站演示中心!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大余县| 长丰县| 高邮市| 莆田市| 余庆县| 商丘市| 梁山县| 溧水县| 绥化市| 涡阳县| 仲巴县| 巢湖市| 德兴市| 仪陇县| 保山市| 津市市| 灌南县| 平原县| 炎陵县| 乌拉特中旗| 淮南市| 宣威市| 色达县| 枣阳市| 东明县| 雷山县| 南康市| 柏乡县| 历史| 和平县| 阳原县| 湛江市| 大兴区| 鹿邑县| 广西| 北票市| 米易县| 祁东县| 文登市| 甘泉县| 新安县|