下面的代码是用php编写的:
$user = addslashes($_POST['user']);
$pwd = addslashes($_POST['pwd']);
$query = "SELECT * FROM userdata WHERE UserName='$user' AND Password=PASSWORD('$pwd')";
然后查询将被发送到 mysql 还有什么我需要处理的吗?
请指出。
下面的代码是用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']);
为了更好的安全性,请使用准备好的声明。
最佳选择:
您可能会问选择哪一个,请查看:
没有。
原因是,虽然单引号'
不是破坏 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);
不,您不应该addslashes()
用来转义您的数据。这已经过时多年了。你应该是:
mysql_real_escape_string()
替代品加上使用 MySQL 的Password()
功能也很不实用。使用带盐的哈希。Bcrypt 是我的推荐。另外,请查看PHPPass。
防止 SQL 注入很容易:
过滤您的数据。
这不能过分强调。有了良好的数据过滤,大多数安全问题都得到了缓解,有些问题实际上被消除了。
引用你的数据。
如果您的数据库允许(MySQL 允许),请在 SQL 语句中的所有值周围加上单引号,而不管数据类型如何。
转义您的数据。
有时有效数据会无意中干扰 SQL 语句本身的格式。使用mysql_escape_string()
或转义特定数据库的本机功能。如果没有特定的,addslashes()
是一个很好的最后手段。
阅读更多: http: //phpsec.org/projects/guide/3.html#3.2