php - 从 mysql_query 转换为准备好的语句(mysqli/PDO)?必要的?

标签 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();
}

...不会再工作了。我在我的代码中经常使用类似的东西。我还阅读了很多关于准备好的语句如何更好地防止注入(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/

相关文章:

php - 服务器没有获取 css 文件

php - 使用 MySQLi 和 PHP 未将数据提交到 SQL 数据库

mysql -\n 导出 MySQL 数据库时出错

php - Google Drive API - 列出文件及其权限

php - 如何更改我网站上的页眉和页脚?

php - 使用 PDO 插入两行而不是一个 MySQL

php - 使用 PHP 确认提示删除记录

php - Phalconphp - 如何切换到缓冲查询

php mysql日期/时间问题

php - 如何最大化 Get 查询长度?