搜索互联网RFC文档

在隔离期间,我找到了家庭隔离的积极一面:由于学校的考试,我没有足够的时间读书,但幸运的是,我有足够的时间阅读一两个请求评论(RFC)文档。

自从我开始学习计算机安全以来,"协议"这一概念一直吸引着我。也许是因为它们几乎在每一个计算机系统中都有巨大的传播,我们的日常生活很大程度上依赖于这些过程。正如我所说:"相信机器但不要相信人类"。RFC方法让人联想到开源哲学,它们有相同的目标(通过共享给每个人学习新事物的机会)和相同的传播渠道:互联网。

我在IETF网站上很难找到这些文档,所以我编写了一个快速高效的脚本,可以通过关键字下载RFC,并让我决定哪些要阅读,哪些要忽略。

RFC是什么?

“请求评论”是学习网络在协议层面上如何真正工作的最佳在线参考资料之一。这些只是定义互联网工程任务组批准的每个标准的文本文档。这些文档是研究协议分析的好入门点:一个使用形式验证来查找漏洞的新兴领域。

每个RFC都有一个标题和其关联的编号,例如RFC 3607是“回顾中国彩票密码分析:互联网作为密码破解工具”。

我的脚本使用Net::RFC::Search进行搜索,并使用Term::ANSIColor进行显示——终端中会有很多文本,不同的颜色可以帮助!。

#!/usr/bin/perl
# Made by Edoardo Mantovani in 2020

use strict;
use warnings;

use File::Path qw(make_path);
use File::Spec::Functions;
use LWP::Protocol::https; # Net::RFC::Search needs this
use Net::RFC::Search;
use Term::ANSIColor;

my $folder = shift or die "./RFC <Folder> <Query>\n";
my $query  = shift or die "./RFC <Folder> <Query>\n";

make_path $folder;

my $rfc_interface = Net::RFC::Search->new();
my @rfc_nums = $rfc_interface->search_by_header( $query );

print "RFCs [@rfc_nums]\n";

foreach my $rfc_num ( @rfc_nums ) {
  my $local_file = catfile( $folder, $rfc_num ); # i.e final folder = /tmp/1110
  if ( $rfc_interface->get_by_index( $rfc_num, $local_file ) ) {
    print colored( "Downloaded: $rfc_num\n", "green" );
    view_rfc( $local_file );
  }
  else {
    print "Error with RFC $rfc_num\n";
  }
}

sub view_rfc {
  my( $file ) = @_;

  open my $fh, '<', $file or do {
    warn "Could not open file [$file]: $!\n";
    return;
  };

  while( <$fh> ) {
  	print;
  	next unless $. == 25;
    print colored("Do you want to save this RFC? [Y/N] ", "red");
    my $input = <STDIN>;
    chomp( $input );
	unlink $file if uc($input) eq "N";
    last;
  }
}

运行程序需要一个目录名和一个查询。如果目录不存在,我将创建它

$ ./rfc_search rfcs cookie

我显示每个匹配RFC的前25行,并提示保存它。

工作原理

search_by_header返回具有查询词的每个文档的RFC编号

my @rfc_nums = $rfc_interface->search_by_header( $query );

然后我通过指定编号和本地文件名来获取每个文档。即使我不会保留它,我也这样做,因为我还不知道里面的内容

$rfc_interface->get_by_index( $rfc_num, $local_file );

对于最后一部分,我查看文件的前25行。我有一个提示,问我是否想保存它。如果输入“N”,我就删除该文件。我将提示着色,以便我可以将其与RFC文本区分开来

sub view_rfc {
  my( $file ) = @_;

  open my $fh, '<', $file or do {
    warn "Could not open file [$file]: $!\n";
    return;
  };

  while( <$fh> ) {
  	print;
  	next unless $. == 25;
    print colored("Do you want to save this RFC? [Y/N] ", "red");
    my $input = <STDIN>;
    chomp( $input );
    rmtree(@_) if uc($input) eq "N";
    last;
  }
}

其他用途和建议

我主要编写了这个简单的脚本以节省时间并拥有更好的与RFC网站交互的界面,我建议查看Net::RFC::Search页面中的TODO部分。为了编写更好的脚本,最好实现curllynx来检索已取消的RFC。当然,可以使用自定义函数实现脚本,但这个脚本仅用于教育目的。

资源 - 请求评论:用户故事和场景 - 维基百科的RFC条目

标签

Edoardo Mantovani

仍是一名学生,喜欢数学、Perl和网络安全。特别兴趣:密码分析、形式验证和EMSEC

浏览他们的文章

反馈

这篇文章有问题吗?请通过在GitHub上打开问题或拉取请求来帮助我们