我有兩個表格
表一
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)
這樣他就會新增到不屬於他房子的房間了
我應該如何避免這樣的事情發生
新手模索中 還請各位大大指點
你意思是說,
你要修改資料會用到GET ?
新增時候有一攔是GET的值
我倒是第一次看到這樣的Code,
一般來說會改到資料庫的應該都要用POST,
不過話說回來了,
只要是Html裡面的東西就可以被更改,
這一點也是無可避免,
如果真的要防這種無聊的高手的話,
一個方法是照其他人說的用Session,
(反正Session失效了正常來說也會被登出)
另外一個方法是把使用者資料也一併帶入SQL考慮.
但是話說回來,
如果使用者改了Get的值可以看到別人的產品,
這件事本身就是個問題吧...
表示你的程式其實有很大的漏洞...
我利用連結 room_add.php?house_id=1傳送要新增哪個房子的資訊
1.看起來你是使用REST風格的API,假如新增要使用POST,不使用GET參數,參數值隱藏在前端頁面,只能按照程式邏輯來修改,避免參數可以被人為簡單更改參數值方式修改
2.你這邊都有將house_owner以$_SESSION保存起來,可以在後端做驗證:『修改的房屋不是房屋擁有人,就不能修改並提示給前端』
那就讓它新增失敗就好了~
不是在exists裡面規定的值~就無法新增成功~
insert into ..
select ...
where exists(
.....
)
前端送來的資料永遠不可信,
後端都一定要驗証,
只要不驗証,
就很有可能變漏洞,
知道或能夠試出來的人,
就可以執行一些開發者想像不到的事…
// 後端驗証,我只打概念,程式碼也是隨便寫,看懂主旨就好
送進來的 $_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
回應 這不是你的房子 之類的
也不必執行他送來的指令,
反正都是丟棄…