我使用以下内容:
Firefox 31.0(禁用Cookie) WAMP Server 2。
问题在于,即使我使用正确的登录帐户,浏览器也会将我重定向回登录页面。
<?php
if (isset($_POST['login']))
{
session_start();
$username = isset($_POST['username']);
$password = isset($_POST['password']);
$con = mysql_connect('localhost','root',"") or die ("Connection Failed.");
mysql_select_db('abel', $con) or die ("Database connection Error.");
if (empty($_POST['username']) || empty($_POST['password']))
{
header ('Location: login.php');
die();
}
$result=mysql_query("SELECT * FROM users WHERE username= '".$username."' AND password='".$password."'");
$row = mysql_fetch_assoc($result);
if(mysql_num_rows($result) != 0)
{
//echo "GOOD";
$_SESSION['SES_ID'] = $row['user_id'];
$_SESSION['SES_UNAME'] = $row['username'];
header('location: home.php');
die();
}
else
{
//echo "BAD";
header('location: login.php');
die();
}
}
?>
问题(我认为)如果不在查询上则在If Else上。它跳过IF下的语句,直接跳转到ELSE语句,再次将我重定向回登录页面。
代码没有错误,但可能是逻辑错误,或者是浏览器。感谢您的帮助。
答案 0 :(得分:5)
$username = isset($_POST['username']);
$password = isset($_POST['password']);
这会将用户名和密码设置为仅指示是否存在已发布值的布尔值。由于您在查询中使用这些变量,查询将失败(除非您的用户'1'的密码为'1')。
一种可能的,但不是很好的解决方法是:
$username = $_POST['username'];
$password = $_POST['password'];
但是你对SQL注入是开放的,因为任何人都可以发布任何字符来打破你的查询。如果密码包含;
或更糟的情况怎么办:部分SQL语句?
所以更好的是:
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
mysql_real_escape_string将转义无效字符,因此可以在查询中非常安全地使用它们。 但是,您仍然使用过时的,已弃用的函数集来连接和使用MySQL。因此,请阅读MySQL introduction page上的警告(对于与此库相关的几乎所有其他页面也会重复此警告)。
自PHP 5.5.0起,此扩展程序已弃用,不建议使用 用于编写新代码,因为它将来会被删除。代替, 要么使用mysqli,要么使用PDO_MySQL扩展名。另见 MySQL API Overview在选择MySQL API时提供进一步的帮助。
到目前为止,MySQL。下一章是发送和存储密码。你应该优先通过HTTPS(也许你已经这样做了,我希望如此)。通常,您不应将密码作为纯文本存储在数据库中。实际上你也不应该加密它们。你应该哈希它们。即使这样,添加一些 salt 。 具体细节在这里需要解释,但对此有很好的解释。这是一个随机的:Serious Security: How to store your users' passwords safely
答案 1 :(得分:3)
第一个问题:
$username = isset($_POST['username']);
$password = isset($_POST['password']);
isset
返回一个布尔值。所以在您使用$username
的脚本中进一步说明它是真/假而不是提交的数据。
安全问题:
在将用户提交的数据传递给打开SQL注入的SQL语句时,您不会转义它。如果您坚持使用mysql
,那么我建议您在MySQL查询之前添加:
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
答案 2 :(得分:0)
在var中设置isset函数的返回值将替换您通过浏览器发布的原始值。
$username = isset($_POST['username']);
我建议您使用更好的SQL处理方法,例如使用PDO扩展。