所以我创建了一个注册页面,并尝试让它需要游戏的“alpha”键,但我无法让它工作。我的数据库中已包含所有信息,但它只是出现错误“ERR 02:无法注册!”
<!doctype html>
<html>
<head>
<title>Register</title>
</head>
<body>
<h3>Registration Form</h3>
<form action="" method="POST">
Alpha Key: <input type=text name='alphakey'><br/>
Username: <input type=text name='user'><br/>
Password: <input type=password name='pass'><br/>
<input type=submit value='Register' name='submit'>
</form>
<?php
if (isset($_POST['submit'])){
if(!empty($_POST['user']) && !empty($_POST['pass'])) {
//mysql_real_escape_string() escapes special characters in a string for use in an SQL statement
$user=mysql_real_escape_string($_POST['user']);
$pass=mysql_real_escape_string($_POST['pass']);
$alphakey=mysql_real_escape_string($_POST['alphakey']);
$con=mysql_connect('localhost','<my_user>','<my_password>') or die(mysql_error());
mysql_select_db('user') or die("cannot select DB");
$query=mysql_query("SELECT * FROM login WHERE user='".$user."'");
//$query.=mysql_query("SELECT * FROM regkey WHERE alphakey='".$_POST["alphakey"]."'");
$numrows=mysql_num_rows($query);
if($numrows==0)
{
//md5() calculates the MD5 hash of a string
//$encrypt_password=password_hash($pass, PASSWORD_DEFAULT);
$encrypt_password=md5($_POST["pass"]);
$sql="INSERT INTO login(user,pass) VALUES('".$_POST["user"]."','$encrypt_password')";
$sql.="SELECT * FROM regkey WHERE alphakey='".$_POST["alphakey"]."'";
$result=mysql_query($sql);
if($result!=1)
{
echo "ERR 02: Failed to register";
}
else{
echo "Account Successfully Created";
}
} else {
echo "That username already exists! Please try again with another.";
}
} else {
echo "All fields are required!";
}
}
?>
<p><a href="register.php">Register</a> | <a href="login.php">Login</a></p>
</body>
</html>
最佳答案
我会使用以下方法。
前言:请查阅我有关不安全函数使用的脚注。
首先检查reg key是否存在,然后插入DB。
$query = mysql_query("SELECT * FROM login WHERE user='".$user."'");
$numrows = mysql_num_rows($query);
// if user doesn't exist...
if($numrows==0) {
$encrypt_password = md5($_POST["pass"]);
$query_key = mysql_query("SELECT * FROM regkey WHERE alphakey='".$_POST["alphakey"]."'")
or die(mysql_error());
$check_key = mysql_num_rows($query_key);
if($check_key >0){
$sql = mysql_query("INSERT INTO login (user,pass)
VALUES ('".$_POST["user"]."','$encrypt_password')")
or die(mysql_error());
}
} // brace for if($numrows==0)
if($sql){
echo "Success.";
}
- 尝试一下。如果您有任何问题或者我可能误解了这个问题,请告诉我,我很乐意相应地调整我的答案。
脚注:
您当前的代码已开放给 SQL injection 。使用prepared statements ,或PDO with prepared statements ,它们更安全。
密码存储:
您正在使用 MD5,这是一种旧的且被认为已损坏的哈希方法,并且不再被认为可以安全使用。
我建议您使用CRYPT_BLOWFISH或 PHP 5.5 的 password_hash()
功能。
对于 PHP < 5.5,请使用 password_hash() compatibility pack
。
带有准备好的语句的 PDO 示例,包括使用 password_hash()
。
摘自 ircmaxell 的答案 https://stackoverflow.com/a/29778421/
只需使用一个库即可。严重地。它们的存在是有原因的。
- PHP 5.5+:使用
password_hash()
- PHP 5.3.7+:使用
password-compat
(上述的兼容包 - 所有其他:使用 phpass
不要自己做。如果您自己制作盐,您就错了。您应该使用一个可以为您处理该问题的库。
$dbh = new PDO(...);
$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $dbh->prepare("insert into users set username=?, email=?, password=?");
$stmt->execute([$username, $email, $hash]);
登录时:
$sql = "SELECT * FROM users WHERE username = ?";
$stmt = $dbh->prepare($sql);
$result = $stmt->execute([$_POST['username']]);
$users = $result->fetchAll();
if (isset($users[0]) {
if (password_verify($_POST['password'], $users[0]->password) {
// valid login
} else {
// invalid password
}
} else {
// invalid username
}
关于PHP、MySQL。要求人们使用 key 注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29942138/