首页 文章

从MySQL更改为MySQLi或PDO

提问于
浏览
0

我已经使用PHP和MySQL近两年了,我发现 mysql 非常容易使用,但它有安全问题,并且's why I'将从 mysql 更改为MySQLi,我想知道:MySQLi是否更安全比 mysql

关于MySQLi查询:我应该像以下那样只添加一个' i '到旧的 mysql (只是一个例子)?

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更安全吗?

2 回答

  • 1

    安全问题来自所谓的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 的帐户并不合理,我们就会有人在没有使用密码的情况下登录 .

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

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

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

    如果注入变量, mysqlmysqliPDO 将无法保护您 . PDO和MySQLi允许您使用处理该问题的预准备语句 . 如果您问我以下原因,PDO会更好 .

    • 不依赖于MySQL数据库(数据库不可知)

    • 允许命名占位符,例如 :name 或仅 ? 索引占位符

    • 更好的OOP支持

    • 通常支持更多功能

    但如果你不了解威胁,那么没有人可以保证你的安全 .

  • 2

    如果你要连接你的查询,所使用的技术的安全性并不重要......那就是Choosing an API .

相关问题