这个SQL查询是否可以安全地注入?

时间:2012-06-17 17:17:31

标签: php mysql sql sql-injection security

以下代码用php编写:

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

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

然后将查询发送到mysql 还有什么我需要照顾的吗?

请指出。

4 个答案:

答案 0 :(得分:6)

不,不安全,请在 最低 时使用mysql_real_escape_string

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

对于更好安全性,请转到prepared statements

最佳 选项:

您可以询问选择哪一个,请查看:

答案 1 :(得分:5)

不。

原因是虽然单引号'不是唯一打破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);

答案 2 :(得分:3)

没有。您应使用addslashes()来转义数据。这已经过了已经过时了。你应该是:

另外,使用MySQL的Password()功能也很差。使用哈希与盐。 Bcrypt是我的推荐。另外,请查看PHPass

答案 3 :(得分:2)

保护SQL注入很容易:

过滤您的数据。

这不能过分强调。通过良好的数据过滤,可以减轻大多数安全问题,并且实际上可以消除一些安全问题。

引用您的数据。

如果您的数据库允许(MySQL确实如此),请在SQL语句中的所有值周围放置单引号,而不管数据类型如何。

逃避您的数据。

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

了解详情:http://phpsec.org/projects/guide/3.html#3.2