从MySQL更改为MySQLi或PDO

时间:2015-08-05 22:24:45

标签: php mysql mysqli pdo

我已经使用PHP和MySQL近两年了,我发现mysql非常容易使用,但它有安全问题,这就是为什么我要从{{1}更改到bullet point 2.7,我想知道:MySQLi比mysql更安全吗?

关于MySQLi查询:我是否应该像以下一样向旧mysql添加“i”(仅作为示例)?

mysql

mysql

到MySQLi:

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

我也听说过PDO,再次说:PDO比MySQLi更安全吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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支持
  • 通常支持更多功能

但如果你不了解威胁,那么任何人都不能保证你的安全。