在函数内使用配置变量

时间:2012-03-30 21:47:39

标签: php mysql

在下面给出的代码中,我试图以这样的方式修改它,即从配置文件中使用db连接变量。这应该使密码更安全,因为我可以限制配置文件的权限。

请告诉我是否有办法修改代码以从其他文件/配置文件中获取db变量?

class ActivitycodesCollection {
    var $list, $err, $sql;    
    // --- Private variables for database access
    var $_db_host = "######";
    var $_db_username = "######";
    var $_db_passwd = "######";
    var $_db_name = "######";
    function query ($where="") {
        mysql_pconnect ($this->_db_host, $this->_db_username, $this->_db_passwd);
        mysql_select_db ($this->_db_name);
        $where = "WHERE " . $where;
        $sql = "SELECT * FROM activitycodes $where";
        $result = mysql_query ($sql);
        $this->err = mysql_error();
        $this->sql = $sql;
        if (mysql_num_rows($result) > 0) {
            while (list($id) = mysql_fetch_array ($result)) {
                $this->list[$id] = new activitycodes($id);
            }
        }
    }
}

我尝试在此类/函数中包含config.ini文件,但它引发了一个错误,如

unexpected T_VARIABLE, expecting T_FUNCTION

4 个答案:

答案 0 :(得分:1)

如果没有看到“config”文件,就无法说出如何为它编写解析器。一个简单的解决方案是编写一些设置变量的PHP代码 - 但是如果你包含/要求它,变量将在全局范围内设置 - 而不是在方法中。但是你可以使用eval(file_get_contents($ config_file_path)) - 它会在本地范围内设置变量,但却有提供代码注入方法的风险。

BTW您提供的代码存在大量问题。暂且不考虑SQL注入的潜在风险,如果方法参数为null / blank,那么查询将是格式错误的(考虑函数查询($ where =“1”)。依赖于特定的列排序是不好的做法。

当唯一可行的方法是通过suphp或base opendir时,很难想象你如何限制对这个配置文件的访问。

答案 1 :(得分:1)

你的代码已经过时了 1)不要将var用于属性,请使用privateprotected 2)不要使用mysql_ *函数,使用PDO 3)不要在课堂上保留连接细节。只需要在构造函数中连接PDO 4)不要信任范围之外的任何数据 - 不要只是在SQL查询中写一些不受信任的文本(你可以通过$where变量来实现)。
5)读书。 “PHP对象,模式和实践”现在将帮助您,并且“稍后清理代码”。

示例:

class ActivitycodesCollection
{
    private $list;
    private $PDO;
    private $table_name;

    public function __construct(\PDO $PDO, $table_name)
    {
        $this->PDO        = $PDO;
        $this->table_name = $table_name;
    }

    public function fetchByParameter($parameter)
    {
        $query = $this->PDO->prepare("SELECT `id` FROM `{$this->table_name}` WHERE "
                ." some_field = :parameter");
        if (!$query)
        {
            return false;
        }
        if (!($query->execute(array(':parameter'=> $parameter))))
        {
            return false;
        }

        $results = $query->fetchAll(\PDO::FETCH_ASSOC);
        if (!empty($result))
        {
            foreach ($results as $result)
            {
                $id              = $result['id'];
                $this->list[$id] = new ActivityCodes($id);
            }
        }
    }
}

答案 2 :(得分:0)

您可以在构造函数中使用parse_ini_file

class ActivitycodesCollection {
    var $list, $err, $sql;    

    const CONFIG_FILE = 'config.ini';

    // --- Private variables for database access
    var $_db_host = ''
    var $_db_username = '';
    var $_db_passwd = '';
    var $_db_name = '';

    public function ActivitycodesCollection() {
        $config = parse_ini_file(self::CONFIG_FILE);
        $this->_db_host = $config['db']['host'];
        //etc
    }

    public function query ($where="") {
        mysql_pconnect ($this->_db_host, $this->_db_username, $this->_db_passwd);
        mysql_select_db ($this->_db_name);
        $where = "WHERE " . $where;
        $sql = "SELECT * FROM activitycodes $where";
        $result = mysql_query ($sql);
        $this->err = mysql_error();
        $this->sql = $sql;
        if (mysql_num_rows($result) > 0) {
            while (list($id) = mysql_fetch_array ($result)) {
                $this->list[$id] = new activitycodes($id);
            }
        }
    }

ini文件应该是这样的:

[db]
host = localhost
name = foo
user = bar
pass = baz

答案 3 :(得分:0)

将SQL连接数据放在单独的文件中根本不会提高安全性。实际上,将它们存储在没有.php扩展名的文件中会降低安全性,因为用户可以访问它,而PHP文件的代码对任何用户都不可见。您也不能在配置文件上使用比PHP文件更严格的权限,因为PHP运行的任何用户(通常是Web服务器用户)都需要访问它们。

只需将连接数据存储在PHP文件中:

<?php
define('DB_HOST', '...');
define('DB_NAME', '...');
define('DB_USER', '...');
define('DB_PASS', '...');

然后包含此文件(在类定义之外)并在建立连接时使用常量。