PHP常见漏洞及解决方法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
管理员判断不完全(1) 管理员判断不完全(1)
漏洞原因
我们用PHP写脚本,通常要涉及管理员的权限 问题. 而一些脚本对管理员权限作出"是"判断, 而往往忽略了"否"判断.
范例
$cookiesign="admincookiesign"; $adminsign=$_COOKIE["sign"]; If($adminsign==$cookiesign) { $admin=true; } if($admin){ echo ""; }
未对输入变量进行过滤(1) 未对输入变量进行过滤(1)
漏洞原因
范例
存在SQL注入漏洞,档案储存问题 $id=$_GET["id"]; $query="SELECT * FROM my_table where id='".$id."'"; $result=mysql_query($query); ------------------------------------------------------- $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);
POST漏洞 POST漏洞(1) 漏洞(1)
漏洞原因
在一些留言本和论坛程序中,更要严格检查页 面的方式和提交的时间间隔.以防止灌水式发 帖和外部提交.
范例
... $text1=flt_tags($text1); $text2=flt_tags($text2); $text3=flt_tags($text3); $fd=fopen("data.php","a"); fwrite($fd,"\r\n$text1&line;$text2&line;$text3"); fclose($fd); ...
管理员判断不完全(1) 管理员判断不完全(1)
漏洞解决 范例
在脚本中加入对管理员的"否"判断即可.
$cookiesign="admincookiesign"; $adminsign=$_COOKIE["sign"]; if($adminsign==$cookiesign) { define(admin,true); } else { define(admin,false); } if(admin){ echo ""; }
未对输入变量进行过滤(1) 未对输入变量进行过滤(1)
漏洞解决 范例
严格对全部提交的变量进行过滤. function flt_tags($text) { $badwords=array("",""); $badwords=array("",""); $text=rtrim($text); foreach($badwords as $badword) foreach($badwords as $badword) { if(stristr($text,$badword)==true){ die(""); } }
结论
AND Q&A
�
滥用include 滥用include (1)
漏洞解决 范例
先判断页面是否存在再进行Include.
$pagelist=array("test1.php","test2.php","test3.php"); if(isset($_GET["includepage"])) { $includepage=$_GET["includepage"]; foreach($pagelist as $prepage) { if($includepage==$prepage) { include($prepage); $checkfind=true; break; } } if($checkfind==true){ unset($checkfind); } else{ die(""); } }
POST漏洞 POST漏洞(2) 漏洞(2)
漏洞解决
$_SESSION["allowgbookpost"]=time(); //登记填写时的时间 <BR>在接受留言数据并保存的页面中我们在进行数据处理 前我们也用Session进行以下处理: if(strtoupper($_SERVER["REQUEST_METHOD"])!="POST"){ die("错误:请勿在外部提交."); } //检查页面获得方法是否 为POST POST if(!isset($_SESSION["allowgbookpost"]) or (time()$_SESSION["allowgbookpost"] < 10)){ die("错误:请勿在外 部提交."); } //检查留言填写时的时间 if(isset($_SESSION["gbookposttime"]) and (time()$_SESSION["gbookposttime"] < 120)){ die("错误:两次提交 留言的间隔不得少于2分钟.") ; } //检查留言间隔 unset($_SESSION["allowgbookpost"]); //注入allowgbookpost 变量以防止一次写入填写页面多次进行提交 $_SESSION["gbookposttime"]=time(); //登记发送留言的时 间,防止灌水或恶意攻击
$text=htmlspecialchars($text); //HTML替换 $text=str_replace("\r"," ",$text); $text=str_replace("\n","",$text); $text=str_replace("&line;","│",$text); $text=preg_replace("/\s{ 2 }/"," ",$text); $text=preg_replace("/\t/"," ",$text); if(get_magic_quotes_gpc()){ $text=stripslashes($text); } 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) 错误路径泄露(1)
漏洞原因 PHP遇到错误时,就会给出出错脚本的位置, 行数和原因,例如: Notice: Use of undefined constant test assumed 'test' in D:\interpub\bigfly\test.php on line 3 Notice: Use of undefined constant test - assumed 'test' in D:\interpub\bigfly\test.php on line 3
错误路径泄露(2) 错误路径泄露(2)
漏洞解决 display_errors设置为Off, 利用set_error_handler()来解决 范例 //自定义的错误处理函数一定要有这4个输 入变量$errno,$errstr,$errfile,$errline,否则 无效.
function my_error_handler($errno,$errstr,$errfile,$errline) { if(!admin) { $errfile=str_replace(getcwd(),"",$errfile); $errstr=str_replace(getcwd(),"",$errstr); } switch($errno) { case E_ERROR: case E_ERROR: echo "ERROR: [ID $errno] $errstr (Line: $eຫໍສະໝຸດ Baidurline of $errfile) echo "ERROR: [ID $errno] $errstr (Line: $errline of $errfile) \n"; echo ""; exit; break; case E_WARNING: case E_WARNING: echo "WARNING: [ID $errno] $errstr (Line: $errline of $errfile) echo "WARNING: [ID $errno] $errstr (Line: $errline of $errfile) \n"; break; default: break; } } //把错误处理设置为my_error_handler函数 set_error_handler("my_error_handler"); …
PHP常见漏洞及解决方法 PHP常见漏洞及解决方法
滥用include 滥用include (1)
漏洞原因 有很多PHP脚本直接把某输入变量作为 Include的参数,造成任意引用脚本,绝对路 径泄露等漏洞.
范例
... $includepage=$_GET["includepage"]; include($includepage); ...