基于撇号字符的MySQL拒绝查询语法

时间:2013-02-01 11:59:07

标签: php mysql

我正在使用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")

2 个答案:

答案 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"));