App下載
話題 首頁 > PHP 教程 > PHP 教程話題列表 > 詳情

php在編程的時(shí)候,要注意哪些安全問題?

精華
路飛 2015-11-28 07:11:58 瀏覽(7381) 回復(fù)(7) 贊(0)
有哪些安全問題需要注意?
php

回答(7)

珍珍阿姨 2015-12-15

//幾個(gè)有用的php字符串處理函數(shù)

1

//防止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 _*_的情況_


(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)镸YSQL默認(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);}


}
865460609 2017-03-01

所有表單,所有接收數(shù)據(jù),傳遞數(shù)據(jù)的地方,都存在安全問題,都需要過濾和驗(yàn)證,

還要sql注入,

圖片盜鏈,

等等

PHP群157531900 2018-01-09

把握整站的結(jié)構(gòu),避免泄露站點(diǎn)敏感目錄

使用預(yù)編譯語句,避免sql注入

預(yù)防XSS代碼,如果不需要使用cookie就不使用

限制用戶權(quán)限,預(yù)防CSRF

嚴(yán)格控制上傳文件類型

加密混淆javascript代碼,提高攻擊門檻

使用更高級(jí)的hash算法保存數(shù)據(jù)庫中重要信息

Silence廣 2018-01-20

一樓粘貼那么多代碼累嗎?

注意初始化你的變量

一筆荒蕪 2018-05-31

快來解決啦!快來!快來! 快來 快來

1144100656 2018-05-31

剛學(xué)習(xí)程序,過來學(xué)習(xí)學(xué)習(xí)!!!!...

1152696398 2018-05-31

我也不清楚,坐等大神,火鉗劉明!??!

要回復(fù),請(qǐng)先登錄 或者注冊(cè)