下面的代码是用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