以下代码用php编写:
$user = addslashes($_POST['user']);
$pwd = addslashes($_POST['pwd']);
$query = "SELECT * FROM userdata WHERE UserName='$user' AND Password=PASSWORD('$pwd')";
然后将查询发送到mysql 还有什么我需要照顾的吗?
请指出。
答案 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_real_escape_string()
作为替代另外,使用MySQL的Password()
功能也很差。使用哈希与盐。 Bcrypt是我的推荐。另外,请查看PHPass。
答案 3 :(得分:2)
保护SQL注入很容易:
过滤您的数据。
这不能过分强调。通过良好的数据过滤,可以减轻大多数安全问题,并且实际上可以消除一些安全问题。
引用您的数据。
如果您的数据库允许(MySQL确实如此),请在SQL语句中的所有值周围放置单引号,而不管数据类型如何。
逃避您的数据。
有时,有效数据可能会无意中干扰SQL语句本身的格式。使用mysql_escape_string()
或特定数据库本机的转义函数。如果没有特定的,addslashes()
是一个不错的最后手段。