什么时候应该转义MySQL中使用的字符串

时间:2014-04-24 23:37:45

标签: php mysql mysql-real-escape-string

我是PHP的新手,但已经熟悉StackOverflow一段时间了。

我最近一直在阅读关于使用mysql_real_escape_string的适当时间,并对以下任何建议表示感谢。

在初始$ _POST变量上使用mysql_real_escape_string一次足以通过脚本保护字符串?

例如:

$username = mysql_real_escape_string($_POST["username"]);
$password = mysql_real_escape_string($_POST["password"]);
$email = mysql_real_escape_string($_POST["email"]);
$repeat_password = mysql_real_escape_string($_POST["repeat_password"]);

我在运行一堆if语句之前声明了这些值,最后在if语句完成之后我将一个INSERT插入到mysql数据库中:

mysql_query("INSERT INTO users (username, password, email, signup_date) VALUES ('$username', '$password', '$email', CURDATE())") or die(mysql_error());
在整个if语句的其他任何地方都没有使用mysql_real_escape_string - 这对于新手来说是否足够安全,同时仍能保持一些注射保护?

3 个答案:

答案 0 :(得分:1)

不,这不安全。您应该切换到prepared statements

答案 1 :(得分:1)

虽然mysql_real_escape_string()可以(当前)保护你免受SQL注入已弃用所以你不应该使用mysql_ *函数,在未来的PHP版本中它将被删除,因为你的代码无用。

当你拥有闪亮的新兰博基尼的钥匙时,为什么要驾驶一辆破旧的福特嘉年华?

Don't use mysql_* functions in new code。它们不再被维护and are officially deprecated。请参阅red box?转而了解prepared statements,并使用PDOMySQLi - this article将帮助您确定哪个。如果您选择PDO here is a good tutorial

答案 2 :(得分:0)

尝试准备好的声明:

$stmt = $con->prepare("INSERT INTO users (`username`, `password`, `email`, `signup_date`) VALUES (?, ?, ?, ?)");
$stmt->bind_param($username,$password,$email,CURDATE());
$stmt->execute();
$stmt->close();