Php 为什么不是';此登录页面是否检测到正确的密码?
我正在做一个PHP登录管理员。我关注了Youtube上的两个教程,所有的评论都说这很有效。但这对我不起作用 如果我输入了错误的密码,那么我会得到预期的“错误的用户名和密码”。但是如果我输入了正确的密码,我也会得到“错误的用户名和密码”。与数据库的连接似乎正常 index.htm(主登录名):Php 为什么不是';此登录页面是否检测到正确的密码?,php,login,admin,Php,Login,Admin,我正在做一个PHP登录管理员。我关注了Youtube上的两个教程,所有的评论都说这很有效。但这对我不起作用 如果我输入了错误的密码,那么我会得到预期的“错误的用户名和密码”。但是如果我输入了正确的密码,我也会得到“错误的用户名和密码”。与数据库的连接似乎正常 index.htm(主登录名): 用户名: 密码: 这是checklogin.php: <? $host = "cpanel1"; $username = "trekking_test"; $password = "test
用户名:
密码:
这是checklogin.php:
<?
$host = "cpanel1";
$username = "trekking_test";
$password = "testtest";
$db_name = "trekking_test";
$tbl_name = "members";
mysql_connect($host, $username, $password) or die (mysql_error());
mysql_select_db($db_name) or die (mysql_error_db());
$myusername = $_POST['myusername'];
$mypassword = $_POST['mypassword'];
$sql = "SELECT * FROM $tbl_name WHERE username='$myusername' and password='mypassword'";
$result = mysql_query($sql);
$count = mysql_num_rows($result);
if($count==1) {
session_register("myusername");
session_register("mypassword");
header("location:control.php");
}
else {
echo "Wrong Username or Password";
}
?>
您在SQL查询中忘记了“mypassword”之前的“$”
您的HTML表单输入字段称为“用户名”和“密码”,但您要在$\u POST数组中查找“myusername”和“mypassword”
还要阅读SQL注入。您的代码易受攻击。好吧,因为有一件事是贬值的
改为这样做:
if(!isset($_SESSION['myusername'])){...}
还添加somwhere以输出mysql错误,如:
$result = mysql_query($sql) or die(mysql_error());
表中是否有多行与查询匹配?由于您正在使用:
if($count==1) {
如果找到两个或多个匹配项,您将收到失败消息。您的输入不应该命名为“myusername”和“mypassword”吗?这就是你在用你的$_帖子['myusername']寻找的东西
我敢打赌,如果您在PHP中设置$myusername和$mypassword后立即回显它们,您会发现它们是空的,因为您没有发布'myusername',只发布'username'。好的,这很好:
$host = "cpanel1";
$username = "trekking_test";
$password = "testtest";
$db_name = "trekking_test";
你不需要这个,它会让你的SQL读起来很混乱
$tbl_name = "members";
那很好
mysql_connect($host, $username, $password) or die (mysql_error());
mysql_select_db($db_name) or die (mysql_error_db());
不错。始终转义用户输入数据编辑,并且您的表单名称不匹配:
$myusername = $_POST['username'];
$mypassword = $_POST['password'];
这应该是:
$myusername = mysql_real_escape_string($_POST['username']);
$mypassword = mysql_real_escape_string($_POST['password']);
您不需要所有列,因为您只是在检查计数,mypassword
的格式不正确
$sql = "SELECT * FROM $tbl_name WHERE username='$myusername' and password='mypassword'";
应该是:
$sql = "SELECT `username` FROM `members` WHERE `username`='$myusername' and `password`='$mypassword'";
您假设查询成功。您应始终处理以下情况:
$result = mysql_query($sql);
if(!$result) {
// Let the user know something went wrong
}
session\u register
会让不熟悉传统$\u session['name']='value'
语法的人感到困惑,请改用更传统的形式。您只想知道他们已登录,并且未调用会话\u start()
:
if($count==1) {
session_start();
$_SESSION['logged_in'] = true;
// The correct format is "Location: control.php"
header("Location: control.php");
exit; //Always exit after sending Location headers
}
else {
echo "Wrong Username or Password";
}
然后在您的页面上:
session_start();
if(!isset($_SESSION['logged_in'])) {
// Once again, Location:
header("Location: index.htm");
exit; // exit after redirect
}
这不是你问题的答案。这就是为什么YouTube教程不是完美的学习媒介
您需要清理输入以防止SQL注入。查看有关您所防范的内容的良好信息。MySQL需要的函数是,但是请记住,在连接到数据库之前不能调用它,所以请记住这一点
密码应决不以纯文本形式存储。最好使用单向散列算法。当然,这有两个自己的警告:
a。确保您选择了合适的算法<代码>MD5
和SHA1
不合适。一些查找方法有Eksblowfish
(也称为bcrypt
,不要与双向加密分组密码blowfish
)混淆)、Tiger
、SHA-256
、SHA-512
和whirpool
b。您可能认为这对于您的目的来说太过分了,但是您实践的最佳实践越多,它们对您来说就越自然,并且您将成为更好的程序员。你应该使用一种叫做nonce的循环盐来提高密码的安全性。salt是在密码加密或散列之前添加到密码中的字符串,因此传递\u hash\u actual=hash\u函数(salt+密码)
- :本文将向您介绍在PHP中针对bcrypt的具体实现,但我主要是将其链接到它所链接的文章中,这将为您提供如何以及为什么在密码中使用nonce的详细概述
if($count>0) {
如果登录详细信息正确,查询将返回一个单行结果集,如果登录详细信息不正确,则返回零行结果集。使用
mysql\u num\u rows
查找结果集中的行数,从而确定登录详细信息是否正确。我不擅长这个。。。。当我发布我的问题时,所有的HTML PHP代码都消失了。。。。我猜我在输入代码时做错了什么你有一个SQL注入漏洞。确保清理从用户inputi获得的任何数据,并为u。也接受你之前问题2的一些答案。您的代码易受SQL注入攻击:您需要在开始使用之前修复该漏洞。是的,请接受您的问题的答案。这就是这个网站的全部目的,提出问题,获得答案,让每个人都知道哪一个是正确的,这样将来人们就不必猜测了。问题是,如果我们使用username
检查登录详细信息,它必须是唯一的。记住这一点,$count
必须等于1或0,否则会出现错误,因为这意味着您需要清理坏数据。当然,如果你有一个唯一的索引,那么这个索引将被更早地捕获。talbe看起来像这个ID用户名密码--------------------1 hulemo kurbitur 2 Inthor 1234Yes,我发现了这个错误,现在我已经修复了它,它似乎正在工作:)只需点击答案旁边的复选标记,就可以回答这个(和你以前的)问题了。:)它现在起作用了。。。。但是我注意到url应该加密,对吗?这是非常可怕的重定向和路径只是admin.php…thanx的链接,我要看看它
session_start();
if(!isset($_SESSION['logged_in'])) {
// Once again, Location:
header("Location: index.htm");
exit; // exit after redirect
}
if($count>0) {