2012-03-30 6 views
0

以下のコードでは、設定ファイルからdb接続変数を使用するように変更しようとしています。これにより、設定ファイルのアクセス権を制限することができるため、パスワードがより安全になります。機能内の設定変数の使用

親切に私は別のファイル/ configファイルからデシベル変数を取得するために、コードを変更することが可能な方法があるかどうか私に教えて?

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ファイルを含めてみましたが、それはあなたがあなたのコンストラクタでparse_ini_fileを使用することができます

unexpected T_VARIABLE, expecting T_FUNCTION 
+0

エラーが、私は別のファイルからパスワードを含めることを試みながら、それは私が使うことが可能な方法を把握しようとしています。..でした..上記のコードではありません関数内の設定変数。 – iRiddler

答えて

1

あなたのコードが絶望的に​​時代遅れである。
1)privateを使用し、プロパティのvarを使用しないでくださいまたは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

おかげさまで、詳細な洞察力を得ていただきありがとうございます。提案したコードを確実に更新していきます。 – iRiddler

0

のようなエラーを投げました。

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 
0

個別のファイルにSQL接続データを置くことは、すべてのでセキュリティを向上させるしません。実際には、拡張子が.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 /空白の場合、クエリは不正な形式になります(関数のクエリ($ where = "1")を考慮してください)。それが唯一の現実的な手段がsuphpまたはベースのopendir経由だろうときヨーヨーは、この設定ファイルへのアクセスを制限する方法を想像することも難しい。

関連する問題