第一个是很严重的问题,今天想把第一个问题解决了。
看下360给出的意见
我不知道怎么改,希望大家帮忙解决下。
回复讨论(解决方案) 这是contrast.php的文件源码
【产品名称】
【主要功能】
【规格包装】
招商区域
产品说明
可提供的支持
对代理商的要求
备注
$id='';
if(!empty($_post['id'])){
for($i=0; $i
}
$id=substr($id,0,strlen($id)-1);//去除最后面的,
}
$sql=select * from zzcms_main where id in ( $id)
他认为你未经检查就在 sql 指令中使用了传入的数据
$id='';
if(!empty($_post['id'])){
for($i=0; $i
}
$id=substr($id,0,strlen($id)-1);//去除最后面的,
}
$sql=select * from zzcms_main where id in ( $id)
他认为你未经检查就在 sql 指令中使用了传入的数据
我是php小白,请问我应该怎么验证,怎么检查好呢?
还有我不检查,是不是很容易被注入呢?
$id = $id . (intval($_post['id'][$i]) . ',');
sql注入的原理是,从地址栏或者表单中注入
如果你从地址栏得到一个$_get[a],不经过过滤就直接使用到程序中,就会造成威胁。比如:
如果$_get[a]=1;那么:
$sql = select * from aa where id =$_get[a];就是$sql = select * from aa where id =1;
但如果别人通过地址栏自行修改,把$_get[a]的值改为1 or (and) xxx各类代码,那这个查询语句就变成
$sql = select * from aa where id =1 or(and) xxx;
于是就中招了。
所以地址栏和表单得到的参数,一定要格式化,过滤好,指定是什么类型,多长,限制哪些字符……
$sql=select * from zzcms_main where id in ($id) ;
$id?有?行,用入什?都可以,?然被注入了。
因?id只能是?字,所以可以用intval?成?字,如果非?字?0,就注入不到了。
安全级别:高危
安全等级打败了全国46%的网站!
$id=$id.(intval($_post['id'][$i]).',');
传入的数据把单引号替换为两个连续的单引号 , sql语句用传入的参数时加上单引号。
$id = str_replace(','',$_post['id']);
$sql = select * from tb_user wher id='$id' ;
这样就不怕注入了。
谢谢 您们的回答 我目前是把$id=$id.($_post['id'][$i].','); 替换成 $id = $id . (intval($_post['id'][$i]) . ','
就对了
上面的不对,我改成这样了
if(!empty($_post['id'])){
for($i=0; $i
$id = $id.(intval($_post['id'][$i]).',');
}
$id=substr($id,0,strlen($id)-1);//去除最后面的,
}
这样是不是对了
if(!empty($_post['id'])) { $id = join(',', array_map('intval', $_post['id']));}
最好把 $id 换个名字
if(!empty($_post['id'])) { $id = join(',', array_map('intval', $_post['id']));}
最好把 $id 换个名字
我对php不熟,我就用这段代码,不用找变量了
感谢版主无私的精神。
我才发现,另一个问题也是您在为我解决,再次感谢!