作者Thitta (胖胖 )
看板PHP
标题[请益] 如何确认一段SQL是否可以运作
时间Mon Jan 26 05:57:00 2015
大家好,小弟是一个业余的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://webptt.com/cn.aspx?n=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
1F:推 GALINE: 一个可能的作法是,执行 "EXPLAIN {$sql}",看会不会喷错 01/26 09:57
2F:→ GALINE: 然後直接让使用者对 DB 下 SQL ,在某些公司会被砍头的... 01/26 09:58
3F:→ GALINE: 想一下如果有人下「DROP employees」会怎样[汗] 01/26 09:59
4F:推 rockmanalpha: 不太懂你的意思 你是怕表格传过来的SQL太危险? 01/26 09:59
5F:→ GALINE: 之前看过的作法是,把需要做报表的资料 dump 到独立的 DB 01/26 09:59
6F:→ rockmanalpha: 如果是这样 你可以在MYSQL开一个用户 对某个DB只有 01/26 09:59
7F:→ GALINE: 然後那个 DB 让使用者乱玩,而且这样也可以控制敏感资料 01/26 10:00
8F:→ rockmanalpha: SELECT的权限 然後那个PHP连接MYSQL时就用这个用户 01/26 10:00
9F:→ GALINE: 不要让 user 取得 01/26 10:00
10F:→ rockmanalpha: 至於结果是否错误 那是可以从return得知 01/26 10:00
11F:→ GALINE: 用帐户控制也是一种作法...不过 user 下的 SQL 不会太好看 01/26 10:01
12F:→ GALINE: 如果卡 DB 就麻烦了 01/26 10:01
13F:→ rockmanalpha: G大不好意思 插楼了 01/26 10:02
14F:→ GALINE: 之前看过更花俏的搞法是,Excel 连 MS SQL Server 01/26 10:02
15F:→ GALINE: 然後就可以用 VB 下 SQL 然後搞些枢纽分析表什麽的... 01/26 10:02
17F:推 LaPass: 我问一下,谁可以输入sql? 这听起来很危险.... 01/26 11:07
18F:→ carylorrk: 内部工具可以输入 SQL 很正常啦...重点是控管好权限。 01/26 18:41
19F:→ carylorrk: 像是 ERP 里自定表格或是 phpmyadmin 这类的都有啊 01/26 18:42
20F:→ carylorrk: 语法上的正确性可以用 parser,能否正确执行就上面所述 01/26 18:49
21F:→ carylorrk: 如果是安全性考量就根本不该让人直接执行 SQL。 01/26 18:50
22F:→ TobyH4cker: 原PO想问的是执行之後有没有错误的话,query完return 01/26 19:18
23F:→ TobyH4cker: 如果是false就是失败了 01/26 19:19
24F:→ TobyH4cker: 然後你只要handle这个错误然後回报有错误就可以了 01/26 19:20
25F:→ TobyH4cker: 小弟是新手,以上方法可能不是严谨做法 01/26 19:21
26F:推 GALINE: phpmyadmin是方便管机器的人,不是方便使用者的 XD 01/26 23:33
27F:→ GALINE: ERP 的例子有看过,不过个人觉得那不是什麽好习惯.. 01/26 23:34
28F:→ GALINE: 不过考虑到需求单位可以直接处理资料,有时候还是要开门.. 01/26 23:35
29F:→ GALINE: 只是开门之後怎麽样不会出大包就是另一个问题。例如今天 01/26 23:36
30F:→ GALINE: 有人对某个MyISAM的大TABLE下没有index的查询,马上有感 01/26 23:38
31F:→ xdraculax: 能输入SQL的都是有权限的工程师吧,是否正确他们自己 01/27 03:16
32F:→ xdraculax: 负责就好啦,执行有出错的话就直接把错误秀在UI上 01/27 03:17