Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在一个响应中设置并检查Cookie-Laravel_Php_Laravel_Cookies_Laravel 4 - Fatal编程技术网

Php 在一个响应中设置并检查Cookie-Laravel

Php 在一个响应中设置并检查Cookie-Laravel,php,laravel,cookies,laravel-4,Php,Laravel,Cookies,Laravel 4,我正在尝试设置cookie,然后检查cookie是否已设置 在一个函数中,我让它制作cookies: public function makeCookies(){ Cookie::queue('logged_in', $value, 15); Cookie::queue('user_id', 2); //return Response::make()->withCookie(Cookie::make('logged_in', $value, 15))->wit

我正在尝试设置cookie,然后检查cookie是否已设置

在一个函数中,我让它制作cookies:

public function makeCookies(){
    Cookie::queue('logged_in', $value, 15);
    Cookie::queue('user_id', 2);
    //return Response::make()->withCookie(Cookie::make('logged_in', $value, 15))->withCookie(Cookie::forever('user_id', 2));
}
在另一个函数中,我尝试检查cookie是否已设置:

public function checkCookies(){
         $this->makeCookies();
         if(Cookie::get('logged_in') && Cookie::get('user_id')){
              return 'Logged In!';
         }
}

但是,唯一可行的方法是在$this->makeCookies()之前添加“return”;然而,我希望能够得到下面的条件。我有什么办法可以这样做吗?非常感谢您的帮助。

要了解Cookie创建/读取过程:

  • 用户的浏览器发送一个页面请求,以及它当前为该站点提供的任何cookie
  • 该站点提供页面,您创建的任何cookie都将成为您响应中的标题
  • 对您站点的后续请求将发送在#2中创建的cookie
  • 您所要求的…能够读取您在步骤1第2步中创建的cookies…不可能

    现在,根据Cookie类的创建方式,您可以使它在调用Cookie::queue()时创建内存中的数据,以反映下一个请求中Cookie“应该是什么”,但它并不真正知道用户的浏览器是否会接受Cookie,等等

    这就是为什么许多网站在创建cookie后会给用户一个重定向到一个类似于?checkCookie=1的页面的原因。这样,在后续请求中,他们可以验证您的浏览器是否支持cookie…如果“检查cookie”页面上不存在该cookie,他们会给您一个错误,告诉您他们的站点需要cookie支持。但是,它确实需要向服务器发送第二轮,以便从创建的浏览器读取cookie

    更新2015-04-24根据@Scopey,Laravel确实支持通过
    queued()
    在内存中检索cookie。因此,您应该能够做到:

    public function checkCookies(){
        $this->makeCookies();
        $loggedIn = Cookie::get('logged_in') ?: Cookie::queued('logged_in');
        $userId   = Cookie::get('user_id') ?: Cookie::queued('user_id');
        if( $loggedIn && $userId ){
            return 'Logged In!';
        }
    }
    
    安全问题(不直接回答问题)

    你的问题只是关于饼干的,所以我只回答了这些。然而,现在我正在看你的代码,我觉得如果我不向碰巧正在读这篇文章的人指出这一点,那就太失职了。这可能只是一个“如何”为自己,而不是生产代码,但该代码可能是非常危险的,如果它曾经公开

    确保您不信任存储在cookie中的用户id来确定通过cookie进入的用户。如果你相信这一点,而我来到你的网站,我可以将我的cookie修改为我想要的任何用户id,并进入其他人的帐户

    一般安全规则:

    cookie应该包含GUID或类似的随机字符串来标识会话。此随机字符串应足够长(例如,32个字符或更大,IMHO),以便有人不容易强行劫持会话

    用户id应该存储在$会话(或laravel的会话包装器,如果适用)中,这样用户就没有任何权限访问用户id来修改它

    在普通PHP中,登录页面类似这样:

    session_start();
    if( isValidPassword($_POST['username'], $_POST['password']) ) {
        $_SESSION['user_id'] = $user->Id;
    }
    else {
        die('invalid login credentials');
    }
    
    session\u start()
    方法会自动为用户生成一个带有该长随机字符串的cookie(因此您甚至不必担心该部分)

    在后续页面中,您只需检查会话用户\u id即可知道谁已登录:

    session_start();
    if( empty($_SESSION['user_id']) ) {
        die('You are not logged in and cannot access this page');
    }
    

    根据Laravel的文档进行必要的更改,如果他们有自己的会话包装器,我敢肯定他们的最佳实践中有很好的文档记录。

    要了解Cookie创建/读取过程:

  • 用户的浏览器发送一个页面请求,以及它当前为该站点提供的任何cookie
  • 该站点提供页面,您创建的任何cookie都将成为您响应中的标题
  • 对您站点的后续请求将发送在#2中创建的cookie
  • 您所要求的…能够读取您在步骤1第2步中创建的cookies…不可能

    现在,根据Cookie类的创建方式,您可以使它在调用Cookie::queue()时创建内存中的数据,以反映下一个请求中Cookie“应该是什么”,但它并不真正知道用户的浏览器是否会接受Cookie,等等

    这就是为什么许多网站在创建cookie后会给用户一个重定向到一个类似于?checkCookie=1的页面的原因。这样,在后续请求中,他们可以验证您的浏览器是否支持cookie…如果“检查cookie”页面上不存在该cookie,他们会给您一个错误,告诉您他们的站点需要cookie支持。但是,它确实需要向服务器发送第二轮,以便从创建的浏览器读取cookie

    更新2015-04-24根据@Scopey,Laravel确实支持通过
    queued()
    在内存中检索cookie。因此,您应该能够做到:

    public function checkCookies(){
        $this->makeCookies();
        $loggedIn = Cookie::get('logged_in') ?: Cookie::queued('logged_in');
        $userId   = Cookie::get('user_id') ?: Cookie::queued('user_id');
        if( $loggedIn && $userId ){
            return 'Logged In!';
        }
    }
    
    安全问题(不直接回答问题)

    你的问题只是关于饼干的,所以我只回答了这些。然而,现在我正在看你的代码,我觉得如果我不向碰巧正在读这篇文章的人指出这一点,那就太失职了。这可能只是一个“如何”为自己,而不是生产代码,但该代码可能是非常危险的,如果它曾经公开

    确保您不信任存储在cookie中的用户id来确定通过cookie进入的用户。如果你相信这一点,而我来到你的网站,我可以将我的cookie修改为我想要的任何用户id,并进入其他人的帐户

    一般安全规则:

    cookie应该包含GUID或类似的随机字符串来标识会话。此随机字符串应足够长(例如,32个字符或更大,IMHO),以便有人不容易强行劫持会话

    用户id应存储在$会话(或laravel的会话包装器,如果适用)中,以便用户无权访问要成为会话的用户id