我想知道我的查询是否可以安全地从SQL注入。
以下是PHP代码
$orderid = mysql_real_escape_string($orderid);
mysql_query("SELECT * FROM orders WHERE id =\"".$orderid."\"");
另外
如果最终用户可以将订单ID更改为他们想要的,那么他们可以在最坏情况下做什么?
答案 0 :(得分:2)
是的,您显示的示例在SQL注入时是安全的。
$ orderid中没有可以引入SQL注入的内容,假设您没有使用具有bug #8378的古老版本的MySQL客户端。如果您使用的是MySQL 4.1.20,5.0.22或5.1.11或更高版本,那么您没问题。
您收到的评论是关于风格和最佳做法的。
查询参数可以更容易使用,因为您不必担心反斜杠引号和字符串连接等等。但是对于此示例,查询参数本质上不是更安全。转义和参数化都要求您始终如一地使用它们。
PHP的mysql扩展现已正式弃用,将在未来的PHP版本中删除。这与编写更安全的代码有关,因为mysql扩展不支持参数,而其他扩展mysqli和PDO支持参数。
鼓励开发人员立即开始使用mysqli或PDO扩展,这样一旦发生这种情况,你就不会在不重写所有代码的情况下升级PHP版本。
这可以帮助您:http://phpmaster.com/migrate-from-the-mysql-extension-to-pdo/
标准SQL使用单引号来分隔字符串和日期文字。 MySQL也为此目的支持双引号,但这取决于SQL_MODE的设置。如果您希望代码更稳定和标准,请使用单引号作为字符串/日期文字。
此外,它对您来说更容易,因为您不必在PHP双引号字符串中使用反斜杠单引号。
mysql_query("SELECT * FROM orders WHERE id = '".$orderid."'");
如果您的id
列是一个整数,那么将$ orderid转换为整数也很简单,这也同样安全,使您的代码更简洁,更简单:
$orderid = (int) $orderid;
mysql_query("SELECT * FROM orders WHERE id = $orderid");