在Kohana 3中,我可以在查询中绑定一个参数
$query = 'SELECT name FROM users WHERE id = :id';
这很整洁,但有时候我希望其他东西可以配置,比如表名。当我为表名使用命名参数时,它会失败。我刚刚在这种情况下构建字符串。
我的问题是,在进行这种字符串构建时,如何逃避潜在的不良角色?在Kohana 2.x中,你可以做$this->db->escape()
但是由于Kohana 3完全不同,我想有一种新的方法吗?
答案 0 :(得分:5)
只是为了添加Mark Byers的答案,表名参数化失败的原因是参数作为值进行转义,而表名是标识符。可能发生的是表名被包装在引号中,而应该用反引号包装。
然而,正如马克所说,逃避表名的需要表明设计糟糕。它们应该是硬编码的,或者存储在某些配置文件中,其内容可以信任,无论如何都不需要转义。试图覆盖你所有的基础,以至于你不相信自己的配置,这很可能是浪费时间。
答案 1 :(得分:4)
我从未使用过kohana,如果这个评论完全无关紧要,请道歉,但我对你要做的事情有一些评论:
当我为表名使用命名参数时,它会失败。
我认为这是因为它依赖于底层数据库的参数机制,而且我不知道任何允许您在查询中将表名作为参数的数据库。所以是的,很可能你必须自己构建一个字符串。
在进行这种字符串构建时,如何逃避潜在的坏字符?
这个问题看起来很奇怪......要么你的某些表名中有可能有坏字符......如果是这样,为什么?或者你从不受信任的来源(用户?)收到表名。这对我来说听起来不错。如果他们试图从他们不应该访问的表中读取怎么办?拥有一个定义良好的可允许表名列表并检查该表是否存在于该列表中,而不是转发可能不正确的表名,这不是更好吗?
我有一个最后的观察:如果您能够在查询中更改表名并且它仍然有效,这可能表明您的数据库未正确规范化。也许您可以组合表并添加一个额外的列以及有关分组的信息,并使用WHERE子句来选择所需的数据?我需要更多地了解你的模型,以提出更具体的建议。
我不确定这是否有助于回答你的问题,但这些是我对阅读你的问题的想法。我希望你可以使用它。