此 SQL 查询是否安全,无法注入


Is this SQL query safe from injection?

下面的代码是用php编写的:

$user = addslashes($_POST['user']);
$pwd = addslashes($_POST['pwd']);
$query = "SELECT * FROM userdata WHERE UserName='$user' AND Password=PASSWORD('$pwd')";

然后查询将被发送到 MySQL我还有什么需要处理的吗?

请指出。

不,这不安全,至少使用mysql_real_escape_string

$user = mysql_real_escape_string($_POST['user']);
$pwd = mysql_real_escape_string($_POST['pwd']);

为了更好的安全性,请使用准备好的声明。

最佳选择:

  • PDO地址
  • Mysqli

您可能会问选择哪一个,请查看:

  • mysql,mysqli和pdo有什么区别?

不。

原因是,虽然单引号'不是破坏 sql 查询的唯一字符,但引号是 addslashes() 转义的唯一字符。

更好:使用mysql_real_escape_string

$user = mysql_real_escape_string($_POST['user'], $conn);
$pwd = mysql_real_escape_string($_POST['pwd'], $conn);
$query = "SELECT * FROM userdata WHERE UserName='$user' AND Password=PASSWORD('$pwd')";

最佳:使用 PDO 和预准备语句

$stmt = $dbh->prepare("SELECT * FROM userdata WHERE UserName=':user' AND Password=PASSWORD(':pass')");
$stmt->bindParam(':user', $user);
$stmt->bindParam(':pass', $pass);

No.不应使用addslashes()来转义数据。这已经过时多年了。您应该是:

  • 使用mysql_real_escape_string()作为替代品
  • 将预准备语句与 PDO 或 MySQLi 结合使用

另外,使用MySQL的Password()函数也是很差的实践。使用带有盐的哈希值。Bcrypt是我的推荐。另外,请查看PHPass。

防止 SQL 注入很容易:

筛选数据。

这一点怎么强调都不为过。通过良好的数据过滤,大多数安全问题都会得到缓解,有些问题实际上已经消除。

引用您的数据。

如果您的数据库允许(MySQL 允许),请将单引号括在 SQL 语句中的所有值上,无论数据类型如何。

转义您的数据。

有时,有效数据可能会无意中干扰 SQL 语句本身的格式。使用特定数据库本机的mysql_escape_string()或转义函数。如果没有特定的,addslashes()是一个很好的最后手段。

阅读更多:http://phpsec.org/projects/guide/3.html#3.2