在Kohana中3,您现在可以绑定在查询命名参数,可以,但我怎么逃脱那些我不能绑定?

StackOverflow https://stackoverflow.com/questions/2204149

  •  18-09-2019
  •  | 
  •  

在的Kohana 3,我可以一个PARAM在像这样的查询结合

$query = 'SELECT name FROM users WHERE id = :id';

这是整齐的,但有时我想其他的事情是可配置的,如表名。当我使用了一个名为参数有关的表名,它失败。我刚刚建立在这些情况下的字符串。

我的问题是,我该怎么做这种字符串建筑的逃生时,潜在的不良字符?在Kohana的2.x中,你可以做$this->db->escape()但由于Kohana的3是完全不同的,我想像有一个新的方式?

有帮助吗?

解决方案

我想补充马克拜尔斯的回答,表名的参数化失败的原因是参数转义的的,而表名是标识符。什么是可能发生的是,表名被包装在引号,而应该被包裹在反引号代替。

然而,正如马克说,需要逃避的表名暗示糟糕的设计。他们要么被硬编码或存储在一些配置文件,其内容可以被信任不会需要反正逃逸。尝试所有的基地盖,这样你不信任自己的配置是最有可能的浪费时间的程度。

其他提示

我从未使用过Kohana的,所以道歉,如果这个评论是完全不相干的,但我有什么你正在尝试做一些评论:

  

当我使用的表名称命名PARAM,它失败。

我认为,这是因为它是依靠底层数据库的参数机制,我不知道,让你给一个表名作为查询参数的任何数据库。所以,是的,很可能你就必须建立自己的字符串。

  

我怎么可以做这种字符串建设时避免那些不好的角色?

这个问题似乎很奇怪......要么你有你的一些表名潜在的坏字符...如果是这样,为什么?要不你从不受信任的来源接收表名(用户?)。这听起来像一个坏主意给我。如果他们试图从他们不应该访问的表来读取?那岂不是最好有一个明确的允许表名的列表,并检查表在该列表中存在,而不是逃避潜在的不良表名?

和我有最后一个观察:如果你能在查询更改表名称,它仍然有效,这可能是你的数据库没有正确归一化的标志。也许你可以结合你的表和有关分组的信息添加一个额外的列,并使用WHERE子句来选择你想要的数据?我需要更多地了解你的模型提出更具体的东西。

我不知道如果这能帮助回答你的问题在所有,但这些都是在读你的问题我的想法。我希望你可以使用一些。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top