Re: [請益] 不知道哪裡錯
※ 引述《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)
討論串 (同標題文章)
PHP 近期熱門文章
PTT數位生活區 即時熱門文章