我一直在读一些关于在php中使用mysqli和pdo来使用mysql的问题。
我见过像mysqli or PDO - what are the pros and cons?或Moving from mysql to mysqli or pdo?这样的问题,它们都专门处理mysqli v。我对这两种方法中哪种更好并不是很感兴趣。
我想知道为什么应该避免使用mysql_函数。当然,根据PHP的文档http://php.net/manual/en/faq.databases.php#faq.databases.mysql.deprecated,它们正在被弃用的过程中,线程PHP PDO and MySQLi暗示PDO和MySQLi更强大,而线程What is the difference between MySQL, MySQLi and PDO?暗示这些新方法更安全。
总而言之,我想知道mysql_方法中最大的弱点是什么,以及避免它的原因是什么(我猜更具体地说,不仅仅是因为它被弃用了)。我计划更新我的受影响的脚本,并开始好奇为什么这个旧方法会被弃用。
谢谢!
发布于 2012-08-24 01:47:27
mysql_query函数的设计是这样的:您必须小心地转义注入其中的每一位数据,如果遗漏了一位数据,整个应用程序都会被automatic SQL vulnerability exploit tool破坏。
mysqli和PDO都支持占位符,这是确保您的查询不受SQL注入错误影响所必需的。在所有东西上调用mysql_real_escape_string不仅单调乏味,而且容易出错,这就是问题所在。
mysql函数是PHP早期的产物,与mysqli提供的新的面向对象特性相比,它的局限性要大得多。
使用这两个新接口中的一个有很多非常好的理由,但最重要的是,mysql_query函数太危险了,不能在生产代码中使用。有了它,你将永远远离一些非常严重的问题的一个错误。
充满密码和信用卡号码的数据库不断出现是有原因的。拥有一个明显的SQL注入点使得完全接管一个站点变得非常容易。
发布于 2012-08-24 01:52:21
从选择MySSQL API @ PHP.net开始
// mysqli
$mysqli = new mysqli("example.com", "user", "password", "database");
$result = $mysqli->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $result->fetch_assoc();
echo htmlentities($row['_message']);
// PDO
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
$statement = $pdo->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['_message']);
// mysql
$c = mysql_connect("example.com", "user", "password");
mysql_select_db("database");
$result = mysql_query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = mysql_fetch_assoc($result);
echo htmlentities($row['_message']);像mysqli和PDO一样创建对象是编写任何现代软件的推荐方式。mysql liblary是为PHP 2.0版本发布的,从那时起就没有进行过重大重写。PHP2.0是1997年发布的,这应该足以解释为什么不使用它。
发布于 2012-08-24 01:42:22
首先,如果您不能正确地手动清理输入,那么mysql函数极易发生SQL注入。mysqli和pdo已经将sql语句选项参数化,从而避免了这种风险。在我看来,它们通常也有更好的编码风格。
https://stackoverflow.com/questions/12097245
复制相似问题