问题是当我填写表单时,它会在sql上插入两个条目,第一个是我输入的,第二个是空白的!我真的不知道为什么它会增加第二个。
我怀疑if($result)
我认为$ result第二次执行,这就是为什么它显示空行。
<?php
$connection = mysql_connect("localhost", "db", "pass");
mysql_select_db("dbname", $connection);
$name = mysql_real_escape_string(stripslashes($_POST['name']));
$email = mysql_real_escape_string(stripslashes($_POST['email']));
$password = mysql_real_escape_string(stripslashes($_POST['pass']));
$sql="INSERT INTO users VALUES('$name','$email','$password')";
$result = mysql_query($sql);
if($result) {
echo '{"success":1}';
} else {
echo '{"success":0,"error_message":"Sorry, your registration failed. Please go back and try again."}';
}
?>
答案 0 :(得分:2)
不确定为什么要添加空白行。表格可以提交两次吗?
你可以在这里做很多事情来提高安全性。
您可以添加一些验证,例如:
此外,您不应将密码直接添加到数据库中。以原始形式存储密码是非常糟糕的做法。你应该首先添加一个'salt',这是一个只有你的应用程序知道的密钥(即任何随机字符串'dwewsd2r23345wfsdf')然后哈希整个事情。这将使任何设法访问您的数据库的黑客的生活变得更加困难。 See here for more on password hashing
最后,您应该使用PDO而不是mysql函数进行数据库查询。如果您使用准备好的语句将添加另一层安全性。 See here for more on PDO
答案 1 :(得分:0)
您为什么使用strip_slashes()
?
mysql_real_escape_string()
就足够了。虽然使用PDO准备语句当然是现代的,更安全的做事方式。
我也建议你使用:
if($result !== false)
而不是if($result)
,以确保您获得了积极的结果。
您是否可以发布查询“SHOW CREATE TABLE [table_name]”的完整结果,以便我们可以看到您的表结构?
正如其他人建议的那样,您不应该在数据库中保存纯文本密码。
function securePassword($plain_text_pw) {
$salt = 'jklolomfg99';
$salted_password = $salt . $password;
$hashed_pw = md5($hashed_pw);
return $hashed_pw;
}
function checkPassword($username,$plain_text_pw) {
$secure_pw = securePassword($plain_text_pw);
// query would look something like this:
// $sql = "SELECT `id` FROM `users` WHERE `name` = "' . $username . '"
// AND `secure_password` = "' . $secure_password . '"';
// if no results, then return false. If 1 result, return true. log user in.
}
注意:SHA1可能比MD5更安全,但您可能不会成为世界级黑客的受害者。
答案 2 :(得分:-1)
如果您的数据库表包含多于3列,E.G id,name,email,password,那么您应指定要将值插入的列。
"INSERT INTO users (name, email, password) VALUES (:name, :email, :pass);"
虽然这样做不会导致双行插入,但您需要详细说明如何将这些值发布到此文件中。您是否偶然使用jQuery来POST值但不返回false或阻止表单上的默认操作? (从JSON回应中推断出来)
此外,你没有保护或检查它甚至POST,一个机器人可以命中你的代码并导致许多空白插入,因为你没有检查任何只是盲目插入。
如果您打算将代码投入生产,请注意有关安全性的其他答案。