2

过去几周我一直在学习 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() 可以在准备好的语句无法绕过的情况下被绕过?

4

1 回答 1

7

这是必要mysql_query的,因为在软件方面,它是一个古老的人工制品。它是 MySQL 数据库接口的T 型模型,如果不完全按照您应该使用的方式使用,那么笨重、不可靠并且非常危险。如果您不是非常小心,您会犯错误,如果有人在您的站点上使用自动 SQL 注入错误检测工具,即使是很小的错误也不会被忽视。

基本上你是靠借来的时间生活mysql_query

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

就好处而言,您无需拨打任何mysql_real_escape_string电话,只需使用bind_param,您就不必担心错过某个变量的转义。从长远来看,实际上工作量要少得多。

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

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

于 2012-08-29T01:35:14.717 回答