2012-03-30 9 views
0

В приведенном ниже коде я пытаюсь изменить его таким образом, чтобы переменные соединения 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 
+0

ошибка не в коде выше .. Это было в то время как я пытался включить пароль из другого файла .. Я пытаюсь выяснить способ, с помощью которого я могу использовать config внутри функции. – iRiddler

ответ

1

Ваш код безнадежно устарел.
1) не используйте var для свойств, используйте private или protected.
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); 
      } 
     } 
    } 
} 
+0

Большое спасибо OZ_ за подробные сведения о себе. Я обязательно обновлю код, как вам было предложено. Я тоже работаю над довольно старым набором файлов. Я очищу его как можно скорее. – iRiddler

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); 
      } 
     } 
    } 

И ини файл должен быть чем-то вроде этого:

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

Ввод данных соединения SQL в отдельных файлах делает не повышает безопасность на всех. Фактически, хранение их в файле, который не имеет расширения .php, делает его менее безопасным, поскольку он может быть доступен пользователю, а код файла PHP не отображается никому. Вы также не можете использовать более ограничительные разрешения для файла конфигурации, чем на ваших PHP-файлах, поскольку любой пользовательский PHP, работающий под управлением (как правило, пользователь веб-сервера), должен получить к ним доступ.

Просто хранить данные соединения в PHP файле:

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

Затем включите этот файл (за пределами вашего определения класса) и использовать константы при создании соединения.

+0

Это сработало .. Спасибо за ваши идеи. Является ли он опробовать предложения, предоставленные остальными, и проверить это. – iRiddler

1

Без просмотра файла конфигурации вы не можете сказать, как написать для него синтаксический анализатор. Простым решением было бы написать некоторый php-код, который задает переменные, но если вы включите/требуете его, переменные будут установлены в глобальной области - не в рамках метода. Но вы можете eval (file_get_contents ($ config_file_path)), который задал бы переменные в локальной области с угрозой предоставления метода для ввода кода.

К сожалению, с кодом, который вы предоставили, имеется большое количество проблем. Оставляя в стороне потенциальный риск внедрения SQL, если параметр метода имеет значение null/blank, тогда запрос будет искажен (рассмотрите запрос функции ($ where = "1"). Опираясь на конкретное упорядочение столбцов является плохой практикой.

также трудно представить себе, как лет ограничить доступ к этому конфигурационный файл, когда единственным практическим способом будет осуществляться через suphp или базовой opendir.

Смежные вопросы