过去几周我一直在学习 PHP 和 MySQL,现在才听说准备好的语句和 PDO/mysqli。我读了一些书,人们说这样的话:
$getFromDatabase = mysql_query("SELECT * FROM table WHERE userid='$id'");
while($row = mysql_fetch_assoc($getFromDatabase)){
stuff();
}
...不会再工作了。我在我的代码中经常使用类似的东西。我还阅读了很多关于准备好的语句如何更好地防止注入(inject)的内容。我已经彻底了解它如何更好,但是否值得从 mysql_real_escape_string() 切换出去?是否有必要切换到Mysqli或PDO?在什么情况下 mysql_real_escape_string() 可以绕过准备好的语句不能绕过?
最佳答案
这是必要的,因为 mysql_query
在软件方面是一个古老的神器。这是 Model T MySQL 数据库接口(interface),笨重、不可靠,如果不按应有的方式正确地使用,就会非常危险。如果您不非常小心,就会犯错误,如果有人使用 automatic SQL injection bug detection tool,即使是很小的错误也不会被忽视。在您的网站上。
基本上你是在借用mysql_query
。
如果您使用 mysqli
或 PDO 并且勤于使用占位符,那么出现 SQL 注入(inject)错误的风险非常低。弄清楚如何将旧代码转换为这些新方法可能需要大约半小时,确实没有陡峭的学习曲线,并且这些知识将为您将来省去很多麻烦。如果您使用 mysqli
和基本占位符,转换现有代码通常不是什么大不了的事。我敢打赌,您在修补时甚至会发现一些严重的错误。
在好处方面,你不需要做任何mysql_real_escape_string
调用,你可以只使用bind_param
,你不用担心错过一个逃避你的一个变量。从长远来看,这实际上减少了很多工作。
此外,使用 ?
或类似 :id
的命名占位符可使您的查询更易于阅读、调试和维护。此外,您可以重复使用相同的语句并将不同的值绑定(bind)到它,最终使您的应用程序更快。
用 mysql_query
编写安全代码是可能的,但为什么要这样做呢?该接口(interface)被列为已弃用,这是将其完全从 PHP 中删除的初步阶段。如果您想要面向 future 的应用程序,最好使用其中一种受支持的接口(interface)。
关于php - 从 mysql_query 转换为准备好的语句(mysqli/PDO)?必要的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12169742/