作者:
Thitta (胖胖 )
2015-01-26 05:57:00大家好,小弟是一個業餘的PHP工程師,目前在開發公司內部的一些小工具。
其中有一個功能是讓使用者輸入一段SQL,並記錄在資料庫當中。讀取的時候PHP會執行
SQL並產生web表格。之後要調閱這張報表的時候就不用丟資料庫。也比較好和非程式人
員分享。
例如一張被儲存起來的員工年資報表
SELECT
name
,years
FROM employees
想請問的問題是,我要怎麼用php檢查我從表單上收到的SQL是可執行的呢?
(可執行/不可執行就return TRUE/FALSE)
有沒有比較嚴謹或正規的做法?
(如果是直接把SQL拿去執行,系統會直接報錯)
感謝前輩們不吝指導。
PS. 我是用LAMP+CI開發
作者:
GALINE (天真可愛CQD)
2015-01-26 09:57:00一個可能的作法是,執行 "EXPLAIN {$sql}",看會不會噴錯然後直接讓使用者對 DB 下 SQL ,在某些公司會被砍頭的...想一下如果有人下「DROP employees」會怎樣[汗]
作者:
GALINE (天真可愛CQD)
2015-01-26 09:59:00之前看過的作法是,把需要做報表的資料 dump 到獨立的 DB
作者:
GALINE (天真可愛CQD)
2015-01-26 10:00:00然後那個 DB 讓使用者亂玩,而且這樣也可以控制敏感資料
SELECT的權限 然後那個PHP連接MYSQL時就用這個用戶
作者:
GALINE (天真可愛CQD)
2015-01-26 10:01:00用帳戶控制也是一種作法...不過 user 下的 SQL 不會太好看如果卡 DB 就麻煩了
作者:
GALINE (天真可愛CQD)
2015-01-26 10:02:00之前看過更花俏的搞法是,Excel 連 MS SQL Server然後就可以用 VB 下 SQL 然後搞些樞紐分析表什麼的...
作者:
LaPass (LaPass)
2015-01-26 11:07:00我問一下,誰可以輸入sql? 這聽起來很危險....
作者:
carylorrk (carylorrk)
2015-01-26 18:41:00內部工具可以輸入 SQL 很正常啦...重點是控管好權限。像是 ERP 裏自定表格或是 phpmyadmin 這類的都有啊語法上的正確性可以用 parser,能否正確執行就上面所述如果是安全性考量就根本不該讓人直接執行 SQL。
原PO想問的是執行之後有沒有錯誤的話,query完return如果是false就是失敗了然後你只要handle這個錯誤然後回報有錯誤就可以了小弟是新手,以上方法可能不是嚴謹做法
作者:
GALINE (天真可愛CQD)
2015-01-26 23:33:00phpmyadmin是方便管機器的人,不是方便使用者的 XDERP 的例子有看過,不過個人覺得那不是什麼好習慣..不過考慮到需求單位可以直接處理資料,有時候還是要開門..只是開門之後怎麼樣不會出大包就是另一個問題。例如今天有人對某個MyISAM的大TABLE下沒有index的查詢,馬上有感
能輸入SQL的都是有權限的工程師吧,是否正確他們自己負責就好啦,執行有出錯的話就直接把錯誤秀在UI上