我正在使用MeekroDB(http://www.meekro.com/quickstart.php)在PHP中构建简单的MySQL查询。即使是简单的查询也会因语法错误而被拒绝。我注意到,通过在phpMyAdmin中手动编写查询,如果查询使用以下语法,则会被拒绝:
SELECT * FROM 'table name'
但是如果他们使用这种语法就接受了:
SELECT * FROM `table name`
唯一的区别是略有不同的撇号。 MeekroDB似乎默认生成第一个语法,这会导致查询被拒绝。以前有人遇到过这个吗?有解决方案吗我正在使用WAMP Server和MySQL 5.5.24。
注意:如果MeekroDB不包含撇号或手动插入第二个撇号类型,则MeekroDB生成的查询正在运行。所以:
$result = DB::query("SELECT DISTINCT `column` FROM `table`")
工作但是:
$result = DB::query("SELECT DISTINCT %s FROM %s", "column","table")
不
答案 0 :(得分:2)
我没有听说过MeekroDB,但它似乎是一个简单的数据库抽象层。你的第二个例子:
$result = DB::query("SELECT DISTINCT %s FROM %s", "column","table")
...无效,因为“column”和“table”都不是您想要注入的文字字符串。它们是列/表名称,它们是SQL语句的一部分,而不是用户提供的参数。
这是大多数编程语言的基本概念。 SELECT foo
与SQL中的SELECT 'foo'
不同,原因与echo md5(1);
与PHP中的echo 'md5(1)';
不同。
<强>更新强>
我怀疑我不够清楚。使用预准备语句绑定语言结构或对象名称是对任何数据库库MeekroDB的滥用。您应该绑定表示值的参数,尤其是。最终用户输入的那些,因此您的值不会泄漏到SQL中并中断查询或更改其含义。但是通常没有工具可以注入SQL 命令或表名 - 它们没什么用处:如果你允许用户构建任意SQL查询,那么他已经被授予几乎任何他想做的事情的权力。
答案 1 :(得分:-4)
好吧,因为PHP没有像其他语言那样处理字符串,这是一个不太好的主意。从本质上讲,他们试图让开发人员更容易,但并不总是如此。实际上你可以做的是
$result = DB::query(sprintf("SELECT DISTINCT %s FROM %s", "column","table"));