【问题标题】:Perl: how can i read a specific cookie value stored by FirefoxPerl:我如何读取 Firefox 存储的特定 cookie 值
【发布时间】:2017-08-31 10:59:09
【问题描述】:

我目前正在使用 Perl 开发一个脚本,以恢复 Facebook 当前存储在我的浏览器中的特定 cookie。 cookie 名称是 Datr,我尝试了多个 Perl 模块,例如 HTTP::Cookies、CGI::Cookie 等,但均未成功。

我想做的很简单,我需要通过 Perl 来完成:将 Datr 值(动态变化)存储到我的 Perl 脚本中的一个新变量中。

我决定设置一个测试 cookie 并尝试读取它的值,但脚本既没有返回任何内容,也没有浏览器 (Mozilla) 似乎存储了我的 cookie。 这是我使用的代码:

#!bin/perl

use CGI;

$query = new CGI;

##setting a new cookie into the browser
$cookie = $query->cookie(-name=>'MY_COOKIE',
             -value=>'HelloWorld',
             -domain=>'facebook.com',
             -expires=>'+4h');

##retrieving cookie value
$theCookie = $query->cookie('MY_COOKIE');

请帮帮我,因为我快疯了! 谢谢

首先感谢大家的及时回复。

致戴夫:感谢您对此的非常好的回答。是的,我知道 Firefox 可以通过 GUI 读取 Datr 值,但实际上我需要使用 Perl 代码读取它,因为我的原始脚本具有特定的 SSL 请求,它实际上需要 Datr 值。 Facebook 已经在 Datr ''understanding'' (http://www.adweek.com/digital/datr-cookie-belgium/) 上得到了回答,这似乎是一个有趣的副话题。回到我最初的请求,我很确定 Firefox 将所有 cookie 值本地存储在某种名为 cookie.sqlite 的 .sqlite db 中,我可以到达那里!如果尝试“手动”读取它,我可以看到 Datr 字符串,但这不会解决任何问题,因为我不想每次执行任何类型的 SSL 请求时都更新我的 PL 脚本脸书!!这就是重点。

我最初的问题可以重新表述如下:有什么方法可以查询 Firefox 创建的 .sqlite cookie 数据库,以便检索 Datr cookie 并将其存储在 Perl 变量中?请记住,我不想在我的 PL 脚本中设置绝对的“文件路径”,因为它应该在 Linux 或任何其他操作系统(Windows、OSx ..)中执行。

感谢您对此主题的任何进一步回复。

【问题讨论】:

  • 没办法,除非你在 facebook 域上运行你的脚本,或者在 firefox 所在的同一台机器上使用其他脚本。
  • 浏览器并不傻。他们只接受和返回您的域的 cookie。

标签: perl firefox cookies


【解决方案1】:

读取 cookie 有两个步骤。

  1. 访问 cookie 的值。
  2. 了解该价值。

像你提到的那些模块,只处理第一步。它们允许您将 cookie 标头写入 Web 应用程序的响应,并从进入您的 Web 应用程序的请求中读取 cookie 标头。但它们只会为您的 Web 应用程序运行所在的域读取或写入 cookie。您的应用程序不太可能在 facebook.com 上运行,因此这些模块对您来说毫无用处。

但是,一切都没有丢失。 Firefox 将允许您访问存储在浏览器中的任何 cookie。我假设您已经知道(因为您知道您感兴趣的 cookie 的名称),但如果您不知道 - 从汉堡菜单中选择“首选项”,然后选择“隐私”;该页面有一个“删除单个 cookie”链接。

所以你可以看到 datr cookie 的内容。我现在正在看我的。它是由 24 个随机字符组成的字符串。

这是下一个问题。你如何解释那个字符串?只有 Facebook 可以回答这个问题。它可能是一个包含各种有趣数据的哈希。但要证明这一点几乎是不可能的。更有可能(因为我认为这是最佳实践)它只是一个随机字符串,它是 Facebook 系统某处保存的某些数据存储的密钥。

所以它要么是一个经过良好加密的秘密,要么是一个随机字符串。不管怎样,它对你没用。

获取 cookie 的值很容易。了解这个价值(通常)是不可能的。

更新:实际上,现在您已经完全重新定义了这个问题。这根本不是关于饼干的。它是关于从 SQLite 数据库中读取数据的。为此,您应该查看DBI 和DBD::SQLite。如果您对如何执行此操作有任何更具体的问题,请提出新问题。

【讨论】:

  • Re: Either way it's useless to you. 如果 OP 打算劫持会话,那不是真的。 ;)
  • 当然,有可能通过代理强制用户的流量(可能滥用计算机上已经安装的愚蠢软件,如防病毒软件或制造商的软件,并玩弄 cookie。跨度>
  • 在这种情况下 hosts 文件也是一个候选者。
  • 大家好,感谢您的回答。我用更多信息编辑了我的原始请求。让我知道你对此的想法。谢谢
  • 谢谢戴夫。实际上,问题是相同的,即“获取 Firefox 存储的 cookie 值”。我只是提出了一个可能的解决方案......无论如何,我已经想出了一个脚本,通过 DBI 模块解决问题,正如你所建议的那样。现在我正在旅行,但我会尽快发布代码。再次感谢。
【解决方案2】:

这是我想出来的。它运作良好。我没有使用绝对路径(至少直接使用),因此理论上它也应该在 Windows(上面有 Perl)和 Mac OS 中工作,但我没有测试它。它只是在系统中搜索 .sqlite db,一旦找到它就会返回 Firefox 存储的 Datr 的值。

#!/bin/perl

 use File::Find::Rule;
 use DBI;
 use strict;

  my @files = File::Find::Rule->file()
                             ->name('firefox', 'cookies.sqlite') 
                             ->in( '/home' ); 

my @matches = grep { /firefox/i && /mozilla/i } @files; 
print "DB PATH: @matches\n\n";

####### connect to .sqlite database

my $database = @matches[0];

my $dbfile = "$database";
my $dsn      = "dbi:SQLite:dbname=$dbfile"; #set path to db
my $user     = ""; 
my $password = "";
my $dbh = DBI->connect($dsn, $user, $password, {
   PrintError       => 0, 
   RaiseError       => 1, 
   });
print "Database opened successfully\n\n";


my $stmt = "SELECT VALUE FROM moz_cookies WHERE NAME='datr'"; 
my $sth = $dbh->prepare( $stmt );
my $rv = $sth->execute() or die $DBI::errstr;

if($rv < 0) {
  print $DBI::errstr;
}

my @row=$sth->fetchrow_array(); #fetching data of sth into a new array

print "COOKIE VALUE: @row"; #print data

print "\n\nOperation done successfully\n";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-28
    • 2020-06-15
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多