话题 首页 > PHP 教程 > PHP 教程话题列表 > 详情

php在编程的时候,要注意哪些安全问题?

精华
路飞 2015-11-28 07:11:58 浏览(7316) 回复(7) 赞(0)
有哪些安全问题需要注意?
php

回答(7)

珍珍阿姨 2015-12-15

//几个有用的php字符串处理函数

1

//防止sql注入

在PHP编码的时候,一些比较基本的安全问题

  1. 注意初始化你的变量

2.防止SQL Injection (sql注射)

   我们知道Web上提交数据有两种方式,一种是get、一种是post,那么很多常见的sql注射就是从get方式入手的,而且注射的语句里面一定是包含一些sql语句的,因为没有sql语句,那么如何进行,sql语句有四大句:select 、update、delete、insert,那么我们如果在我们提交的数据中进行过滤是不是能够避免这些问题呢?


   于是我们使用正则就构建如下函数:```


(1)把select,insert,update,delete, union, into, load_file, outfile /_, ./ , ../ , ' 等等危险的参数字符串全部过滤掉,处理掉' select_ from _*_的情况_


(2)处理掉a.php?id=1asdfasdfasdf


(3)去除' ', ' % ',这些字符特殊意义字符


(4)对编辑内容进行过滤和转换


综合来说即2个,1. 初始化你的变量 2. 一定记得要过滤你的变量


//服务器端用mysql_real_escape_string 清洁客户端数据在服务器端清洁客户端数据是每个程序员经常要做的工作,虽然我们通常会在客户端添加Javascript 验证,但是,恶意用户很容易自己构造FORM 提交数据以绕过客户端验证,另外,在客户端禁用Javascript 时验证同样不能起到作用。因此,服务器端清洁数据必不可少,本文介绍的是用mysql_real_escape_string 清洁数据的方法,经过清洁的数据可以直接插入到数据库中。


由于mysql_real_escape_string 需要MySQL 数据库连接,因此,在调用mysql_real_escape_string 之前,必须连接上MySQL 数据库。


PHP:


1 


调用方法PHP:


1 


经过清洁的数据可以直接插入数据库。


注意!mysql_real_escape_string 必须在(PHP 4 >= 4.3.0, PHP 5)的情况下才能使用。否则只能用mysql_escape_string ,两者的区别是:


mysql_real_escape_string 考虑到连接的当前字符集,而mysql_escape_string 不考虑。


由于mysql_real_escape_string 需要MySQL 数据库连接,因此,在调用mysql_real_escape_string 之前,必须连接上MySQL 数据库。


在知道数据类型为字符串时,我们可以在清洁数据的同时限制字符串长度。此方法来自David Lane, Hugh E. Williams《Web Database Application with PHP and MySQL 》(O'Reilly,May 2004)


PHP:


1 


调用方法:PHP:


1 


将$_POST 数组中的'username' 清洁并截取前20位字符。


//关于sql注入


//用户发布的html,过滤危险代码function uh($str){$farr = array("/s+/", //过滤多余的空白"/]*?)>/isU", //过滤dbHost = $Host;$this->dbUID = $UID;$this->dbPWD = $Pwd;$this->dbName = $Name;$this->dbEncode = $Encode;$this->IsOp=false;}

//打开数据库 Open() { if (!$this->dbConn) { @$this->dbConn = mysql_connect($this->dbHost, $this->dbUID, $this->dbPWD) or die("数据库连接错误!..."); } mysql_query("SET NAMES '" . $this->dbEncode . "'");```

mysql_select_db($this->dbName);$this->IsOp=true;}//关闭数据库Close(){if ($this->dbConn&&$this->IsOp){mysql_close($this->dbConn);$this->IsOp=false;}}htmlrsp($str){$str=str_replace("",$str);return $str;}//过滤XSS危险脚本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;}//执行SQL语句ExeSql($sql){mysql_query($sql, $this->dbConn) or die("执行SQL语句错误...".$sql);}HGexecute($SqlArr){mysql_query("SET AUTOCOMMIT=0");//设置为不自动提交,因为MYSQL默认立即执行mysql_query("BEGIN");//开始事务定义for($i=0;$idbConn)){mysql_query("ROLLBACK");//判断执行失败回滚mysql_query("SET AUTOCOMMIT=1");return false;}


}
mysql_query("SET AUTOCOMMIT=1");
   mysql_query("COMMIT");//执行事务
return true;```


}


//取SQL数据GetData($sql){$result = mysql_query($sql, $this->dbConn) or die("查询SQL语句错误...".$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("执行SQL语句错误...".$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("执行SQL语句错误...".$Sql);}Del($Tb,$Id){$Id=intval($Id);$Sql="delete from ".$Tb." where id=".$Id;mysql_query($Sql, $this->dbConn) or die("执行SQL语句错误...".$Sql);}


}
865460609 2017-03-01

所有表单,所有接收数据,传递数据的地方,都存在安全问题,都需要过滤和验证,

还要sql注入,

图片盗链,

等等

PHP群157531900 2018-01-09

把握整站的结构,避免泄露站点敏感目录

使用预编译语句,避免sql注入

预防XSS代码,如果不需要使用cookie就不使用

限制用户权限,预防CSRF

严格控制上传文件类型

加密混淆javascript代码,提高攻击门槛

使用更高级的hash算法保存数据库中重要信息

Silence广 2018-01-20

一楼粘贴那么多代码累吗?

注意初始化你的变量

一笔荒芜 2018-05-31

快来解决啦!快来!快来! 快来 快来

1144100656 2018-05-31

刚学习程序,过来学习学习!!!!...

1152696398 2018-05-31

我也不清楚,坐等大神,火钳刘明!!!

要回复,请先登录 或者注册