Как я могу сделать этот класс базы данных php более безопасным? - PullRequest
0 голосов
/ 02 июня 2011

Я использую следующий класс базы данных PHP MySQL.Мне интересно, что я могу сделать, чтобы сделать его более безопасным.Я доволен этим до сих пор, но не предлагая «использовать PDO», что я могу сделать, чтобы улучшить это в настоящее время?

    <?

    class DbConnector {

    public static function getInstance(){
   static $instance = null;
   if($instance === null){
      $instance = new DbConnector();
   }

   return $instance;
    }

    var $theQuery;
    var $link;

    function DbConnector() {

        $host = 'localhost';
        $db     = '';
        $user = '';
        $pass = '';

        // connect to the db
        $this->link = mysql_connect($host, $user, $pass);
        mysql_select_db($db);
        register_shutdown_function(array(&$this, 'close'));
    }

    function find($query) {
        $ret = mysql_query($query, $this->link);
        if (mysql_num_rows($ret) == 0)
            return array();
        $retArray = array();

        while ($row = mysql_fetch_array($ret))
            $retArray[] = $row;

        return $retArray;
    }

    function insert($query) {
        $ret = mysql_query($query, $this->link);

        if (mysql_affected_rows() < 1)
            return false;
        return true;
    }

    function query($query) {
        $this->theQuery = $query;
        return mysql_query($query, $this->link);
    }

    function fetchArray($result) {

        return mysql_fetch_array($result);
    }

    function close() {
        mysql_close($this->link);
    }

    function exists($query) {
        $ret = mysql_query($query, $this->link);
        if (mysql_num_rows($ret) == 0)
            return false;
    }

    function last_id($query) {
        return mysql_insert_id($query);
    }


}

?>

Ответы [ 2 ]

3 голосов
/ 02 июня 2011

Если вы не хотите использовать что-то, что автоматически будет экранировать строки, вы должны по крайней мере предоставить метод escapeString($string) (который будет вызывать mysql_real_escape_string()), который вы можете использовать для экранирования строк при составлении запроса.

Если вы хотите начать использовать PDO (настоятельно рекомендуется), то у вас, вероятно, будут другие методы, и вам не нужно будет включать метод экранирования.

Что касается общегосоображения:

  • не используйте var, а используйте public, protected или private (var устарело с PHP 5.0 и в настоящее время является псевдонимомдля public)
  • предпочтительнее метод __construct() вместо метода с именем класса
  • было бы лучше не подключаться в конструкторе, а подключаться только тогда, когдавам действительно нужно подключиться, чтобы выполнить запрос;конструктор должен делать как можно меньше, и, как правило, только инициализировать свойства
  • mysql_connect() и mysql_select_db() вернет false, если они не смогут сделать то, что должны;вы должны выбросить исключение, если это произойдет, и перехватить его там, где вы используете класс
  • , вызов mysql_query() в методах find() и exists() может вернуть что-то отличное от ресурса (например, false)) поэтому вам следует проверить это перед вызовом mysql_num_rows()
  • , если вы вообще не используете $theQuery, вам следует удалить его
  • , если вы хотите иметь доступ к $theQuery, вы должны сделать его закрытым и предоставить метод getQuery() accssor
  • , если вы устанавливаете свойство $link для ресурса, возвращаемого mysql_connect(), вы должны использовать это свойство во всех ваших mysql_*вызовы, такие как last_id()
  • , которые вы должны сделать $link закрытыми (как правило, все свойства должны быть закрытыми или защищенными, а методы доступа должны предоставляться при необходимости - читайте оконцепция инкапсуляции )
  • , хотя все методы по умолчанию public, с явным ключевым словом public перед каждым из них прояснит ситуацию
0 голосов
/ 02 июня 2011

Хорошо, я тоже ненавижу PDO, «мой собственный код - это мой собственный риск, в то время как код других - это и ваш собственный риск».В любом случае, если вы будете использовать этот скрипт без какого-либо очистителя, я уверен, что вы заставите свою БД взорваться.Вы можете захотеть взглянуть на другие классы подключения к базе данных mysql, прежде чем начинать свои собственные:

посмотрите здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...