Php 我在代码中找不到bug
这是一个小的登录和注册程序的代码。每次用户尝试登录时,此代码都会检查电子邮件和密码是否正确。如果在mysql提示符中输入相同的查询,则该查询也可以工作。 我无法找出代码中的错误。每次我输入有效的电子邮件和密码$result都会变为FALSEPhp 我在代码中找不到bug,php,mysql,Php,Mysql,这是一个小的登录和注册程序的代码。每次用户尝试登录时,此代码都会检查电子邮件和密码是否正确。如果在mysql提示符中输入相同的查询,则该查询也可以工作。 我无法找出代码中的错误。每次我输入有效的电子邮件和密码$result都会变为FALSE <html> <head> <title>Log In</title> </head> <body> <?php $host = "localhost";
<html>
<head>
<title>Log In</title>
</head>
<body>
<?php
$host = "localhost";
$user = "root";
$password = "password";
$database = "user";
$conn = mysqli_connect($host, $user, $password, $database);
if(!$conn) {
die("Connection Error: ".mysqli_connect_error($conn));
}
$query = "select email, password from user_info where email = \'$_POST[login_email]\' or password = \'$_POST[login_password]\'";
$result = mysqli_query($conn, $query);
if(!$result)
die("failure");
if(mysqli_num_rows($result) > 0) {
$details = mysqli_fetch_assoc($result);
if($details["email"] != $_POST["login_email"] && $details["password"] != $_POST["login_password"]) {
die("Invalid username or password.");
}
echo "successful";
}
else {
die("Don't have an account yet?. Please Sign Up to get started.");
}
?>
</body>
</html>
登录
解析字符串中的数组变量是一项棘手的操作:
$query = "select email, password from user_info where email = \'$_POST[login_email]\' or password = \'$_POST[login_password]\'";
应改为:
$query = "select email, password from user_info where email = ? or password=?"
$stmt=con.prepare($query)
$stmt->bind_param("s", $_POST[login_email]);
$stmt->bind_param("s", $_POST[password]);
$stmt->execute();
$stmt->bind_result($result);
$stmt->fetch();
但是,如果登录\u电子邮件
正确或密码正确,您将得到一个结果。因此,对于此查询检查凭据,50%的正确率就足够了
下一行也很有趣:
if($details["email"] != $_POST["login_email"] && $details["password"] != $_POST["login_password"])
因此,两者都必须是不正确的才能出错。同样,只要有一个用户名或随机密码(甚至不知道它属于哪个用户),就足以登录。有点奇怪。@lalithkumar是对的。但作为临时解决方案,您可以将$query
行更改为以下内容
$query=“从用户信息中选择电子邮件、密码,其中电子邮件=”。$\u POST[“login\u email”]。”或密码=”。$\u POST[“login\u password”]。”代码>使用准备好的语句。这将导致sql注入对从表单中获取的参数进行响应。这是一件事,另一件事是,这是一个可怕的做法,你正在做什么,你被黑客在2秒钟内,sql注入。您应该通过电子邮件和密码进行查询,而不是电子邮件或密码。所以任何知道你的邮件的人都能收到。谢谢你们两位。这是一个愚蠢的错误@Arminius