【问题标题】:Using cookies in Perl without CGI在没有 CGI 的 Perl 中使用 cookie
【发布时间】:2018-01-21 06:01:41
【问题描述】:

我正在尝试使用 Perl 但不使用 CGI 或任何其他框架来创建一个标准的论坛风格网站。我在使用一个简单命名为“cookies.pl”的脚本之前见过,但找不到任何关于它的文档。有没有办法只使用核心模块来设置/读取 cookie?

【问题讨论】:

  • 你有什么理由想要使用一个有 25 年历史的非核心模块cookies.pl 但不想使用更新的东西? (我猜是年龄,但它是一个 .pl 文件这一事实意味着它可能早于 Perl5,后者于 1994 年首次发布。)
  • 既然您正在尝试重新编码车轮,您遇到了什么问题?
  • “不使用CGI”是指不使用CGI Perl 模块,还是根本不使用CGI 接口?如果是后者,你用什么代替?
  • @ikegami 我问只是因为它是我所知道的唯一不涉及大型框架(或 CGI.pm)的资源
  • 这不能回答我的问题。我重复一遍:为什么你可以接受它,而不是 CGI.pm?你是故意让你的脚本不安全,还是只是一个副作用?

标签: perl cookies cgi


【解决方案1】:

首先,我假设当你说你不想使用“CGI”时,你的意思是 Perl 模块CGI.pm,而不是与 Web 服务器通信的通用网关接口 (CGI) 方法,即由CGI.pm 模块实现。

其次,此答案仅供参考和娱乐目的。尝试实现自己的 CGI 处理程序以用于生产环境是不可取的。除非您确切地知道自己在做什么,否则这是一个非常非常糟糕的主意。即使您这样做,也可能仍然是个坏主意。而且,如果您确实知道自己在做什么,就不必询问有关界面基本部分的问题,例如如何实现 cookie 处理。

除了所有这些之外,直接处理 cookie 非常简单。

  • 要设置 cookie,请向客户端发送 Set-Cookie HTTP 标头。在最基本的形式中,这看起来像Set-Cookie: CookieName=CookieValue。还有许多其他选项可以添加到这种基本格式中,例如网络上各个地方的documented

如果您现在想知道“我如何发送 HTTP 标头?”,那么在第一个空行之前发送给客户端的每一行文本(即 printSTDOUT)都是一个 HTTP标题:

print "Content-Type: text/html\n";            # Content-Type header is mandatory!
print "Set-Cookie: CookieName=CookieValue\n"; # Header to set a cookie
print "\n";                                   # Blank line = end of headers
# continue on with sending the response body now that headers are done
  • 要读取 cookie,请查看环境变量 HTTP_COOKIE,它由 Web 服务器作为其 CGI 实现的一部分提供,并将包含一个以分号分隔的列表,其中包含客户端 HTTP 请求接收到的所有 cookie。在 Perl 中以 $ENV{HTTP_COOKIE} 访问。

【讨论】:

  • 谢谢。是的,我的意思是 CGI.pm。我知道我的方法不是标准的,将来需要更新自己,但我认为这将适合我的目的。
  • @GeoffH。 - 问题不在于它是非标准的或将来需要更新。问题是你很可能会引入安全漏洞(CGI.pm 多年来肯定有其安全问题的份额),如果你使用的是没有其他人使用的自定义 CGI 处理程序,那么这些漏洞不会在您的网站被利用之前被发现 - 即使在那时也可能找不到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 2015-06-26
  • 2015-06-09
相关资源
最近更新 更多