通过perpare()方法和检查字段防sql注入.
$pdo=new PDO('mysql:host=localhost;dbname=scms', 'root' );
$_POST=array('title'=>23,'content'=>'kmm');
keys=arraykeys(_POST);
/**
* $filetarr数组用于规定只可以写入的字段
*/
$filetarr=array('title','content');
$filtre=true;
foreach (keysasvalue){
if(in_array(value,filetarr,true)){
}else{
//var_dump($value);
$filtre=false;
break;
}
}
if($filtre){
fields=implode(′,′,keys);
fieldszwh=′:′.implode(′,:′,keys);
sql="insert into article({fields}) values({$fieldszwh})";
pdostatement=pdo->prepare($sql);
pdostatement−>execute(_POST);
var_dump($pdostatement->errorInfo());
}else{
echo '非法字段';
}
|
2.万能条件语句,同样通过字段限制防注入
$pdo=new PDO('mysql:host=localhost;dbname=scms', 'root' );
$_POST=array('title'=>23,'content'=>'km');
keys=arraykeys(_POST);
/**
* $filetarr数组用于规定只可以写入的字段
*/
$filetarr=array('title','content');
$filtre=true;
$where='';
/**
*$wherearr数组用来根据字段指定查询条件,例如大于,等于,like
*/
$wherearr=array('title'=>'like','content'=>'>%');
foreach (keysasvalue){
if(in_array(value,filetarr,true)){
if(wherearr[value]==='between'){
if(count(explode(',', POST[value]))===1){
break;
}
where.=′and′.value.' between '.":{value}left".' and '.":{value}right ";
POST[value]=explode(',', POST[value]);
POST[value.'left']=POST[value][0];
POST[value.'right']=POST[value][1];
unset(POST[value]);
}else{
where.=′and′.value.' '.wherearr[value].' '.":{$value} ";
}
}else{
//var_dump($value);
$filtre=false;
break;
}
}
/**
*
*如果用or连接条件语句,截取前面两个字符
*/
where=substr(where,3);
if($filtre){
fields=implode(′,′,keys);
fieldszwh=′:′.implode(′,:′,keys);
sql="select * from article where {where}";
var_dump($sql);
pdostatement=pdo->prepare($sql);
pdostatement−>execute(_POST);
re=pdostatement->fetchAll();
var_dump($pdostatement->errorInfo());
var_dump($_POST);
var_dump($re);
}else{
echo '非法字段';
}
|
最新内容请见作者的GitHub页:http://qaseven.github.io/