我是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 - 这对于新手来说是否足够安全,同时仍能保持一些注射保护?
答案 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,并使用PDO或MySQLi - 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();