如何让这个php数据库类更安全?

时间:2011-06-02 00:59:44

标签: php mysql database security

我正在使用以下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 个答案:

答案 0 :(得分:3)

如果你不想使用会自动为你转义字符串的东西,你应该至少提供一个escapeString($string)方法(可以调用mysql_real_escape_string()),你可以使用它来转义字符串撰写查询。

如果你想开始使用PDO(强烈推荐),那么你可能会有不同的方法,不需要包含一个转义方法。

至于一般考虑因素:

  • 不使用var,而是使用publicprotectedprivatevar自PHP 5.0起已被弃用,目前public)的别名
  • 首选__construct()方法,而不是具有类
  • 名称的方法
  • 最好不要在构造函数中进行连接,而只需在真正需要连接时才进行连接以执行查询;构造函数应尽可能少,通常只初始化属性
  • mysql_connect()mysql_select_db()如果无法做到他们应该做的话,将返回false;如果发生这种情况,你应该抛出异常,并在你使用类
  • 的地方捕获它
  • mysql_query()find()方法中的exists()调用可能会返回资源(例如false)以外的内容,因此您应该在调用{{}之前检查该内容。 1}}
  • 如果您根本不使用mysql_num_rows(),则应将其删除
  • 如果您想要访问$theQuery,则应将其设为私有并提供$theQuery accssor方法
  • 如果您将getQuery()属性设置为$link返回的资源,则应在所有mysql_connect()次调用中使用该属性,例如mysql_*的调用}
  • 你应该last_id()私有(根据经验,所有属性都应该是私有的或受保护的,并且应该在需要时提供访问器方法 - 阅读encapsulation的概念)
  • 即使默认情况下所有方法都是$link,但在每个方法之前使用明确的public关键字会让事情变得更清晰

答案 1 :(得分:0)

好吧我也讨厌PDO,“我自己的代码是我自己的风险,而其他代码也是你自己的风险”。无论如何,如果您将使用此脚本而没有任何清洁器,我相信您会让您的数据库爆炸。你可能想在开始自己的之前先看看其他mysql数据库连接类:

take a look here