【问题标题】:Is there an issue with the setcookie() function in this code?此代码中的 setcookie() 函数是否存在问题?
【发布时间】:2021-01-18 07:29:03
【问题描述】:

DB.php 函数有效。唯一的问题是没有设置 cookie。将 $token 输入到 setcookie 有什么问题吗? (在“/”之后,我将我的 .mydomain.com 而不是 null。)

注意:(.mydomain.com 只是填充我的实际域名。)

代码来自这里: https://github.com/howCodeORG/Social-Network/blob/Part5/login.php

我试过了:

  • 删除 echo 语句(没有 echo 语句将无法加载)。
  • 更改 $token = bin2hex(openssl_random_pseudo_bytes(64, $cstrong));至 $token = bin2hex(random_bytes(64, $cstrong));(cookie 仍未设置)
  • 我使用 w3schools 的示例进行测试,然后设置了 cookie(因此,它不是我的浏览器)。
<?php
include('classes/DB.php');
if (isset($_POST['login'])) {
        $username = $_POST['username'];
        $password = $_POST['password'];
        if (DB::query('SELECT username FROM users WHERE username=:username', array(':username'=>$username))) {
                if (password_verify($password, DB::query('SELECT password FROM users WHERE username=:username', array(':username'=>$username))[0]['password'])) {
                        echo 'Logged in!';
                        $cstrong = True;
                        $token = bin2hex(openssl_random_pseudo_bytes(64, $cstrong));
                        $user_id = DB::query('SELECT id FROM users WHERE username=:username', array(':username'=>$username))[0]['id'];
                        DB::query('INSERT INTO login_tokens VALUES (\'\', :token, :user_id)', array(':token'=>sha1($token), ':user_id'=>$user_id));
                        setcookie("SNID", $token, time() + 60 * 60 * 24 * 7, '/', .mydomain.com, TRUE, TRUE);
                } else {
                        echo 'Incorrect Password!';
                }
        } else {
                echo 'User not registered!';
        }
}
?>
<h1>Login to your account</h1>
<form action="login.php" method="post">
<input type="text" name="username" value="" placeholder="Username ..."><p />
<input type="password" name="password" value="" placeholder="Password ..."><p />
<input type="submit" name="login" value="Login">
</form>

【问题讨论】:

  • 您是否启用了error_reporting?检查实际的 HTTP 响应(wget -S 等)?您是否已验证令牌已存储在您的数据库中,或者已到达此代码路径? // 也可能应该减少数据库查询的数量(不要对用户名和密码重复两次。)
  • 如何检查 cookie?
  • 我正在使用 phMyAdmin 并没有看到任何错误。令牌确实存储在数据库中。我正在学习一个教程,但不知道如何减少数据库查询的数量。
  • 这是youtube.com/watch?v=uyC0KKF-3CM的教程,你检查一下你的浏览器是否设置了cookie。它被用来保持用户登录。

标签: php


【解决方案1】:

setcookie 必须出现在脚本的任何输出之前,因为它依赖于发送标头来设置 cookie。来自manual

与其他标头一样,Cookie 必须在您的任何输出之前发送 脚本(这是协议限制)。这需要您放置 在任何输出之前调用此函数,包括 和

标签以及任何空格。

在您调用setcookie 之前,您的代码中有echo 'Logged in!';,这将阻止它工作。

【讨论】:

  • 我已将 echo 语句移到 cookie 设置之后。 cookie 仍未设置。
  • 您似乎在通话中有错字,.mydomain.com 应该用引号引起来(而且开头也不应该有 .。另外,如果您不使用 SSL,则secure 参数应该是false,而不是true
  • 我现在已经包含了引号并且我正在使用 SSL。为什么我不使用 .在 mydomain.com 前面?
  • 现代浏览器不再需要.
  • 谢谢。 cookie 需要在 if 语句之外设置吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
相关资源
最近更新 更多