PHP、MySQL。要求人们使用 key 注册

标签 php html mysql forms post

所以我创建了一个注册页面,并尝试让它需要游戏的“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/

只需使用一个库即可。严重地。它们的存在是有原因的。

不要自己做。如果您自己制作盐,您就错了。您应该使用一个可以为您处理该问题的库。

$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/

相关文章:

php - 在 Symfony2 中计算百分比

php - 为什么将空白字符串的 json_encode 添加到数组中?

php - 无法将数据从url插入到php中的数据库

html - 如何在CSS中滑动线条?

html - CSS3 和 HTML5 导航错误

mysql - RESTful web 服务 : java. lang.NullPointerException service.AbstractFacade.findAll

php - Mysql查询-如何使用contains?

php 和数学 - 四舍五入?

php - 如何在框中显示十六进制代码颜色?

MySQL 动态键/对转换为单个记录集