[請益] 如何使用php確認一段SQL可以運作

看板PHP作者 (胖胖 )時間9年前 (2015/01/26 05:57), 9年前編輯推噓5(5027)
留言32則, 7人參與, 最新討論串1/1
大家好,小弟是一個業餘的PHP工程師,目前在開發公司內部的一些小工具。 其中有一個功能是讓使用者輸入一段SQL,並記錄在資料庫當中。讀取的時候PHP會執行 SQL並產生web表格。之後要調閱這張報表的時候就不用丟資料庫。也比較好和非程式人 員分享。 例如一張被儲存起來的員工年資報表 SELECT name ,years FROM employees 想請問的問題是,我要怎麼用php檢查我從表單上收到的SQL是可執行的呢? (可執行/不可執行就return TRUE/FALSE) 有沒有比較嚴謹或正規的做法? (如果是直接把SQL拿去執行,系統會直接報錯) 感謝前輩們不吝指導。 PS. 我是用LAMP+CI開發 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.130.222.151 ※ 文章網址: https://www.ptt.cc/bbs/PHP/M.1422223022.A.83C.html ※ 編輯: Thitta (220.130.222.151), 01/26/2015 05:58:52 ※ 編輯: Thitta (220.130.222.151), 01/26/2015 06:01:51 ※ 編輯: Thitta (220.130.222.151), 01/26/2015 06:04:23 ※ 編輯: Thitta (220.130.222.151), 01/26/2015 06:06:41 ※ 編輯: Thitta (220.130.222.151), 01/26/2015 06:09:50

01/26 09:57, , 1F
一個可能的作法是,執行 "EXPLAIN {$sql}",看會不會噴錯
01/26 09:57, 1F

01/26 09:58, , 2F
然後直接讓使用者對 DB 下 SQL ,在某些公司會被砍頭的...
01/26 09:58, 2F

01/26 09:59, , 3F
想一下如果有人下「DROP employees」會怎樣[汗]
01/26 09:59, 3F

01/26 09:59, , 4F
不太懂你的意思 你是怕表格傳過來的SQL太危險?
01/26 09:59, 4F

01/26 09:59, , 5F
之前看過的作法是,把需要做報表的資料 dump 到獨立的 DB
01/26 09:59, 5F

01/26 09:59, , 6F
如果是這樣 你可以在MYSQL開一個用戶 對某個DB只有
01/26 09:59, 6F

01/26 10:00, , 7F
然後那個 DB 讓使用者亂玩,而且這樣也可以控制敏感資料
01/26 10:00, 7F

01/26 10:00, , 8F
SELECT的權限 然後那個PHP連接MYSQL時就用這個用戶
01/26 10:00, 8F

01/26 10:00, , 9F
不要讓 user 取得
01/26 10:00, 9F

01/26 10:00, , 10F
至於結果是否錯誤 那是可以從return得知
01/26 10:00, 10F

01/26 10:01, , 11F
用帳戶控制也是一種作法...不過 user 下的 SQL 不會太好看
01/26 10:01, 11F

01/26 10:01, , 12F
如果卡 DB 就麻煩了
01/26 10:01, 12F

01/26 10:02, , 13F
G大不好意思 插樓了
01/26 10:02, 13F

01/26 10:02, , 14F
之前看過更花俏的搞法是,Excel 連 MS SQL Server
01/26 10:02, 14F

01/26 10:02, , 15F
然後就可以用 VB 下 SQL 然後搞些樞紐分析表什麼的...
01/26 10:02, 15F

01/26 10:11, , 16F
01/26 10:11, 16F

01/26 11:07, , 17F
我問一下,誰可以輸入sql? 這聽起來很危險....
01/26 11:07, 17F

01/26 18:41, , 18F
內部工具可以輸入 SQL 很正常啦...重點是控管好權限。
01/26 18:41, 18F

01/26 18:42, , 19F
像是 ERP 裏自定表格或是 phpmyadmin 這類的都有啊
01/26 18:42, 19F

01/26 18:49, , 20F
語法上的正確性可以用 parser,能否正確執行就上面所述
01/26 18:49, 20F

01/26 18:50, , 21F
如果是安全性考量就根本不該讓人直接執行 SQL。
01/26 18:50, 21F

01/26 19:18, , 22F
原PO想問的是執行之後有沒有錯誤的話,query完return
01/26 19:18, 22F

01/26 19:19, , 23F
如果是false就是失敗了
01/26 19:19, 23F

01/26 19:20, , 24F
然後你只要handle這個錯誤然後回報有錯誤就可以了
01/26 19:20, 24F

01/26 19:21, , 25F
小弟是新手,以上方法可能不是嚴謹做法
01/26 19:21, 25F

01/26 23:33, , 26F
phpmyadmin是方便管機器的人,不是方便使用者的 XD
01/26 23:33, 26F

01/26 23:34, , 27F
ERP 的例子有看過,不過個人覺得那不是什麼好習慣..
01/26 23:34, 27F

01/26 23:35, , 28F
不過考慮到需求單位可以直接處理資料,有時候還是要開門..
01/26 23:35, 28F

01/26 23:36, , 29F
只是開門之後怎麼樣不會出大包就是另一個問題。例如今天
01/26 23:36, 29F

01/26 23:38, , 30F
有人對某個MyISAM的大TABLE下沒有index的查詢,馬上有感
01/26 23:38, 30F

01/27 03:16, , 31F
能輸入SQL的都是有權限的工程師吧,是否正確他們自己
01/27 03:16, 31F

01/27 03:17, , 32F
負責就好啦,執行有出錯的話就直接把錯誤秀在UI上
01/27 03:17, 32F
文章代碼(AID): #1KnMQkWy (PHP)