如何限制其他类访问MySQL连接?

4

您好!我们有一个带有MySQL连接的核心类,然后我们包含了插件,我们需要确保插件不能在没有核心类方法的情况下访问我们的数据库。

index.php

<?php
    class Core
    {
        function connect()
        {
            $db = @mysql_connect($host, $user, $pass);
            @mysql_select_db($base, $db);
        }

        function query($sql)
        {
            return mysql_query($sql);
        }
    }

    global $c;
    $c = new Core();

    include('plugin.php');
    $p = new Plugin();
    echo $p->not_work_connection();
    echo $p->work_connection();
?>

plugin.php

<?php
    class Plugin
    {
        function not_work_connection()
        {
            $sql = 'SELECT * FROM `net_country` LIMIT 0 , 1';
            $result = mysql_query($sql); 
            while($row = mysql_fetch_array($result, MYSQL_ASSOC)) 
            {
                return print_r($row, 1);
            }
        }

        function work_connection()
        {
        global $c;
            $result =$c->query('SELECT * FROM `net_country` LIMIT 0 , 1'); 
            while($row = mysql_fetch_array($result, MYSQL_ASSOC)) 
            {
                return print_r($row, 1); 
            }
        }
    }
?>

我需要限制包含的脚本访问权限,但它们可以使用核心方法进行查询。我该怎么做?
3个回答

4

如果没有第二个参数,mysql_query将使用mysql_connect使用的最后一个链接,因此您可以在真实链接之后创建一个虚拟连接:

<?php
class Core
{
    private $db;
    function connect()
    {
        $this->db = @mysql_connect($host, $user, $pass);
        @mysql_select_db($base, $db);

        //dummy 
        @mysql_connect();
    }

    function query($sql)
    {
        //notice second param
        return mysql_query($sql, $this->db);
    }
}

global $c;
$c = new Core();

include('plugin.php');
$p = new Plugin();
echo $p->not_work_connection(); //doing a mysql_query will use the dummy resource and fail
echo $p->work_connection();
?>

太棒了。它简单而有效。但需要创建一个没有任何特权的 mysql 用户,并通过他连接 @mysql_connect('localhost', 'fake', 'fake'); - Barif

3

为每个类创建一个专门用于数据库的单独连接,将该连接的句柄保留在例如 Plugin 类中,并使用 Database 库对此句柄执行操作。我认为这是一个好的解决方案。

当然,您需要为用户设置权限。(针对每个类或类组分别设置用户)


谢谢您的帮助。我需要类似于“沙盒”的东西来包含插件,它们必须使用核心类的API,不能直接连接到数据库。 - Barif

3

不太确定这是否有帮助,但我通常会为SQL连接创建一个类,另一个类用于操作特定的表格(例如保存、更新、加载、删除函数)

然后在我的索引页面或任何页面中,我会执行以下操作:

include_once("class/sql.php")
$db = new DB();
include_once("class/table.php")
$table = new TableClass();

$result =$db->query($table->load(parameters)); 
        while($row = mysql_fetch_array($result)) 
        {
            return print_r($row, 1); 
        }

这只是简略的内容,希望能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接