我要把我的胡言乱语扯下来。无法理解为什么下面的代码不能工作。页面加载正常,但是当我尝试用我的数据库中的用户名和密码登录时,页面就会被重新加载到它的原始状态,而我实际上希望看到一个注销按钮。我还尝试将没有salt和hash的密码与数据库中未散列、未加盐的等价物进行比较。不起作用。
我得到的唯一警告是,“依赖系统的时区设置是不安全的”,,我认为这与密码验证功能没有任何关系。
页面的开头如下:
session_start();
error_reporting(-1); ini_set('display_errors', 'On');然后跟随一些HTML。然后:
if (isset($_POST['log_out'])) {
session_unset();
session_destroy();
$_SESSION = array();
}当按下注销按钮时,会设置$_POST['log_out']。然后,我从一本书中获得了一个函数,用于防止SQL注入:
function mysql_fix_string($string) {
if (get_magic_quotes_gpc()) $string = stripslashes($string);
$string = htmlspecialchars($string, ENT_QUOTES);
$string = mysql_real_escape_string($string);
return $string;
}然后是密码验证部分,只有当用户提交了登录表单(该表单回发到同一页面,从而设置了$_POST['username']和$_POST['password'])时才能运行:
if (isset($_POST['username']) && isset($_POST['password'])) {
$salt1 = 'how';
$salt2 = 'pony';
$password = md5($salt1 . $_POST['password'] . $salt2);
$db_hostname = 'xxxxxxxxx';
$db_username = 'xxxxxxxxx';
$db_password = 'xxxxxxxxx';
$db_database = 'xxxxxxxxx';
$db_server = mysql_connect($db_hostname, $db_username, $db_password);
if (!$db_server) die("Unable to connect to MySQL: " . mysql_error());
mysql_select_db($db_database)
or die("Unable to select database: " . mysql_error());
$username = mysql_fix_string($_POST['username']);
$query = "SELECT password FROM users WHERE name = '" . $username . "'";
$result = mysql_fetch_assoc($query);
$passwordindatabase = $result['password'];
if ($password == $passwordindatabase) {
$_SESSION['logged_in'] = true;
$_SESSION['user'] = $username;
unset($_POST['username']);
unset($_POST['password']);
}
}更低一点的是登录表单,只显示if ($_SESSION['logged_in'] != true)。它将输入字段username和password的值发布到$_SERVER['REQUEST_URI'] (相同的页面)。
发布于 2012-05-15 13:05:52
在我看来,您似乎缺少了查询()函数,这意味着您实际上没有执行查询。
mysql_query -发送MySQL查询
执行以下操作并查看它是否有效:
$result = mysql_query($query);
$passwordindatabase = mysql_fetch_assoc($result);编辑
另外,您不应该使用mysql函数,因为它们非常陈旧,并且具有mysql_injection漏洞。我建议您尽快开始使用PDO,如果正确的话,它没有mysql_injection的易损性。
发布于 2012-05-15 12:48:29
若要使用基于cookie的会话,必须在向浏览器输出任何内容之前调用session_start()。
但是,时区警告是以前发送的。
在php.ini文件上设置时区。
编辑..。不仅仅是这个问题。您必须在sql请求上在mysql_query()之前使用mysql_fetch_assoc()函数。
发布于 2012-05-15 12:55:14
关于您显示的代码,唯一的“气味”是:
if ($password == $passwordindatabase) {我更希望看到这样的东西:
if (strcmp($password, $passwordindatabase) == 0) {此外,我们还需要看到将值实际插入到users表中的代码,因为很明显,$password和$passwordindatabase并不匹配。
https://stackoverflow.com/questions/10600802
复制相似问题