【问题标题】:Changing from MySQL to MySQLi or PDO从 MySQL 更改为 MySQLi 或 PDO
【发布时间】:2015-08-05 22:24:44
【问题描述】:

我已经使用 PHP 和 MySQL 将近两年了,我发现 mysql 非常好用,但是它存在安全问题,这就是为什么我要从 mysql 更改为 @987654321 @,我想知道:MySQLi 是否比 mysql 更安全?

关于 MySQLi 查询:我是否应该在旧的 mysql 中添加一个“i”,如下所示(只是一个示例)?

mysql

if (mysql_query('insert into users (username, password, regdate)
                 values ("'.$username.'", "'.$password.'", "'.time().'")')) {
    echo 'Inserted!';
}
else
{
    echo "something is wrong";
}

到 MySQLi:

if (mysqli_query('insert into users (username, password, regdate)
                  values ("'.$username.'", "'.$password.'", "'.time().'")')) {
    echo 'Inserted!';
}
else {
    echo "something is wrong";
}

我也听说过 PDO:PDO 是否比 MySQLi 更安全?

【问题讨论】:

标签: php mysql mysqli pdo


【解决方案1】:

如果您要连接查询,所用技术的安全性并不重要...也就是说,有 Choosing an API

【讨论】:

    【解决方案2】:

    安全问题来自所谓的SQL injection。为了了解如何使其更安全,您必须首先了解它是如何工作的。使用一个非常糟糕的查询的基本示例:

       mysql_query('SELECT FROM user WHERE username="'.$_POST['username'].'" AND password="'.$_POST['username'].'"');
    

    这个查询有两个主要问题。第一个也是最明显的是,值是在没有对其进行卫生处理的情况下添加的。这是一个典型的 SQL 注入示例。在此示例中,用户可以提交用户名,如下所示..

     'admin" --';
    

    现在这有什么不好?因为我们没有过滤这个(主要是为了报价),所以我们的查询看起来像这样:

     SELECT * FROM user WHERE username="admin" --" AND password="'.$_POST['username'].'"
    

    要完全理解这一点,您必须知道-- 是内联注释的开始(很像PHP 中的//),在数据库运行之后什么都没有。鉴于此,这就是我们剩下的。

     SELECT * FROM user WHERE username="admin"
    

    现在,如果我们通过查看密码是否返回一行来验证密码,并且有一个名为 admin 的帐户,这不是不合理的,我们就会有人在没有使用密码的情况下登录。

    第二个不太明显的问题是发送密码并使用查询进行验证。如果我们以这种方式构造它(伪代码):

       SELECT password FROM user WHERE username="admin"
       if( returned password == submitted password )
    

    他们仍然需要密码,因为我们是在代码(应用层)中进行评估,而不是在数据库中。

    mysqlmysqliPDO 在注入变量时不会保护您。 PDO 和MySQLi 允许您使用准备好的语句来处理该问题。如果您出于以下原因问我,PDO 是两者中的佼佼者。

    • 不依赖于 MySQL 数据库(与数据库无关)
    • 允许命名占位符,例如 :name 代替或仅使用 ? 索引占位符
    • 更好的 OOP 支持
    • 一般支持更多功能

    但是,如果您不了解威胁,谁都无法保证您的安全。

    【讨论】:

    • 当然可以。有时只需要一个简单的解释,然后一切都会点击。很高兴我能帮您指明道路,继续卡车运输。
    猜你喜欢
    • 2018-02-07
    • 2014-01-31
    • 2014-02-05
    • 1970-01-01
    • 2020-01-29
    • 2010-10-20
    • 1970-01-01
    • 2013-11-06
    • 2019-09-04
    相关资源
    最近更新 更多