龙卷风中的用户身份验证基于其他php站点

时间:2011-06-28 01:08:02

标签: php session authentication tornado

我写了我自己的长轮虫龙卷风/ AJAX聊天与房间,耳语消息和其他很酷的东西。现在作为用户身份验证仅用于测试目的,我一直在使用cookie。所以你必须输入你的名字,在创建了'cokie'用户'后,聊天会对该cookie作出相应的反应。但问题是我为一个拥有php网站的朋友写了这个聊天。所以基本上我需要根据他的会话来验证用户。这就是我感到困惑的地方。 我感到非常惭愧,因为我发现自己不知道会话是如何工作的,这有点荒谬,因为我不认为自己是一个如此糟糕的程序员^^好吧,狗屎发生了。那么我知道会话只在客户端存储id,其他信息存储在服务器上,但这并没有真正帮助,因为我需要知道详细情况。当然我google了一下,但仍然困惑如何解决这个问题。所以基本问题是:

1)如果有人可以详细解释会话的确切工作方式,以及我需要知道或有权访问php网站,在其他应用程序中使用会话,我将不胜感激...

* 2) *例如,当我在我的django网站上进行身份验证时,会创建一些像's5ds6dssd6'这样的值,并且说实话我不知道该怎么做用它。再次惭愧。例如在PHP中提取用户名(如果已设置)并检查/执行某些操作我将执行类似PHP_SESSION ['username'] === ...。在django中更少工作只是为了使用decorator或user.is_authenticated方法。然而,如何在里面工作,我需要什么,我不知道。


我写的很有可能是愚蠢的,这很容易,而且我是一个白痴,在尝试之前写的......但即使我以某种方式能从session / php网站获取数据怎么可能我确定有些人不会自己创建具有随机id的会话,而无需在php网站上进行身份验证....

希望有人能指出我正确的方向。我觉得有必要写这么多,所以你可以udnerstand =)什么困扰我并做出相应的反应....抱歉,如果我写了一些愚蠢的东西。

1 个答案:

答案 0 :(得分:2)

  

1)如果有人可以,我会很感激   详细解释了一次   究竟会话如何工作,以及我是什么   需要知道或有权访问PHP   网站,在另一个网站上使用会话   申请......

PS:我正在使用Linux(我使用免费提供的Ubuntu,这是最受欢迎/用户友好的Linux distro),如下OS我会建议你使用* nx发行版(MacOSX也很不错,但我认为很贵)以及所有的web开发,尽管Cygwin(windows)中也提供了所有这些命令。

Sessions是:

  

PHP中的会话支持包括一个   保存某些数据的方法   后续访问。这使你   构建更多自定义应用程序   并增加您的网络的吸引力   站点。

下面我尝试解释哪些会话以及他们如何使用cookie


我创建了一个简单的no.php,它不使用会话,只输出Hello World

Hello World

当我们curl此脚本并使用headers使用-v 时,我们会得到以下输出:

alfred@alfred-laptop:~/www/6500588$ curl http://localhost/6500588/no.php -v
* About to connect() to localhost port 80 (#0)
*   Trying ::1... Connection refused
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /6500588/no.php HTTP/1.1
> User-Agent: curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
> Host: localhost
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Tue, 28 Jun 2011 02:10:53 GMT
< Server: Apache/2.2.16 (Ubuntu)
< X-Powered-By: PHP/5.3.3-1ubuntu9.3
< Vary: Accept-Encoding
< Content-Length: 12
< Content-Type: text/html
< 
Hello World
* Connection #0 to host localhost left intact
* Closing connection #0

从输出中可以看出,没有设置cookie。如果你反复这样做,你将获得相同的输出。


接下来,我创建了一个简单的yes.php文件,它可以使用会话。

<?php

session_start();

if (!isset($_SESSION['count'])) {
    $_SESSION['count'] = 0;
}

echo $_SESSION['count']++;

让我们在不存储cookie的情况下显示curl的输出:

alfred@alfred-laptop:~/www/6500588$ curl http://localhost/6500588/yes.php -v
* About to connect() to localhost port 80 (#0)
*   Trying ::1... Connection refused
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /6500588/yes.php HTTP/1.1
> User-Agent: curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
> Host: localhost
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Tue, 28 Jun 2011 02:12:47 GMT
< Server: Apache/2.2.16 (Ubuntu)
< X-Powered-By: PHP/5.3.3-1ubuntu9.3
< Set-Cookie: PHPSESSID=hrduhht116e9mikhkkj0gu7126; path=/
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< Vary: Accept-Encoding
< Content-Length: 1
< Content-Type: text/html
< 
* Connection #0 to host localhost left intact
* Closing connection #0
0

您可以看到计数为0,但也设置了Cookie:Set-Cookie: PHPSESSID=hrduhht116e9mikhkkj0gu7126; path=/。使用session_id hrduhht116e9mikhkkj0gu7126


如果我们再次发出相同的curl命令时不存储此cookie,我们仍然会收到0作为答案(忘记计数)并且还会收到另一个cookie。

alfred@alfred-laptop:~/www/6500588$ curl http://localhost/6500588/yes.php -v
* About to connect() to localhost port 80 (#0)
*   Trying ::1... Connection refused
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /6500588/yes.php HTTP/1.1
> User-Agent: curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
> Host: localhost
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Tue, 28 Jun 2011 02:16:42 GMT
< Server: Apache/2.2.16 (Ubuntu)
< X-Powered-By: PHP/5.3.3-1ubuntu9.3
< Set-Cookie: PHPSESSID=ihlj9c9fifl8f0lklu0umesas2; path=/
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< Vary: Accept-Encoding
< Content-Length: 1
< Content-Type: text/html
< 
* Connection #0 to host localhost left intact
* Closing connection #0
0

正如您所看到的,hrduhht116e9mikhkkj0gu7126不等于ihlj9c9fifl8f0lklu0umesas2,这意味着已设置新的Cookie并且该会话中的信息将丢失。


接下来,我们将cookie存储到发出cookie标志

-c文件中
alfred@alfred-laptop:~/www/6500588$ curl http://localhost/6500588/yes.php -v -c cookie
* About to connect() to localhost port 80 (#0)
*   Trying ::1... Connection refused
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /6500588/yes.php HTTP/1.1
> User-Agent: curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
> Host: localhost
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Tue, 28 Jun 2011 02:27:11 GMT
< Server: Apache/2.2.16 (Ubuntu)
< X-Powered-By: PHP/5.3.3-1ubuntu9.3
* Added cookie PHPSESSID="1h6710hhk84e0k9bj2kg7p03u5" for domain localhost, path /, expire 0
< Set-Cookie: PHPSESSID=1h6710hhk84e0k9bj2kg7p03u5; path=/
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< Vary: Accept-Encoding
< Content-Length: 1
< Content-Type: text/html
< 
* Connection #0 to host localhost left intact
* Closing connection #0
0

ls(目录列表)中可以看到,我们将cookie存储到名为cookie的文件中。

alfred@alfred-laptop:~/www/6500588$ ls -al
total 20
drwxr-xr-x  2 alfred alfred 4096 2011-06-28 04:27 .
drwxr-xr-x 19 alfred alfred 4096 2011-06-28 03:59 ..
-rw-r--r--  1 alfred alfred  196 2011-06-28 04:27 cookie
-rw-r--r--  1 alfred alfred   12 2011-06-28 04:00 no.php
-rw-r--r--  1 alfred alfred  114 2011-06-28 04:12 yes.php

根据cat(显示文件输出),跟踪计数的cookie包含以下信息

alfred@alfred-laptop:~/www/6500588$ cat cookie 
# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.

localhost   FALSE   /   FALSE   0   PHPSESSID   1h6710hhk84e0k9bj2kg7p03u5

我们接下来使用该cookie来跟踪计数。

alfred@alfred-laptop:~/www/6500588$ curl http://localhost/6500588/yes.php -v -b cookie
* About to connect() to localhost port 80 (#0)
*   Trying ::1... Connection refused
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /6500588/yes.php HTTP/1.1
> User-Agent: curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
> Host: localhost
> Accept: */*
> Cookie: PHPSESSID=1h6710hhk84e0k9bj2kg7p03u5
> 
< HTTP/1.1 200 OK
< Date: Tue, 28 Jun 2011 02:40:18 GMT
< Server: Apache/2.2.16 (Ubuntu)
< X-Powered-By: PHP/5.3.3-1ubuntu9.3
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< Vary: Accept-Encoding
< Content-Length: 1
< Content-Type: text/html
< 
* Connection #0 to host localhost left intact
* Closing connection #0
1

正如您所看到的那样,当我们不使用任何cookie(或不存储cookie和cookie)时,我们使用具有相同ID 1h6710hhk84e0k9bj2kg7p03u5的cookie并且计数为1而不是0得到新的cookie)。


  

所以基本上我需要进行身份验证   用户根据他的会话。

会话很简单,使用封面下的cookie(sessionid)。例如,您可以覆盖sessions to use the database的标准实现而不是文件系统(有趣的读取!)。但我只会使用您在龙卷风应用程序中从PHP(session_id)收到的session_id来验证您的会话,因为这应该是唯一的(难以猜测)。

  

session_id()返回会话ID   对于当前会话或空   如果没有电流,则为字符串(“”)   会话(没有当前会话ID   存在)。


P.S:我希望这会回答你的问题。如果没有,您可以在评论中询问更多信息吗?