从mysql_query转换为预准备语句(mysqli / PDO)?必要?

时间:2012-08-29 01:29:07

标签: php mysql pdo mysqli sql-injection

过去几周我一直在学习PHP和MySQL,现在我刚刚听到准备好的语句和PDO / mysqli。我做了一些阅读,人们说的是:

$getFromDatabase = mysql_query("SELECT * FROM table WHERE userid='$id'");
while($row = mysql_fetch_assoc($getFromDatabase)){
    stuff();
}

......将不再适用。我在代码中经常使用这样的东西。我也在阅读很多关于预备语句如何更好地防止注入的内容。我已经彻底了解它是如何更好的,但它是否更好,值得切换远离mysql_real_escape_string()?是否有必要切换到Mysqli或PDO?在什么情况下可以绕过准备好的语句不能绕过mysql_real_escape_string()?

1 个答案:

答案 0 :(得分:7)

这是必要的,因为mysql_query在软件方面是一个古老的神器。它是MySQL Model T的MySQL数据库接口,笨重,不可靠,如果没有使用完全,那就完全是危险的。如果你不是非常小心,你就会犯错误,如果有人在你的网站上使用automatic SQL injection bug detection tool,即使是一个小小的错误都不会被忽视。

基本上你是靠mysql_query借来的。

如果您使用mysqli或PDO并且非常努力使用占位符,那么SQL注入错误的风险非常低。要弄清楚如何将旧代码转换为这些新方法可能需要大约半个小时,实际上并没有陡峭的学习曲线,而且这些知识将来会为您节省很多麻烦。如果使用mysqli和基本占位符,转换现有代码通常不会太大。我敢打赌你在修补时会发现一些严重的错误。

就收益而言,您不需要进行mysql_real_escape_string次调用,只需使用bind_param,就不必担心错过某个变量。从长远来看,这实际上要少得多。

此外,使用?或像:id这样的命名占位符可以使您的查询更加容易阅读,调试和维护。此外,您可以重复使用相同的语句并将不同的值绑定到它,最终使您的应用程序更快。

可以使用mysql_query编写安全代码,但为什么会这样?该接口被列为已弃用,这是从PHP完全删除它的初步阶段。如果您需要面向未来的应用程序,最好使用其中一个受支持的接口。