把握整站的結(jié)構(gòu),避免泄露站點(diǎn)敏感目錄,使用預(yù)編譯語句,避免sql注入,預(yù)防XSS代碼,如果不需要使用cookie就不使用。
限制用戶權(quán)限,預(yù)防CSRF,嚴(yán)格控制上傳文件類型,加密混淆javascript代碼,提高攻擊門檻,使用更高級(jí)的hash算法保存數(shù)據(jù)庫中重要信息。
//幾個(gè)有用的php字符串處理函數(shù)
1
//防止sql注入
在PHP編碼的時(shí)候,一些比較基本的安全問題:
注意初始化你的變量
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 _*_的情況_
(2)處理掉a.php?id=1asdfasdfasdf
(3)去除' ', ' % ',這些字符特殊意義字符
(4)對(duì)編輯內(nèi)容進(jìn)行過濾和轉(zhuǎn)換
綜合來說即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ù)庫中。
由于mysql_real_escape_string 需要MySQL 數(shù)據(jù)庫連接,因此,在調(diào)用mysql_real_escape_string 之前,必須連接上MySQL 數(shù)據(jù)庫。
PHP:
1
調(diào)用方法PHP:
1
經(jīng)過清潔的數(shù)據(jù)可以直接插入數(shù)據(jù)庫。
注意!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ù)庫連接,因此,在調(diào)用mysql_real_escape_string 之前,必須連接上MySQL 數(shù)據(jù)庫。
在知道數(shù)據(jù)類型為字符串時(shí),我們可以在清潔數(shù)據(jù)的同時(shí)限制字符串長度。此方法來自David Lane, Hugh E. Williams《Web Database Application with PHP and MySQL 》(O'Reilly,May 2004)
PHP:
1
調(diào)用方法:PHP:
1
將$_POST 數(shù)組中的'username' 清潔并截取前20位字符。
//關(guān)于sql注入
//用戶發(fā)布的html,過濾危險(xiǎn)代碼function uh($str){$farr = array("/s+/", //過濾多余的空白"/]*?)>/isU", //過濾dbHost = $Host;$this->dbUID = $UID;$this->dbPWD = $Pwd;$this->dbName = $Name;$this->dbEncode = $Encode;$this->IsOp=false;}
//打開數(shù)據(jù)庫 Open() { if (!$this->dbConn) { @$this->dbConn = mysql_connect($this->dbHost, $this->dbUID, $this->dbPWD) or die("數(shù)據(jù)庫連接錯(cuò)誤!..."); } mysql_query("SET NAMES '" . $this->dbEncode . "'");```
mysql_select_db($this->dbName);$this->IsOp=true;}//關(guān)閉數(shù)據(jù)庫Close(){if ($this->dbConn&&$this->IsOp){mysql_close($this->dbConn);$this->IsOp=false;}}htmlrsp($str){$str=str_replace("",$str);return $str;}//過濾XSS危險(xiǎn)腳本RemoveXSS($val) {
if(strpos($val,"$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,"/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)?/span>MYSQL默認(rèn)立即執(zhí)行mysql_query("BEGIN");//開始事務(wù)定義for($i=0;$idbConn)){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"||gettype($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);elsereturn 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"||gettype($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);}
}
文章內(nèi)容來源于網(wǎng)絡(luò),侵刪