1

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

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

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

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

请指出。

4

4 回答 4

6

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

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

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

最佳选择:

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

于 2012-06-17T17:20:04.413 回答
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);
于 2012-06-17T17:19:51.260 回答
3

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

加上使用 MySQL 的Password()功能也很不实用。使用带盐的哈希。Bcrypt 是我的推荐。另外,请查看PHPPass

于 2012-06-17T17:20:34.380 回答
2

防止 SQL 注入很容易:

过滤您的数据。

这不能过分强调。有了良好的数据过滤,大多数安全问题都得到了缓解,有些问题实际上被消除了。

引用你的数据。

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

转义您的数据。

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

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

于 2012-06-17T17:52:22.400 回答