Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不应该';我不能在PHP中使用mysql_*函数吗?_Php_Mysql_Pdo - Fatal编程技术网

为什么不应该';我不能在PHP中使用mysql_*函数吗?

为什么不应该';我不能在PHP中使用mysql_*函数吗?,php,mysql,pdo,Php,Mysql,Pdo,为什么不应该使用mysql.*函数的技术原因是什么?(例如mysql\u query(),mysql\u connect()或mysql\u real\u escape\u string()) 即使他们在我的网站上工作,我为什么还要使用其他东西 如果他们在我的网站上不起作用,为什么我会出现这样的错误 警告:mysql\u connect():没有这样的文件或目录 mysql的mysql功能: 已过时-它们不再维护 不允许轻松移动到其他数据库后端 因此,不要支持预先准备好的语句 鼓励程序员使用连接

为什么不应该使用
mysql.*
函数的技术原因是什么?(例如
mysql\u query()
mysql\u connect()
mysql\u real\u escape\u string()

即使他们在我的网站上工作,我为什么还要使用其他东西

如果他们在我的网站上不起作用,为什么我会出现这样的错误

警告:mysql\u connect():没有这样的文件或目录


mysql的
mysql
功能:

  • 已过时-它们不再维护
  • 不允许轻松移动到其他数据库后端
  • 因此,不要支持预先准备好的语句
  • 鼓励程序员使用连接来构建查询,从而导致SQL注入漏洞

  • 原因有很多,但也许最重要的一个是,这些函数鼓励不安全的编程实践,因为它们不支持预先准备好的语句。准备好的语句有助于防止SQL注入攻击

    使用
    mysql.*
    函数时,必须记住通过
    mysql\u real\u escape\u string()
    运行用户提供的参数。如果您只在一个地方忘记了,或者碰巧只漏掉了部分输入,那么您的数据库可能会受到攻击

    PDO
    mysqli
    中使用预先准备好的语句将使这些编程错误更难发生。

    MySQL扩展:

    • 未在积极开发中
    • 自PHP5.5(2013年6月发布)起正式发布
    • 自PHP7.0(2015年12月发布)起,已完全
      • 这意味着到目前为止,任何受支持的PHP版本中都不存在它。如果您使用的是一个支持它的PHP版本,那么您使用的是一个不会修复安全问题的版本
    • 缺少OO接口
    • 不支持:
      • 非阻塞异步查询
      • 或参数化查询
      • 存储过程
      • 多语句
      • 交易
      • “新”密码身份验证方法(MySQL 5.6中默认开启;5.7中需要)
      • MySQL 5.1或更高版本中的任何新功能
    由于它已被弃用,使用它会使您的代码不太经得起未来的考验

    缺少对预处理语句的支持尤其重要,因为它们提供了一种比使用单独的函数调用手动转义外部数据更清晰、更不容易出错的转义和引用外部数据的方法

    请参阅。

    ,因为(除其他原因外)更难确保输入数据被净化。如果使用参数化查询,就像使用PDO或mysqli一样,可以完全避免风险

    例如,有人可以使用
    “enhzflep”;drop table users“
    作为用户名。旧函数将允许每个查询执行多个语句,因此类似于那个讨厌的bug可以删除整个表

    如果要使用mysqli的PDO,用户名将变成
    “enhzflep”;drop table users“


    请参阅。

    首先,让我们从我们给每个人的标准评论开始:

    。它们不再得到维护。看到了吗?相反,学习,并使用or-将帮助您决定哪一个。如果您选择PDO

    让我们一句一句地看一遍,并解释:

    • 它们不再被维护,并被正式弃用

      这意味着PHP社区正在逐渐放弃对这些非常古老的函数的支持。它们可能不存在于未来(最新)版本的PHP中!继续使用这些函数可能会在不久的将来破坏代码

      新的!-ext/mysql现在是

      更新的!ext/mysql
    • 相反,你应该学习准备好的陈述

      mysql.*
      扩展不支持预处理语句,这是(除其他外)针对SQL注入的非常有效的对策。它修复了MySQL相关应用程序中的一个非常严重的漏洞,该漏洞允许攻击者访问您的脚本并对数据库执行任何可能的查询

      有关更多信息,请参见

    • 看到红色框了吗?

      当您转到任何
      mysql
      函数手册页面时,您会看到一个红色框,说明不应再使用它

    • 使用PDO或MySQLi

      还有更好、更健壮、构建良好的替代方案,,它为数据库交互提供了完整的OOP方法,,这是MySQL特有的改进


      • PHP提供了三种不同的API来连接MySQL。这些是(从PHP7开始删除)和扩展

        mysql的
        mysql.*
        函数过去非常流行,但现在不再鼓励使用它们了。文档团队正在讨论数据库的安全情况,教育用户远离常用的ext/mysql扩展就是其中的一部分(检查)

        后来的PHP开发团队决定在用户连接MySQL时生成错误,无论是通过
        MySQL\u connect()
        MySQL\u pcconnect()
        还是
        ext/MySQL
        内置的隐式连接功能

        ext/mysql
        过去和现在

        看到红色框了吗?

        当您进入任何
        mysql.*
        函数手册页面时,您会看到一个红色框,说明不应再使用它

        为什么?
        离开
        ext/mysql
        不仅仅是为了安全,而且是为了访问mysql数据库的所有功能

        ext/mysql
        是为mysql 3.23而构建的,从那时起,它只得到了很少的添加,而大部分都是保留的
        error_reporting = E_ALL ^ E_DEPRECATED
        
        $link = mysql_connect('localhost', 'user', 'pass');
        mysql_select_db('testdb', $link);
        mysql_set_charset('UTF-8', $link);
        
        $db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');
        
        $db = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF-8', 
                      'username', 
                      'password',
                      array(PDO::ATTR_EMULATE_PREPARES => false,
                      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
        
        $db = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF-8', 
                      'username', 
                      'password');
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        
        //Connected to MySQL
        $result = mysql_query("SELECT * FROM table", $link) or die(mysql_error($link));
        
        $stmt->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );
        $stmt->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
        $stmt->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
        
        try {
            //Connect as appropriate as above
            $db->query('hi'); //Invalid query!
        } 
        catch (PDOException $ex) {
            echo "An Error occured!"; //User friendly message/message you want to show to user
            some_logging_function($ex->getMessage());
        }
        
        function data_fun($db) {
            $stmt = $db->query("SELECT * FROM table");
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        }
        
        //Then later
        try {
            data_fun($db);
        }
        catch(PDOException $ex) {
            //Here you can handle error and show message/perform action you want.
        }
        
        <?php
        $result = mysql_query('SELECT * from table') or die(mysql_error());
        
        $num_rows = mysql_num_rows($result);
        
        while($row = mysql_fetch_assoc($result)) {
            echo $row['field1'];
        }
        
        <?php
        $stmt = $db->query('SELECT * FROM table');
        
        while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            echo $row['field1'];
        }
        
        <?php
        $stmt = $db->query('SELECT * FROM table');
        $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
        
        //Use $results
        
        <?php
        foreach($db->query('SELECT * FROM table') as $row) {
            echo $row['field1'];
        }
        
         $stmt->fetch(PDO::FETCH_ASSOC)
        
        <?php
        $stmt = $db->query('SELECT * FROM table');
        $row_count = $stmt->rowCount();
        echo $row_count.' rows selected';
        
        <?php
        $result = $db->exec("INSERT INTO table(firstname, lastname) VAULES('John', 'Doe')");
        $insertId = $db->lastInsertId();
        
        <?php
        $results = mysql_query("UPDATE table SET field='value'") or die(mysql_error());
        echo mysql_affected_rows($result);
        
        <?php
        $affected_rows = $db->exec("UPDATE table SET field='value'");
        echo $affected_rows;
        
         $stmt->bindParam(':bla', $bla);
        
        <?php
        $stmt = $db->prepare("SELECT * FROM table WHERE id=:id AND name=:name");
        $stmt->execute(array(':name' => $name, ':id' => $id));
        $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
        
        class person {
            public $name;
            public $add;
            function __construct($a,$b) {
                $this->name = $a;
                $this->add = $b;
            }
        
        }
        $demo = new person('john','29 bla district');
        $stmt = $db->prepare("INSERT INTO table (name, add) value (:name, :add)");
        $stmt->execute((array)$demo);
        
        <?php
        $stmt = $db->prepare("INSERT INTO folks (name, add) values (?, ?)");
        $stmt->bindValue(1, $name, PDO::PARAM_STR);
        $stmt->bindValue(2, $add, PDO::PARAM_STR);
        $stmt->execute();
        
        $stmt = $db->prepare("INSERT INTO folks (name, add) values (?, ?)");
        $stmt->execute(array('john', '29 bla district'));
        
        $stmt = $db->prepare("SELECT * FROM table WHERE id=:id AND name=:name");
        $stmt->execute(array(':name' => $name, ':id' => $id));
        $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
        
        $stmt = $db->prepare("INSERT INTO table(field1,field2) VALUES(:field1,:field2)");
        $stmt->execute(array(':field1' => $field1, ':field2' => $field2));
        $affected_rows = $stmt->rowCount();
        
        $stmt = $db->prepare("DELETE FROM table WHERE id=:id");
        $stmt->bindValue(':id', $id, PDO::PARAM_STR);
        $stmt->execute();
        $affected_rows = $stmt->rowCount();
        
        $stmt = $db->prepare("UPDATE table SET name=? WHERE id=?");
        $stmt->execute(array($name, $id));
        $affected_rows = $stmt->rowCount();
        
        $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        $pdo->query('SET NAMES GBK');
        $stmt = $pdo->prepare("SELECT * FROM test WHERE name = ? LIMIT 1");
        $stmt->execute(array(chr(0xbf) . chr(0x27) . " OR 1=1 /*"));
        
        function paraQuery()
        {
            $args  = func_get_args();
            $query = array_shift($args);
            $query = str_replace("%s","'%s'",$query); 
        
            foreach ($args as $key => $val)
            {
                $args[$key] = mysql_real_escape_string($val);
            }
        
            $query  = vsprintf($query, $args);
            $result = mysql_query($query);
            if (!$result)
            {
                throw new Exception(mysql_error()." [$query]");
            }
            return $result;
        }
        
        $query  = "SELECT * FROM table where a=%s AND b LIKE %s LIMIT %d";
        $result = paraQuery($query, $a, "%$b%", $limit);
        
        $city_ids = array(1,2,3);
        $cities   = $db->getCol("SELECT name FROM cities WHERE is IN(?a)", $city_ids);
        
        $insert = array('name' => 'John', 'surname' => "O'Hara");
        $db->query("INSERT INTO users SET ?u", $insert);
        
        $data = $db->getAll("SELECT * FROM goods ORDER BY ?n", $_GET['order']);
        
        mysql> create table users(
            -> id int(2) primary key auto_increment,
            -> userid tinytext,
            -> pass tinytext);
        Query OK, 0 rows affected (0.05 sec)
        
        mysql> insert into users values(null, 'Fluffeh', 'mypass');
        Query OK, 1 row affected (0.04 sec)
        
        mysql> create user 'prepared'@'localhost' identified by 'example';
        Query OK, 0 rows affected (0.01 sec)
        
        mysql> grant all privileges on prep.* to 'prepared'@'localhost' with grant option;
        Query OK, 0 rows affected (0.00 sec)
        
        <?php 
        
            if(!empty($_POST['user']))
            {
                $user=$_POST['user'];
            }   
            else
            {
                $user='bob';
            }
            if(!empty($_POST['pass']))
            {
                $pass=$_POST['pass'];
            }
            else
            {
                $pass='bob';
            }
        
            $database='prep';
            $link=mysql_connect('localhost', 'prepared', 'example');
            mysql_select_db($database) or die( "Unable to select database");
        
            $sql="select id, userid, pass from users where userid='$user' and pass='$pass'";
            //echo $sql."<br><br>";
            $result=mysql_query($sql);
            $isAdmin=false;
            while ($row = mysql_fetch_assoc($result)) {
                echo "My id is ".$row['id']." and my username is ".$row['userid']." and lastly, my password is ".$row['pass']."<br>";
                $isAdmin=true;
                // We have correctly matched the Username and Password
                // Lets give this person full access
            }
            if($isAdmin)
            {
                echo "The check passed. We have a verified admin!<br>";
            }
            else
            {
                echo "You could not be verified. Please try again...<br>";
            }
            mysql_close($link);
        
        ?>
        
        <form name="exploited" method='post'>
            User: <input type='text' name='user'><br>
            Pass: <input type='text' name='pass'><br>
            <input type='submit'>
        </form>
        
        user: bob
        pass: somePass
        
        You could not be verified. Please try again...
        
        user: Fluffeh
        pass: mypass
        
        user: bob
        pass: n' or 1=1 or 'm=m
        
        The check passed. We have a verified admin!
        
        select id, userid, pass from users where userid='$user' and pass='$pass'
        
        select id, userid, pass from users where userid='bob' and pass='n' or 1=1 or 'm=m'
        
        <?php 
        
            if(!empty($_POST['user']))
            {
                $user=$_POST['user'];
            }   
            else
            {
                $user='bob';
            }
            if(!empty($_POST['pass']))
            {
                $pass=$_POST['pass'];
            }
            else
            {
                $pass='bob';
            }
            $isAdmin=false;
        
            $database='prep';
            $pdo=new PDO ('mysql:host=localhost;dbname=prep', 'prepared', 'example');
            $sql="select id, userid, pass from users where userid=:user and pass=:password";
            $myPDO = $pdo->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
            if($myPDO->execute(array(':user' => $user, ':password' => $pass)))
            {
                while($row=$myPDO->fetch(PDO::FETCH_ASSOC))
                {
                    echo "My id is ".$row['id']." and my username is ".$row['userid']." and lastly, my password is ".$row['pass']."<br>";
                    $isAdmin=true;
                    // We have correctly matched the Username and Password
                    // Lets give this person full access
                }
            }
        
            if($isAdmin)
            {
                echo "The check passed. We have a verified admin!<br>";
            }
            else
            {
                echo "You could not be verified. Please try again...<br>";
            }
        
        ?>
        
        <form name="exploited" method='post'>
            User: <input type='text' name='user'><br>
            Pass: <input type='text' name='pass'><br>
            <input type='submit'>
        </form>
        
        user: bob
        pass: somePass
        
        user: Fluffeh
        pass: mypass
        
        user: bob
        pass: n' or 1=1 or 'm=m
        
        You could not be verified. Please try again...
        
        include_once("pdo_mysql.php"); 
        
        pdo_connect("localhost", "usrABC", "pw1234567");
        pdo_select_db("test");
        
        $result = pdo_query("SELECT title, html FROM pages");  
        
        while ($row = pdo_fetch_assoc($result)) {
            print "$row[title] - $row[html]";
        }
        
        pdo_query("SELECT id, links, html, title, user, date FROM articles
           WHERE title='" . pdo_real_escape_string($title) . "' OR id='".
           pdo_real_escape_string($title) . "' AND user <> '" .
           pdo_real_escape_string($root) . "' ORDER BY date")
        
        pdo_query("SELECT id, links, html, title, user, date FROM articles
           WHERE title=? OR id=? AND user<>? ORDER BY date", $title, $id, $root)
        
        pdo_query("INSERT INTO pages VALUES (?,?,?,?,?)", $_POST);
        
        function sanitize($str) {
           return trim(strip_tags(htmlentities(pdo_real_escape_string($str))));
        }
        
        $result = pdo_query("SELECT * FROM tbl");
        while ($row = pdo_fetch_assoc($result)) {
        
        foreach ($result as $row) {
        
        $result->fetchAll();
        
        <?php
        
        define('MYSQL_LINK', 'dbl');
        $GLOBALS[MYSQL_LINK] = null;
        
        function mysql_link($link=null) {
            return ($link === null) ? $GLOBALS[MYSQL_LINK] : $link;
        }
        
        function mysql_connect($host, $user, $pass) {
            $GLOBALS[MYSQL_LINK] = mysqli_connect($host, $user, $pass);
            return $GLOBALS[MYSQL_LINK];
        }
        
        function mysql_pconnect($host, $user, $pass) {
            return mysql_connect($host, $user, $pass);
        }
        
        function mysql_select_db($db, $link=null) {
            $link = mysql_link($link);
            return mysqli_select_db($link, $db);
        }
        
        function mysql_close($link=null) {
            $link = mysql_link($link);
            return mysqli_close($link);
        }
        
        function mysql_error($link=null) {
            $link = mysql_link($link);
            return mysqli_error($link);
        }
        
        function mysql_errno($link=null) {
            $link = mysql_link($link);
            return mysqli_errno($link);
        }
        
        function mysql_ping($link=null) {
            $link = mysql_link($link);
            return mysqli_ping($link);
        }
        
        function mysql_stat($link=null) {
            $link = mysql_link($link);
            return mysqli_stat($link);
        }
        
        function mysql_affected_rows($link=null) {
            $link = mysql_link($link);
            return mysqli_affected_rows($link);
        }
        
        function mysql_client_encoding($link=null) {
            $link = mysql_link($link);
            return mysqli_character_set_name($link);
        }
        
        function mysql_thread_id($link=null) {
            $link = mysql_link($link);
            return mysqli_thread_id($link);
        }
        
        function mysql_escape_string($string) {
            return mysql_real_escape_string($string);
        }
        
        function mysql_real_escape_string($string, $link=null) {
            $link = mysql_link($link);
            return mysqli_real_escape_string($link, $string);
        }
        
        function mysql_query($sql, $link=null) {
            $link = mysql_link($link);
            return mysqli_query($link, $sql);
        }
        
        function mysql_unbuffered_query($sql, $link=null) {
            $link = mysql_link($link);
            return mysqli_query($link, $sql, MYSQLI_USE_RESULT);
        }
        
        function mysql_set_charset($charset, $link=null){
            $link = mysql_link($link);
            return mysqli_set_charset($link, $charset);
        }
        
        function mysql_get_host_info($link=null) {
            $link = mysql_link($link);
            return mysqli_get_host_info($link);
        }
        
        function mysql_get_proto_info($link=null) {
            $link = mysql_link($link);
            return mysqli_get_proto_info($link);
        }
        function mysql_get_server_info($link=null) {
            $link = mysql_link($link);
            return mysqli_get_server_info($link);
        }
        
        function mysql_info($link=null) {
            $link = mysql_link($link);
            return mysqli_info($link);
        }
        
        function mysql_get_client_info() {
            $link = mysql_link();
            return mysqli_get_client_info($link);
        }
        
        function mysql_create_db($db, $link=null) {
            $link = mysql_link($link);
            $db = str_replace('`', '', mysqli_real_escape_string($link, $db));
            return mysqli_query($link, "CREATE DATABASE `$db`");
        }
        
        function mysql_drop_db($db, $link=null) {
            $link = mysql_link($link);
            $db = str_replace('`', '', mysqli_real_escape_string($link, $db));
            return mysqli_query($link, "DROP DATABASE `$db`");
        }
        
        function mysql_list_dbs($link=null) {
            $link = mysql_link($link);
            return mysqli_query($link, "SHOW DATABASES");
        }
        
        function mysql_list_fields($db, $table, $link=null) {
            $link = mysql_link($link);
            $db = str_replace('`', '', mysqli_real_escape_string($link, $db));
            $table = str_replace('`', '', mysqli_real_escape_string($link, $table));
            return mysqli_query($link, "SHOW COLUMNS FROM `$db`.`$table`");
        }
        
        function mysql_list_tables($db, $link=null) {
            $link = mysql_link($link);
            $db = str_replace('`', '', mysqli_real_escape_string($link, $db));
            return mysqli_query($link, "SHOW TABLES FROM `$db`");
        }
        
        function mysql_db_query($db, $sql, $link=null) {
            $link = mysql_link($link);
            mysqli_select_db($link, $db);
            return mysqli_query($link, $sql);
        }
        
        function mysql_fetch_row($qlink) {
            return mysqli_fetch_row($qlink);
        }
        
        function mysql_fetch_assoc($qlink) {
            return mysqli_fetch_assoc($qlink);
        }
        
        function mysql_fetch_array($qlink, $result=MYSQLI_BOTH) {
            return mysqli_fetch_array($qlink, $result);
        }
        
        function mysql_fetch_lengths($qlink) {
            return mysqli_fetch_lengths($qlink);
        }
        
        function mysql_insert_id($qlink) {
            return mysqli_insert_id($qlink);
        }
        
        function mysql_num_rows($qlink) {
            return mysqli_num_rows($qlink);
        }
        
        function mysql_num_fields($qlink) {
            return mysqli_num_fields($qlink);
        }
        
        function mysql_data_seek($qlink, $row) {
            return mysqli_data_seek($qlink, $row);
        }
        
        function mysql_field_seek($qlink, $offset) {
            return mysqli_field_seek($qlink, $offset);
        }
        
        function mysql_fetch_object($qlink, $class="stdClass", array $params=null) {
            return ($params === null)
                ? mysqli_fetch_object($qlink, $class)
                : mysqli_fetch_object($qlink, $class, $params);
        }
        
        function mysql_db_name($qlink, $row, $field='Database') {
            mysqli_data_seek($qlink, $row);
            $db = mysqli_fetch_assoc($qlink);
            return $db[$field];
        }
        
        function mysql_fetch_field($qlink, $offset=null) {
            if ($offset !== null)
                mysqli_field_seek($qlink, $offset);
            return mysqli_fetch_field($qlink);
        }
        
        function mysql_result($qlink, $offset, $field=0) {
            if ($offset !== null)
                mysqli_field_seek($qlink, $offset);
            $row = mysqli_fetch_array($qlink);
            return (!is_array($row) || !isset($row[$field]))
                ? false
                : $row[$field];
        }
        
        function mysql_field_len($qlink, $offset) {
            $field = mysqli_fetch_field_direct($qlink, $offset);
            return is_object($field) ? $field->length : false;
        }
        
        function mysql_field_name($qlink, $offset) {
            $field = mysqli_fetch_field_direct($qlink, $offset);
            if (!is_object($field))
                return false;
            return empty($field->orgname) ? $field->name : $field->orgname;
        }
        
        function mysql_field_table($qlink, $offset) {
            $field = mysqli_fetch_field_direct($qlink, $offset);
            if (!is_object($field))
                return false;
            return empty($field->orgtable) ? $field->table : $field->orgtable;
        }
        
        function mysql_field_type($qlink, $offset) {
            $field = mysqli_fetch_field_direct($qlink, $offset);
            return is_object($field) ? $field->type : false;
        }
        
        function mysql_free_result($qlink) {
            try {
                mysqli_free_result($qlink);
            } catch (Exception $e) {
                return false;
            }
            return true;
        }