2013-10-21 134 views
0

对于我正在编写的插件系统,我需要编写一个数据库API。但是我想限制数据库访问,所以插件看不到其他表格,而不是通过特定功能创建的表格。我将如何启用插件来使用SQL,但不能同时授予它们完全访问权限?限制数据库访问虽然PHP

下面是一些代码,它可能无法正常工作,但它显示了它背后的理念:

class Api_Database { 
    private $pluginid; 

    function __construct($pluginid) { 
     $this->pluginid = $pluginid; 
    } 

    function query($sql, $tablename) { 
     $db = new Sys_Database; 
     $db->query(str_replace('{table}', $pluginid.$tablename, $sql)); 
    } 
} 

上午我在这里向正确的方向在想什么?你会如何创建这样一个系统,只有更安全?

回答

0

的想法是创建一个包含链接到用户创建的表的列表的表...

喜欢的东西:

privileges 
user_id 
table_name 

而且在查询

SELECT FROM privileges WHERE user_id = '{user_id}' and table_name = '{table}'; 

而且检查行是否存在之后。如果是,用户有权使用该表!

class Api_Database { 
    private $pluginid; 

    function __construct($pluginid) { 
     $this->pluginid = $pluginid; 
    } 

    function query($sql, $tablename) { 
     $hasPrivilege = $this->checkPrivileges($tablename, $userid); 

     if(!$hasPrivilege) return false; //for example 

     $db = new Sys_Database; 
     $db->query(str_replace('{table}', $pluginid.$tablename, $sql)); 
    } 

    function checkPrivileges($table, $user_id) { 
     $db = new Sys_Database; 
     $result = $db->query('SELECT id FROM privileges WHERE user_id = "'.$user_id.'" AND table_name = "'.$table.'"'); 
     return ($result && $result->num_rows); 
    } 
} 

编辑

所以,如果我理解正确的话,您使用的是PHP插件来访问SQL数据,但你不能或者不想去改变它。 你不能'添加SQL用户,你也不想限制PHP Dev通过PHP在某些表中进行一些查询?哼哼...不可能!

因为能够禁止数据库表访问,您必须操纵PHP或MYSQL用户...
如果我错了,对不起,很难跟着你!

+0

我明白了,但那不是问题所在。关键是字符串$ sql中的dat,{table}可能不存在,所以插件跳过整个表替换部分,因此它可以访问属于其他插件的系统表和表。 – superice

+0

你可以为conn创建一个有限的mysql账户! – JoDev

+0

是的,我可以做到这一点,但我正在创建一个应该在其他服务器上运行的软件,这可能无法创建有限的MySQL帐户。 (Webhosting等) – superice