为插件分离MySQL表

时间:2013-08-12 05:34:31

标签: php mysql database database-schema

我正在开发一些项目,应该像插件和我的网站的核心提供他们的API(访问用户信息等)。但现在我正在解决一个问题 - 每个插件都应该有自己的数据库表来存储信息,但是这些表没有一个模板,所以插件必须创建自己的具有自定义结构的表。我的问题在这里是什么?

我需要确保每个插件只能访问它创建的表。这些插件表将在具有特殊凭据的单独数据库中(因此它无法访问“核心”表),但如何避免访问其他插件的表?我的想法如下:

  • 每个插件都有一些唯一的表格前缀(非公开)。
  • 将会有一些插件类,我将使用select,insert等方法。

以下是了解我的想法的基本示例:

public function Select($fromTable, $selectWhat, $where) {
   $query = "SELECT " . $selectWhat . " FROM {unique_prefix}_" . $fromTable . " where " . $where . ";";
}

这是一个非常简单的例子,没有任何输入保护......这就是我的问题 - 如何保护它以避免访问另一个插件?假设他们不知道彼此的唯一前缀,但仍然。或者如何避免像$where这样的1 = 1; evil code here;传递?当然,这些插件的帐户只具有SELECT,INSERT,DELETE和UPDATE的权限。谢谢您的想法。

2 个答案:

答案 0 :(得分:2)

不知道这是否是最佳解决方案,但您可以为每个插件创建一个单独的mysql用户,该用户只有该插件的表格(Grants:http://dev.mysql.com/doc/refman/5.0/en/grant.html)。

您可能希望为每个插件的表强制某种类型的命名约定,并创建一个自动设置相关用户授权的工具。

答案 1 :(得分:1)

使用像PDO这样的预准备语句来生成查询,不要让原始输入到来。我不知道你在$ where中会有什么,但它仍然是有限数量的物品。因此做这样的事情:对于数组中的每个项生成一部分PDO语句。这样,它将生成正确的查询,最重要的是,中和所有“恶意代码”。

PDO prepared statements

相关问题