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

caoyeshu 2015-11-28 07:11:58 浏览(2152) 回答(1)

有哪些安全问题需要注意?

php

回答(1)

wangjue 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); 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"||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); }

}

要回答问题,请先登录 或者注册
右侧导航
二维码
客服
二维码