iT邦幫忙

0

INSERT INTO 驗證問題

php
  • 分享至 

  • xImage

我有兩個表格
表一
house_list
house_id | house_address | house_owner
1 | xxx | A
2 | yyy | B

表二
room_list
room_id | house_id | room_name

house_owner有用$_SESSION儲存起來

我利用連結 room_add.php?house_id=1傳送要新增哪個房子的資訊

如果使用者更改了GET的值(house_id=1 改成 house_id=2)

這樣他就會新增到不屬於他房子的房間了

我應該如何避免這樣的事情發生

新手模索中 還請各位大大指點

看更多先前的討論...收起先前的討論...
豬豬人 iT邦新手 4 級 ‧ 2019-08-08 13:14:56 檢舉
1
淺水員 iT邦大師 6 級 ‧ 2019-08-08 13:24:11 檢舉
我想有些東西需要補充一下:
1. 新增這個動作會改變什麼?(資料表的哪個欄位,或是SESSION的哪個值)
2. 允許或不被允許新增的規則是什麼?
豬豬人 iT邦新手 4 級 ‧ 2019-08-08 13:30:14 檢舉
1.新增時house_id 為GET的值 room_id為AUTO_INCREMENT room_name為用戶填寫的值

2.只要有值就允許
豬豬人 iT邦新手 4 級 ‧ 2019-08-08 13:36:16 檢舉
$sql_room_add = "INSERT INTO
`room_list`(`house_id,`room_name`)
VALUE
('{$_GET['house_id']}','{$_POST['room_name']}')";
$result_room_add = mysqli_query($link,$sql_room_add);
淺水員 iT邦大師 6 級 ‧ 2019-08-08 13:36:46 檢舉
何不在SESSION儲存house_id,這個值就不透過GET傳遞了
froce iT邦大師 1 級 ‧ 2019-08-08 18:30:50 檢舉
為啥房子的ID你要給使用者決定?
為啥不先檢查這ID屬不屬於這使用者的?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
小魚
iT邦大師 1 級 ‧ 2019-08-08 13:17:06

你意思是說,
你要修改資料會用到GET ?

看更多先前的回應...收起先前的回應...
豬豬人 iT邦新手 4 級 ‧ 2019-08-08 13:18:09 檢舉

新增時候有一攔是GET的值

小魚 iT邦大師 1 級 ‧ 2019-08-08 13:56:54 檢舉

我倒是第一次看到這樣的Code,
一般來說會改到資料庫的應該都要用POST,
不過話說回來了,
只要是Html裡面的東西就可以被更改,
這一點也是無可避免,
如果真的要防這種無聊的高手的話,
一個方法是照其他人說的用Session,
(反正Session失效了正常來說也會被登出)
另外一個方法是把使用者資料也一併帶入SQL考慮.

但是話說回來,
如果使用者改了Get的值可以看到別人的產品,
這件事本身就是個問題吧...
表示你的程式其實有很大的漏洞...

ccutmis iT邦高手 2 級 ‧ 2019-08-08 14:07:29 檢舉

我覺得樓主應該是新手照書本上面的範例在學的吧
很多php教學範例最基本的就是一個商品列表
新刪改的部份就是用 get變數帶項目id
這種方式好處是很好理解 壞處就是實務上這樣用會出事...
/images/emoticon/emoticon82.gif

小魚 iT邦大師 1 級 ‧ 2019-08-08 14:10:14 檢舉

書上一定都寫得比較簡單,
真正要用的會複雜很多倍,
多了很多其他的資料,
很多東西要驗證.

ccutmis iT邦高手 2 級 ‧ 2019-08-08 14:22:36 檢舉

/images/emoticon/emoticon77.gif

0
暐翰
iT邦大師 1 級 ‧ 2019-08-08 13:36:51

我利用連結 room_add.php?house_id=1傳送要新增哪個房子的資訊

1.看起來你是使用REST風格的API,假如新增要使用POST,不使用GET參數,參數值隱藏在前端頁面,只能按照程式邏輯來修改,避免參數可以被人為簡單更改參數值方式修改
2.你這邊都有將house_owner以$_SESSION保存起來,可以在後端做驗證:『修改的房屋不是房屋擁有人,就不能修改並提示給前端』

3
純真的人
iT邦大師 1 級 ‧ 2019-08-08 14:07:12

那就讓它新增失敗就好了~

不是在exists裡面規定的值~就無法新增成功~

insert into ..
select ...
where exists(
    .....
)
0
永往直前
iT邦新手 4 級 ‧ 2019-08-09 12:16:58

前端送來的資料永遠不可信,
後端都一定要驗証,

只要不驗証,
就很有可能變漏洞,
知道或能夠試出來的人,
就可以執行一些開發者想像不到的事…

// 後端驗証,我只打概念,程式碼也是隨便寫,看懂主旨就好

送進來的 $_GET['house_id']

要先拿去 Query SQL, 

可以考慮兩種作法,哪個好不一定,看使用情況…

1. 
SELECT * .... 略,
WHERE `house_id` = $_GET['house_id']
LIMIT 1;

然後 Check, if ($sql['house_owner'] == $_SESSION['user'])

2.
SELECT * .... 略,
WHERE `house_id` = $_GET['house_id']
AND `house_owner` = $_SESSION['user']
LIMIT 1;

然後 Check 有沒有 query result...

上面的驗証結果
if true,
執行他要求的 增刪改 房間資料
else
回應 這不是你的房子 之類的
也不必執行他送來的指令,
反正都是丟棄…

我要發表回答

立即登入回答