作者buganini (霸格尼尼)
看板PHP
标题Re: [请益] 不知道哪里错
时间Tue Mar 13 01:03:19 2007
※ 引述《yorjing (托儿所婴儿)》之铭言:
: ※ 引述《yorjing (托儿所婴儿)》之铭言:
: : 下面是小弟的程式码
: : 程式码有bug
: : 小弟我抓不出来
: : http://homelf.kimo.com.tw/yorjing/guest_add_host.php.txt
: : 错误讯息是
: : 无法执行查询: UPDATE guestbook SET hcontent=uirirfi, htime=2007-03-12 19:13:36 WHERE reply_id=数字
: : 请问各位大大
: : 这段程式码哪里有错
: : 小弟我抓不出来
: : 烦请各位大大帮小弟我指点迷津
: : 谢谢
: 推 buganini:这样写很危险的啊..... 03/12 22:51
: 请问
: 这样写的问题在哪边?
: 可以请大大指点一下吗?
以下节录自之前寄给Conanspe的信件
要把外部输入的资料放进SQL时
千万要注意
1. 要用引号
2. 要用mysql_real_escape_string()处理过
//有些人会用addslases(),但因为mysql_real_escape_string()还会针对不同编码及资料库设定做处理,所以建议用它
//并且这个函式要在资料库连线建立(mysql_connect)之後才能使用
//应该也要在mysql_select_db之後
//因为它会去问MySQL关於编码那些的设定值
Reasons:
1. 假设没有引号
$sql='DELETE FROM `table` WHERE id='.$_GET['id'];
然後网址列我打?id=1%20OR1%3D1 %20是空白,%3D是等号
这样$sql就变成
DELETE FROM `table` WHERE id=1 OR 1=1
於是你的资料就被删光了
2. $sql='SELECT * FROM `table` WHERE id="'.$_GET['id'].'"';
这次有用引号
我把id写成
1"; DELETE FROM `table`; --
$sql就变成
SELECT * FROM `table` WHERE id="1"; DELETE FROM `table`; --"
--之後会被当成注解
於是资料又被删光了 囧
若有用那个函式处里过
他会适当的帮引号或其他有特殊意义的字元加上\
这种手法叫做SQL Injection
写资料库程式千万要注意
针对单纯的insert动作
可以用以下函式来简化
function sql_insert($table,$res,$lnk=NULL){
$field_a=array();
$data_a=array();
foreach($res as $key => $val){
if(isset($val)){
$field_a[]='`'.$key.'`';
$data_a[]='\''.($lnk===NULL?mysql_real_escape_string($val):mysql_real_escape_string($val,$lnk)).'\'';
}
}
$field=implode(',',$field_a);
$data=implode(',',$data_a);
$sql='INSERT INTO `'.$table.'` ('.$field.') VALUES ('.$data.');';
return $lnk===NULL?mysql_query($sql):mysql_query($sql,$lnk);
}
使用方式
$data=array();
$data['id']=$id;
$data['lala']=$lala;
sql_insert('table',$data);
以上的动作等同於
mysql_query('INSERT INTO `table` (`id`,`lala`) VALUES
("'.mysql_real_escape_string($id).'","'.mysql_real_escape_string($lala).'")');
这样很方便吧~XD
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 163.22.93.130
※ 编辑: buganini 来自: 163.22.93.130 (03/13 01:05)
※ 编辑: buganini 来自: 163.22.93.130 (03/13 01:28)
※ 编辑: buganini 来自: 140.131.149.15 (04/05 18:12)