Perl:我如何读取Firefox

时间:2017-08-25 12:03:35

标签: perl firefox cookies

我目前正在开发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'''''''''''' (http://www.adweek.com/digital/datr-cookie-belgium/)并且似乎是一个有趣的话题。回到我的原始请求,我非常确定Firefox将所有cookie值存储在某种名为cookie.sqlite的.sqlite数据库本地,我可以到达那里!如果尝试阅读它'''',我可以看到Datr字符串,但是这不会修复任何内容,因为我不想更新我的PL脚本每次我想对FB执行任何类型的SSL请求!这就是重点。

我的原始问题可以重新表述如下:有没有办法查询Firefox创建的.sqlite cookie数据库,以便检索Datr cookie并将其存储在Perl变量中?请记住,我不想设置一个绝对的路径来提交'''在我的PL脚本中,因为它应该在Linux或任何其他操作系统(Windows,OSx ..)中执行。

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

2 个答案:

答案 0 :(得分:4)

阅读Cookie有两个步骤。

  1. 访问c​​ookie的值。
  2. 了解这个价值。
  3. 像你提到的那些模块,只处理第一步。它们允许您将Cookie标头写入Web应用程序的响应中,并从进入Web应用程序的请求中读取Cookie标头。但是他们只会为运行Web应用程序的域读取或写入cookie。你的应用程序在facebook.com上运行的可能性很小,因此这些模块对你来说毫无用处。

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

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

    这是下一个问题。你怎么解释那个字符串?只有Facebook可以回答这个问题。它可能是包含各种有趣数据的哈希。但要证明这一点几乎是不可能的。更可能的是(因为这是,我认为,最佳做法)它只是一个随机字符串,是Facebook系统中某个数据存储的关键。

    因此它是一个加密良好的秘密或随机字符串。无论哪种方式,它对你都没用。

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

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

答案 1 :(得分:1)

这就是我所知道的。它运作良好。我没有使用绝对路径(至少,直接),因此,理论上,它也应该在Windows(有Perl)和Mac OS上工作,但我没有测试它。它只是将.sqlite数据库搜索到系统中,一旦发现它返回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";