phpcms 二次开发数据过滤的技巧
参数过滤
1,针对不能直接使用pdo进行参数绑定,可以使用sprintf模拟,并使用new_addslashes来过滤,然后使用query执行拼接的sql
%% - 返回百分比符号
%b - 二进制数
%c - 依照 ASCII 值的字符
%d - 带符号十进制数
%e - 可续计数法(比如 1.5e+3)
%u - 无符号十进制数
%f - 浮点数(local settings aware)
%F - 浮点数(not local settings aware)
%o - 八进制数
%s - 字符串
%x - 十六进制数(小写字母)
%X - 十六进制数(大写字母)
addslashes() 函数在指定的预定义字符前添加反斜杠。
这些预定义字符是:
单引号 (')
双引号 (")
反斜杠 (\)
NULL
$str=array('table'=>'user','username'=>'yak','salary'=>'3000 or 1=1');
$arr=new_addslashes($str) //过滤字符
extract($arr); //输出数组变量
$sql=sprintf("update %s set salary=salary+1000 where username=%s and salary = %d",$table,$username,$salary);
使用sprintf函数模拟pdo的参数绑定。
sql语句执行
为了方便的执行sql,最好使用quer方法,并在执行后使用showmessage进行提示和跳转,最后绑定模板
public function execsql(){
$this->member_detail=ec_main::get_m('member_detail_model');
$this->member_detail->query("update ec_member_detail set me_noteic=concat(me_noteic,',','".$u."') where userid=".$memberinfo['userid']);
showmessage(L('deny_register'), HTTP_REFERER);//提示之后返回当前页
include template('member', 'me_notice');
}
输出json
前端页面使用js进行控制的话必须使用json数据,这时可以使用如下方法进行输出
public function xxx(){
$this->content_db=ec_main::get_m('content_check_model');
$datas = $this->content_db->query("select id ,catid,title from ec_techan limit 8");
$note;$i=0; //初始化变量
while($infor=mysql_fetch_assoc($datas))
{
$note["id"]=$infor['id'];
$note["catid"]=$infor['catid'];
$note["title"]=$infor['title']; //把结果放到一个一维数组里
$notes[$i++]=$note;//放到二维数组里
//$notes[$i++]=array_values($note);//如果想转换成[[],[]]格式,使用这种方法
}
mysql_free_result($datas);
echo "var arrs=".json_encode($notes).";";
echo "var xx=".json_encode($notes).";";
}
前台提交数据的方法
主要涉及安全参数的过滤,检查int ,string 是否可以插入数据库
public function tj(){
if(isset($_POST['dosubmit'])) {
$chang=array("20"=>"1号场","21"=>"2号场","22"=>"3号场");
$Ainfo=$_POST['info'];
$description=safe_replace($Ainfo['beizhu']);
$qiudui=safe_replace($Ainfo['mingcheng']);
if($Ainfo['username']!=""){$username=safe_replace($Ainfo['username']);}else{ $username=safe_replace(param::get_cookie('admin_username')); }
$userid=intval($Ainfo['userid']);
$catid=intval($Ainfo['changdi']);
$lianxiren=safe_replace($Ainfo['lianxiren']);
$day=safe_replace($Ainfo['riqi']);
$daytime=safe_replace($Ainfo['changci']);
$dianhua=safe_replace($Ainfo['dianhua']);
$title=$username.":预约 ".$day."<".$chang[$catid].">,时间:".$daytime;
$ttime=mktime();
$datas = $this->db->query("insert into ec_changdix (catid,typeid,status,title,username,userid,description,inputtime,updatetime) values($catid,0,99,'$title','$username',$userid,'$description','$ttime','$ttime')");
$insertid = mysql_fetch_assoc($this->db->query(" select @@IDENTITY"));
$nid=$insertid["@@IDENTITY"];
$this->db->query("update ec_changdix set url='/?catid=$catid&id=$nid' where id=".$insertid["@@IDENTITY"]);
$this->db->query("insert into ec_changdix_data (id,dianhua,lianxiren,day,daytime,qiudui) values($nid,'$dianhua','$lianxiren','$day','$daytime','$qiudui')");
showmessage(L('success'), HTTP_REFERER);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
2014-05-07 js控制页面显示和表单提交
2012-05-07 mysql数据库学习——3,表的创建,删除和变更