|
<?php nl2br(); // to addslashes(); stripslashes(); //對(duì)數(shù)據(jù)庫(kù)操作時(shí),轉(zhuǎn)義特殊字符 chop(); //除去字符串右邊空格 trim(); //除去字符串中所有空格 ltrim(); //除去字符串左邊空格 htmlspecialchars(); //轉(zhuǎn)換'$','"','<','>'為相應(yīng)的html實(shí)體 htmlentities(); //轉(zhuǎn)換所有html標(biāo)記為相應(yīng)的html實(shí)體 //兩個(gè)函數(shù)在格式化帶有英文字符的html代碼的時(shí)候基本沒啥問題,但是htmlentities對(duì)中文字符也不放過,這樣得出來的結(jié)果是中文字符部分變?yōu)橐欢褋y碼。 array explode(string separator, string str); //分割字符串 string implode(string separator, array arr); //連接字符串 strtoupper(); strtolower(); //轉(zhuǎn)換大小寫 ucfirst(); //只轉(zhuǎn)換第一個(gè)字符為大寫 ucwords(); //轉(zhuǎn)換每個(gè)words的第一個(gè)字母為大寫 mysql_real_escape_string()//本函數(shù)將unescaped_string 中的特殊字符轉(zhuǎn)義,并計(jì)及連接的當(dāng)前字符集,因此可以安全用于。注: () 并不轉(zhuǎn)義% 和_。 ?> //防止sql注入 在PHP編碼的時(shí)候,一些比較基本的安全問題 1. 注意初始化你的變量 2.防止SQL Injection (sql注射) 我們知道Web上提交數(shù)據(jù)有兩種方式,一種是get、一種是post,那么很多常見的sql注射就是從get方式入手的,而且注射的語句里面一定是包含一些SQL語句的,因?yàn)闆]有SQL語句,那么如何進(jìn)行,sql語 句有四大句:select 、update、delete、insert,那么我們?nèi)绻谖覀兲峤坏臄?shù)據(jù)中進(jìn)行過濾是不是能夠避免這些問題呢? 于是我們使用正則就構(gòu)建如下函數(shù): (1)把select,insert,update,delete, union, into, load_file, outfile /*, ./ , ../ , ' 等等危險(xiǎn)的參數(shù)字符串全部過濾掉,處理掉' select * from ***的情況 <?php /* 函數(shù)名稱:inject_check() 函數(shù)作用:檢測(cè)提交的值是不是含有SQL注射的字符,防止注射,保護(hù)服務(wù)器安全 參數(shù):$sql_str: 提交的變量 返回值:返回檢測(cè)結(jié)果,ture or false 函數(shù)作者:heiyeluren */ function inject_check($sql_str) { return eregi('select|insert|update|delete|'|/*|*|../|./|union|into|loa d_file|outfile', $sql_str); // 進(jìn)行過濾 } ?> (2)處理掉a.php?id=1asdfasdfasdf <?php /* 函數(shù)名稱:verify_id() 函數(shù)作用:校驗(yàn)提交的ID類值是否合法 參數(shù):$id: 提交的ID值 返回值:返回處理后的ID 函數(shù)作者:heiyeluren */ function verify_id($id=null) { if (!$id) { exit('沒有提交參數(shù)!'); } // 是否為空判斷 elseif (inject_check($id)) { exit('提交的參數(shù)非法!'); } // 注射判斷 elseif (!is_numeric($id)) { exit('提交的參數(shù)非法!'); } // 數(shù)字判斷 $id = intval($id); // 整型化 return $id; } ?> (3)去除' _ ', ' % ',這些字符特殊意義字符 <?php /* 函數(shù)名稱:str_check() 函數(shù)作用:對(duì)提交的字符串進(jìn)行過濾 參數(shù):$var: 要處理的字符串 返回值:返回過濾后的字符串 函數(shù)作者:heiyeluren */ function str_check( $str ) { if (!get_magic_quotes_gpc()) // 判斷magic_quotes_gpc是否打開 { $str = addslashes($str); // 進(jìn)行過濾 } $str = str_replace("_", "\_", $str); // 把'_'過濾掉 $str = str_replace("%", "\%", $str); // 把' % '過濾掉 return $str; } ?> (4)對(duì)編輯內(nèi)容進(jìn)行過濾和轉(zhuǎn)換 <?php /* 函數(shù)名稱:post_check() 函數(shù)作用:對(duì)提交的編輯內(nèi)容進(jìn)行處理 參數(shù):$post: 要提交的內(nèi)容 返回值:$post: 返回過濾后的內(nèi)容 函數(shù)作者:heiyeluren */ function post_check($post) { if (!get_magic_quotes_gpc()) // 判斷magic_quotes_gpc是否為打開 { $post = addslashes($post); // 進(jìn)行magic_quotes_gpc沒有打開的情況對(duì)提交數(shù)據(jù)的過濾 } $post = str_replace("_", "\_", $post); // 把'_'過濾掉 $post = str_replace("%", "\%", $post); // 把' % '過濾掉 $post = nl2br($post); // 回車轉(zhuǎn)換 $post= htmlspecialchars($post); // html標(biāo)記轉(zhuǎn)換 return $post; } ?> 綜合來說即2個(gè),1. 初始化你的變量 2. 一定記得要過濾你的變量 //服務(wù)器端用mysql_real_escape_string 清潔客戶端數(shù)據(jù) 在服務(wù)器端清潔客戶端數(shù)據(jù)是每個(gè)程序員經(jīng)常要做的工作,雖然我們通常會(huì)在客戶端添加Javascript 驗(yàn)證,但是,惡意用戶很容易自己構(gòu)造FORM 提交數(shù)據(jù)以繞過客戶端驗(yàn)證,另外,在客戶端禁用Javascript 時(shí)驗(yàn)證同樣不能起到作用。因此,服務(wù)器端清潔數(shù)據(jù)必不可少,本文介紹的是用mysql_real_escape_string 清潔數(shù)據(jù)的方法,經(jīng)過清潔的數(shù)據(jù)可以直接插入到數(shù)據(jù)庫(kù)中。 由于mysql_real_escape_string 需要MySQL 數(shù)據(jù)庫(kù)連接,因此,在調(diào)用mysql_real_escape_string 之前,必須連接上MySQL 數(shù)據(jù)庫(kù)。 PHP: <?php // 說明:用array_map() 調(diào)用mysql_real_escape_string 清理數(shù)組 // 整理: function mysqlClean($data) { return (is_array($data))?array_map('mysqlClean', $data):mysql_real_escape_string($data); } ?> 調(diào)用方法 PHP: <?php $conn = mysql_connect('localhost', 'user', 'pass'); $_POST = mysqlClean($_POST);
?> 經(jīng)過清潔的數(shù)據(jù)可以直接插入數(shù)據(jù)庫(kù)。 注意!mysql_real_escape_string 必須在(PHP 4 >= 4.3.0, PHP 5)的情況下才能使用。否則只能用mysql_escape_string ,兩者的區(qū)別是: mysql_real_escape_string 考慮到連接的當(dāng)前字符集,而 mysql_escape_string 不考慮。 由于mysql_real_escape_string 需要MySQL 數(shù)據(jù)庫(kù)連接,因此,在調(diào)用mysql_real_escape_string 之前,必須連接上MySQL 數(shù)據(jù)庫(kù)。 在知道數(shù)據(jù)類型為字符串時(shí),我們可以在清潔數(shù)據(jù)的同時(shí)限制字符串長(zhǎng)度。此方法來自David Lane, Hugh E. Williams《Web Database Application with PHP and MySQL 》(O'Reilly,May 2004) PHP: <?php // 說明:用mysql_real_escape_string 清潔并限制字符長(zhǎng)度 // 整理: function mysqlClean($array, $index, $maxlength) { if (isset($array[$index])) { $input = substr($array["{$index}"], 0, $maxlength); $input = mysql_real_escape_string($input); return ($input); } return NULL; } ?> 調(diào)用方法: PHP: <?php $conn = mysql_connect('localhost', 'user', 'pass'); if(isset($_POST['username'])) { $_POST['username'] = mysqlClean($_POST, 'username', 20); echo $_POST['username']; } ?> 將$_POST 數(shù)組中的'username' 清潔并截取前20位字符。 //關(guān)于sql注入 //用戶發(fā)布的html,過濾危險(xiǎn)代碼 function uh($str) { $farr = array( "/s+/", //過濾多余的空白 "/<(/?)(scripti?framestylehtmlbodytitlelinkmeta?\%)([^>]*?)>/ isU", //過濾<script 等可能引入惡意內(nèi)容或惡意改變顯示布局的代碼,如果不需要插入flash等,還可以加入<object的過濾 ); $tarr = array( " ", "<>", //如果要直接清除不安全的標(biāo)簽,這里可以留空 "", ); $str = preg_replace( $farr,$tarr,$str); return $str; } SFun{var $Fun="now()";function SFun($Date=""){if($Date!="")$this->Fun=$Date;}} MySqlDB { var $dbConn; var $dbHost; var $dbUID; var $dbPWD; var $dbName; var $dbEncode; var $IsOp; MySqlDB($Host='localhost',$UID='root',$Pwd='',$Name='',$Enc ode='utf8') { $this->dbHost = $Host; $this->dbUID = $UID; $this->dbPWD = $Pwd; $this->dbName = $Name; $this->dbEncode = $Encode; $this->IsOp=false; } //打開數(shù)據(jù)庫(kù) Open() { if (!$this->dbConn) { @$this->dbConn = mysql_connect($this->dbHost, $this->dbUID, $this->dbPWD) or die("數(shù)據(jù)庫(kù)連接錯(cuò)誤!..."); } mysql_query("SET NAMES '" . $this->dbEncode . "'"); mysql_select_db($this->dbName); $this->IsOp=true; } //關(guān)閉數(shù)據(jù)庫(kù) Close() { if ($this->dbConn&&$this->IsOp) { mysql_close($this->dbConn); $this->IsOp=false; } } htmlrsp($str) { $str=str_replace("<","<",$str); $str=str_replace(">",">",$str); return $str; } //過濾XSS危險(xiǎn)腳本 RemoveXSS($val) { if(strpos($val,"<")===false)return $val; $val = preg_replace('/([x00-x08][x0b-x0c][x0e-x20])/', '', $val); $search = 'abcdefghijklmnopqrstuvwxyz'; $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $search .= '1234567890!@#$%^&*()'; $search .= '~`";:?+/={}[]-_|''; for ($i = 0; $i < strlen($search); $i++) { $val = preg_replace('/(&#[x|X]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val); // with a ; $val = preg_replace('/(?{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // with a ; } $ra1 = array('javascript', 'vbscript', 'expression', 'applet'); $ra2 = array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload'); $ra = array_merge($ra1, $ra2); $val=preg_replace("'<script[^>]*?>.*?</script>'si","",$val); $val=preg_replace("'<style[^>]*?>.*?</style>'si","",$val); $val=preg_replace("/<(script|iframe|expression|applet|meta|xml| blink|style|frame|frameset|ilayer|layer|bgsound|title|base|link )(|[^>]+)>/i","",$val); $val=preg_replace("/</(script|iframe|expression|applet|meta|x ml|blink|style|frame|frameset|ilayer|layer|bgsound|title|base)> /i","",$val); $newval=""; $idx=0; $edx=0; do { $idx=strpos($val,"<",$edx); if($idx!==false) { if($idx>$edx){ $str=substr($val,$edx,$idx-$edx); $newval.=$this->htmlrsp($str); } $edx=strpos($val,">",$idx); if($edx!==false&&$edx>$idx) { $edx++; $tag=substr($val,$idx,$edx-$idx); $ridx=strrpos($tag,"<",1); if($ridx!==false){ $str=substr($val,$idx,$ridx); $newval.=$this->htmlrsp($str); $idx=$idx+$ridx; $tag=substr($val,$idx,$edx-$idx); } if(stripos($tag,"on")===false) {$newval.=$tag;} else { for($j=0;$j<count($ra1);$j++){if(stripos($tag,$ra1[$j])!= =false){$tag=str_ireplace($ra1[$j],"",$tag);}} for($j=0;$j<count($ra2);$j++){ if(stripos($tag,$ra2[$j])!==false){ $tag=preg_replace('/'.$ra2[$j].'="[^"]+"/i',"",$tag); $tag=preg_replace("/".$ra2[$j]."='[^']+'/i","",$tag); $tag=preg_replace("/".$ra2[$j]."=[^ ]+>/i",">",$tag); $tag=preg_replace("/".$ra2[$j]."=[^ ]+ /i","",$tag); $tag=str_ireplace($ra2[$j],"",$tag); }} $newval.=$tag; } } else { $str=substr($val,$idx); $newval.=$this->htmlrsp($str); } } else { $str=substr($val,$edx); $newval.=$this->htmlrsp($str); } }while($idx!==false&&$edx!==false); return $newval; } //執(zhí)行SQL語句 ExeSql($sql) { mysql_query($sql, $this->dbConn) or die("執(zhí)行SQL語句錯(cuò)誤...".$sql); } HGexecute($SqlArr) { mysql_query("SET AUTOCOMMIT=0");//設(shè)置為不自動(dòng)提交,因?yàn)镸YSQL默認(rèn)立即執(zhí)行 mysql_query("BEGIN");//開始事務(wù)定義 for($i=0;$i<count($SqlArr);$i++) { $sql=$SqlArr[$i]; if(!mysql_query($sql, $this->dbConn)) { mysql_query("ROLLBACK");//判斷執(zhí)行失敗回滾 mysql_query("SET AUTOCOMMIT=1"); return false; } } mysql_query("SET AUTOCOMMIT=1"); mysql_query("COMMIT");//執(zhí)行事務(wù) return true; } //取SQL數(shù)據(jù) GetData($sql) { $result = mysql_query($sql, $this->dbConn) or die("查詢 SQL語句錯(cuò)誤...".$sql); $records=array(); //while($record = mysql_fetch_array($result)) while($record = mysql_fetch_object($result)) { $records[] = $record; } return $records; } _T($str){ $str=$this->RemoveXSS($str); $str=str_replace('','',$str); $str=str_replace(''',''',$str); //$str=str_replace('"','"',$str); return $str;} GetOne($sql) { $records=$this->GetData($sql); return $records[0]; } Like($str) { $str=$this->_T($str); $str=str_replace('%','\%',$str); return $str; } //插入記錄 Add($Tb,$A,$IsId=false) { $SqlKey=array(); $SqlArr=array(); foreach ($A as $key=>$value) { $SqlKey[]="`".$key."`"; if($value===NULL) $SqlArr[]="NULL"; else if(gettype($value)=="integer"||gettype($value)=="boolean"||gett ype($value)=="double"||gettype($value)=="float") $SqlArr[]=$value; else if(gettype($value)=="object") $SqlArr[]=$value->Fun; else $SqlArr[]="'".$this->_T($value)."'"; } $Sql="INSERT INTO ".$Tb."(".join(",",$SqlKey).") VALUES (".join(",",$SqlArr).")"; mysql_query($Sql, $this->dbConn) or die("執(zhí)行SQL語句錯(cuò)誤...".$Sql); if($IsId) return mysql_insert_id($this->dbConn); else return 0; } Update($Tb,$A,$Id) { $Id=intval($Id); $SqlArr=array(); foreach ($A as $key=>$value) { if($value===NULL) $SqlArr[]="`".$key."`=NULL"; else if(gettype($value)=="integer"||gettype($value)=="boolean"||gett ype($value)=="double"||gettype($value)=="float") $SqlArr[]="`".$key."`=".$value; else if(gettype($value)=="object") $SqlArr[]="`".$key."`=".$value->Fun; else $SqlArr[]="`".$key."`='".$this->_T($value)."'"; } $Sql="update ".$Tb." set ".join(",",$SqlArr)." where id=".$Id; mysql_query($Sql, $this->dbConn) or die("執(zhí)行SQL語句錯(cuò)誤...".$Sql); } Del($Tb,$Id) { $Id=intval($Id); $Sql="delete from ".$Tb." where id=".$Id; mysql_query($Sql, $this->dbConn) or die("執(zhí)行SQL語句錯(cuò)誤...".$Sql); } }
信息發(fā)布:廣州名易軟件有限公司 http://www.jetlc.com
|