Php 是否可以获取cpanel mysql数据库前缀?

Php 是否可以获取cpanel mysql数据库前缀?,php,mysql,database,cpanel,cpanel-xmlapi,Php,Mysql,Database,Cpanel,Cpanel Xmlapi,正如人们所期望的那样,上面的代码可以完美地工作 首先,它检查数据库_connection.php是否存在。如果存在,则包括包含数据库详细信息的文件 如果没有-我们假设这是第一次安装。因此,我们要求用户提供cpanel登录详细信息,我们的脚本创建数据库并将详细信息保存到database_connection.php 唯一的问题是。。。是数据库前缀。创建数据库时,如果WHM为用户帐户设置了数据库前缀,则数据库名称的前缀为数据库前缀 我想知道如何确定是否有前缀,如果有,如何找出它是什么,以便脚本也可以

正如人们所期望的那样,上面的代码可以完美地工作

首先,它检查数据库_connection.php是否存在。如果存在,则包括包含数据库详细信息的文件

如果没有-我们假设这是第一次安装。因此,我们要求用户提供cpanel登录详细信息,我们的脚本创建数据库并将详细信息保存到database_connection.php

唯一的问题是。。。是数据库前缀。创建数据库时,如果WHM为用户帐户设置了数据库前缀,则数据库名称的前缀为数据库前缀

我想知道如何确定是否有前缀,如果有,如何找出它是什么,以便脚本也可以在数据库名称上加前缀


注意:我不是在寻找一个表前缀,而是由cpanel/whm添加的数据库前缀。因此,如果启用了前缀,那么默认情况下,cpanel使用用户名的前8个字符,后跟下划线。这用于数据库和数据库名称

因此,我简单地修改了上述代码,如下所示:

$db_connection = $_SERVER['DOCUMENT_ROOT'] . '/includes/install/database_connection.php';
if (!file_exists($db_connection)) {
    require("install/xmlapi.php");
    if (isset($_POST['cpname'])) {
        $opts['user'] = $_POST['cpname'];
        $opts['pass'] = $_POST['cppass'];
        $opts['temp'] = substr(str_shuffle(md5(time())),0,'12');
        $xmlapi = new xmlapi($_SERVER['HTTP_HOST']);
        $xmlapi->set_port( 2083 );
        $xmlapi->password_auth($opts['user'],$opts['pass']);
        $xmlapi->set_debug(0);
        $cpaneluser=$opts['user'];
        $databasename="OSMP_DAT";
        $databaseuser="OSMP_admin";
        $databasepass=$opts['temp'];
        $db = $databasename;
        $user = $databaseuser;
        $pass = $databasepass;
        $loc = 'localhost';
        $createdb = $xmlapi->api1_query($cpaneluser, "Mysql", "adddb", array($databasename));
        $usr = $xmlapi->api1_query($cpaneluser, "Mysql", "adduser", array($databaseuser, $databasepass));
        $addusr = $xmlapi->api1_query($cpaneluser, "Mysql", "adduserdb", array("".$cpaneluser."_".$databasename."", "".$cpaneluser."_".$databaseuser."", 'all'));
        include ('install/installer.php');
        exit;
    }
    if (!isset($_POST['dbhost'])) { include ('install/db_installer.php'); }
    if (isset($_POST['dbhost'])) {
            // save connection details to $db_connection
    }
}
因此,现在检查用户名的长度,如果超过8个字符,则将其截断为8个字符。然后添加底层存储并将其作为变量输出,以传递到脚本的下一部分

我能看到的唯一缺陷是,如果主机在whm中禁用了前缀,那么我就可以继续了

对于将来试图使用此代码的任何人,请注意 需要保护包含的文件,否则您将有惊人的 安全问题。由于此代码存在,因此有人可以手动调用 安装/db_installer.php或安装/installer.php并绕过 (!file_exists($db_connection))检查和if(isset($_POST))以及 (!isset($\u POST['dbhost'])

如果您不知道如何保护此代码,请不要使用它

$db_connection = $_SERVER['DOCUMENT_ROOT'] . '/includes/install/database_connection.php';
if (!file_exists($db_connection)) {
    require("install/xmlapi.php");
    if (isset($_POST['cpname'])) {
        $opts['user'] = $_POST['cpname'];
        $prefix = substr($opts['user'],0,8).'_';
        if ($prefix === FALSE) {$prefix = $opts['user'];}
        $opts['pass'] = $_POST['cppass'];
        $opts['temp'] = substr(str_shuffle(md5(time())),0,'12');
        $xmlapi = new xmlapi(localhost);
        $xmlapi->set_port( 2083 );
        $xmlapi->password_auth($opts['user'],$opts['pass']);
        $xmlapi->set_debug(1);
        $cpaneluser=$opts['user'];
        $databasename="OSMP_DAT";
        $databaseuser="osmp";
        $databasepass=$opts['temp'];
        $pass = $databasepass;
        $loc = 'localhost';
        $createdb = $xmlapi->api1_query($cpaneluser, "Mysql", "adddb", array($databasename));
        $usr = $xmlapi->api1_query($cpaneluser, "Mysql", "adduser", array($databaseuser, $databasepass));
        $addusr = $xmlapi->api1_query($cpaneluser, "Mysql", "adduserdb", array($databasename, $databaseuser, 'all'));
        $db = $prefix.$databasename;
        $user = $prefix.$databaseuser;
        include ('install/installer.php');
        exit;
    }
    if (!isset($_POST['dbhost'])) { include ('install/db_installer.php'); }
    if (isset($_POST['dbhost'])) {
        // save connection details to $db_connection
    }
}