在我们最喜欢的网站中隐藏着什么样的标题?由于阵亡将士纪念日我们休息了一天,我一开始就编辑完了一集播客,但一天中的大部分时间我都想做一些完全无用和有趣的事情。受这篇文章的启发,我决定做一个快速项目来探索url头的空间。这既混乱又迅速,但我想做以下几件事:
当然,一旦我在上述问题上有了一个合理的开端,它就会迅速升级到包括:
这就是我阵亡将士纪念日的冒险!如果您只想签出为GitHub操作生成的(现在是静态的)结果页面,请参见此处。如果您想要使用GitHub操作来研究您的URL列表,请查看存储库的说明。否则,继续阅读,了解我是如何做这个项目的,以及我从做这个项目中学到的一些有趣的事情。
我首先编写了一个简单的脚本来获取相当流行的45个站点的标题,但最终找到了一个包含500个站点的列表。我不得不广泛编辑该列表,因为许多URL已不存在,或者需要有一个www。工作前缀,句号。我还删除了没有安全连接的URL,这给了我总共500个表示在文本文件urls.txt中的URL(我添加了几个以获得一个很好的偶数!)。从这些站点(当我在本地机器上解析时),我发现了615个唯一的标头,从出现在所有站点(Content-Type,N=500)到只存在于一个站点(N=1)的频率不等。最常见的是“Content-Type”,其次是Date。我使用run.py脚本实现了这一点。我还单独解析了cookie,保留了名称,但删除了值,以防它们包含任何类型的个人信息或可能被恶意使用。我在500个网站上总共发现了457个独特的cookie。
我决定使用Flask和ChartJS,因为它们都相对简单,虽然我最近尝试了其他的图表Python库,但它们大多令人讨厌且容易出错。由此,我能够创建一个主视图来显示所有计数,并创建一个表视图来显示详细信息。
我认为数据导出就足够了,但我认为有时使用交互式界面打包分析脚本会很有用。是的,工作量很大,但如果你做几次,就不会有太大的挑战,而且很容易看到最终的结果。
这里是基本界面!“主页”上有一张计数图。Y轴是页眉,条形图的长度表示拥有它的站点的数量:
单击页眉时,您将转到显示每个页眉的值的页面:
是的,除了捕获我发出请求时的日期之外,Date标题并不是非常有趣!更有趣的是X-Recruiting标题,我只为Etsy和booking.com找到了礼物:
这是最初引起我兴趣的标题,因为它看起来太出乎意料了。如果你浏览一个标题并点击一个网站,你会被带到它的摘要视图。以下是Facebook:
$python app/__init__.py*Serving Flask app";__init__";(惰性加载)*环境:生产警告:这是开发服务器。请勿在生产部署中使用它。改为使用生产WSGI服务器。*调试模式:ON*在http://127.0.0.1:5000/上运行(按Ctrl+C退出)*使用STAT重新启动*调试器处于活动状态!*调试器PIN:261026821。
公平地说,我确实在本地开发了这个,但我更喜欢创建一个Dockerized版本,这样如果/当有人在几年后找到它时,他们有望比没有提供Dockerfile的情况下更好地再现它。要构建映像,请执行以下操作:
虽然我没有运行gihub操作的界面,但是我们可以使用gihub操作来生成数据,将其作为工件下载,然后导出静态界面。虽然我没有运行gihub操作的界面,但是我们可以使用gihub操作来生成数据,将其作为构件下载,然后导出静态界面。这些步骤将在最后一节中讨论。
我的最终目标是为应用程序的所有视图生成完全静态的文件。我们为什么要这样做?当然是为了在GitHub页面上分享!我编写了一个相当难看的spagetti-esche脚本parse.py,它(给定一个正在运行的服务器)将提取cookie、头和基础站点的页面,然后将它们与readme.md一起保存到静态文件夹“docs”中。然而,一旦您查看了indexon GitHub页面,您就可以像往常一样导航到页面,这是可能的,因为我们在应用程序中添加了存储库的前缀(url-headers)。
然后,我更进一步,创建了一个自定义的GitHub操作,它表示为action.ymland,它通过entrypoint.sh运行,该操作处理接收用户指定的URL文件,并运行脚本来生成数据。然后它将其保存为工件,您可以将其下载到您的计算机上以生成界面。当然,动作的用户可以对数据输出做任何他们想做的事情。这是我第一次尝试启动使用GitHubaction上的端口的服务,因此您可以想象我遇到了一些陷阱,最后我意识到我需要将flask应用程序作为服务容器启动。我决定7个小时已经足够长了,虽然在动作运行期间运行界面和生成静态内容会很棒,但我最好下次再试一次。但是我仍然可以分享我学到的一些快速的东西!首先,您不能先启动子shell,然后让它在后台运行。这是行不通的:
但是类似这样的东西可能是可以的,尽管我仍然不确定我们随后是否可以访问这个端口:
首先,它让我有点不舒服,因为它干净利落地退出了,没有明确的错误消息,所以我认为是前面运行的脚本。实际上,还有另一个问题。看到那个“INPUT_PORT”变量了吗?容器公开了5000个端口,我在那个端口上运行服务器,从逻辑上讲,这就是我想用Docker来映射本地机器的端口。但是看起来GitHub的动作,因为你会连接到跑步者的端口5000,这会导致一个出口。以下是由此产生的错误:
启动服务器.回溯(最近一次调用):文件";/usr/local/lib/python3.7/site-packages/urllib3/connection.py";,行160,in_new_conn(sel._dns_host,self.port),self.timeout,**Extra_kw文件";/usr/local/lib/python3.7/site-packages/urllib3/util/connection.py";,行84,在CREATE_CONNECTION RAISE ERR FILE"中;/usr/local/lib/python3.7/site-packages/urllib3/util/connection.py";,_connection sock.connect(Sa)ConnectionRefusedError中的Create_Connection sock.connect行74错误:[Errno111]连接被拒绝。
多!不管怎样,我从来没有让它完全工作过,我决定简化操作,只生成数据,另存为工件,然后你就可以下载到你的本地机器上,启动Web服务器,生成界面。这有点进退两难,因为我们需要在生成数据之后构建一个服务容器,然后在下一步与之交互,但是必须在该步骤之前定义并启动服务容器。我不确定GitHub操作是否支持这一点,因为它们的大多数服务示例都是数据库或其他工具,它们不需要定制,甚至不需要绑定到主机。不管怎样,这是下一个项目要再看的东西。
最后,我想花几分钟研究一下我注意到的或以其他方式学到的一些东西。这可能是最有趣的部分了!
很多站点都有P3P标头(N=67),但是对于该集合,它们中的许多都是无效的!
P3P指的是隐私偏好平台(注三个P)。它似乎是2001年开发的,2002年推荐的,但现在已经过时了,我想很多网站还在提供它。我想这个想法是网站可以定义这个标题来说明他们的隐私政策,但是它似乎有一些问题。所以我们看到的是一个互联网过去的框架!
正如我上面提到的,我找到了两个网站,booking.com和etsy.com,上面都有招聘负责人。所以,如果你正在找工作,可以通过那个联系他们!我认为这种标题的问题是,如果有消息说它存在,它的意义就会变得很小,因为它并不是很难找到。
Facebook似乎有一个调试id x-fb-debug,我怀疑他们的支持团队在某种程度上使用了它。天晓得这是个长长的散列。
他们的内容安全策略(Ref)给出了站点允许为任何特定页面加载哪些资源的提示。这些清单中有没有让您感到困扰的(为了可读性,我添加了换行符)?
default-src*data:blob:';self';;script-src*.facebook.com*.fbcdn.net*.facebook.net*.google-analytics.com*.viralEarth.net*.google.com 127.0.0.1:**.spotilocal.com:*';unsafe-inline';';unsafe-eval&39;blob:data:';self。connect-src*.facebook.com facebook.com*.fbcdn.net*.facebook.net*.spotilocal.com:*wss://*.facebook.com:*https://fb.scanandcleanlocal.com:*attachment.fbsbx.com ws://localhost:*blob:*.cdninstagram.com';self';chrome-extension://boadgeojel.chrome-extension://dliochdbjfkdb.。
第一个Chrome扩展似乎是用来做某种网络广播的,第二个我不确定,但它是这里列出的最后一个。这个世界是怎么回事?
是的,里面有Chrome扩展和…。我的当地房东?所以我怀疑脸书有权限扫描我的本地主机来寻找什么?更麻烦的是“ws://localhost:*”。
我很想看看这些网站(至少是报道的)使用哪种服务器。我对版本字符串进行了删减,以了解情况。获胜者似乎是nginx,我对此相当高兴,因为它绝对是我的最爱!Apache紧随其后,紧随其后的是CloudFlare和Google web services(GWS?)。
{';nginx';:116,';Apache';:67,';CloudFlare';:38,';GWS';:19,';ATS';:13,';服务器';:12,';gse';:11,';sffe';:10。:7,';ESF';:5,#39;Google前端';:3,';amazons3';:3,';YouTube前端代理';:2,';github.com';:2,';vk';:2,';mw1320.eQiad.wmnet';:2,';tengine。:2,';tsa_a';:2,';akamainetstorage';:2,';mw1329.eQiad.wmnet';:2,';特使';:2,';Qrator';:2,';ECD(Aga';:2,';support-content-UI';:1,';mSupport-Content-UI';:1,';mcd。欧罗巴:1,#39;BBC-GTM';:1,';mw1264.eQiad.wmnet';:1,';mw1275.eQiad.wmnet';:1,';马拉喀什1.16.6';:1,';dms';:1,';犀牛核盾';:1,#。:1,';http服务器(未知)';:1,';mw1371.eqiad.wmnet';:1,';Litespeed';:1,';am';:1,';CloudFlare-nginx';:1,';mw1370.eqiad.wmnet';:1,';squid&。mw1321.eQiad.wmnet';:1,';dtk10';:1,';pepyaka';:1,';Oscar平台0.366.0';:1,';myracout';:1,';566';:1,';mw1333.eQiad.wmnet';:1,';nq_。:1,';nws';:1,';genicorn';:1,';mw1327.eqad.wmnet';:1,';apache-coyote';:1,';ask.fm web服务';:1,';cat Factory 1.0';:1,';ecs(DNA&39;:1,';ia。ecacc(DNA';:1,';kestrel';:1,&39;mw1266.eQiad.wmnet';:1,';api-ateway';:1,';istio-特使';:1,';SMART';:1,';上传服务器';:1,';特使-iad';:1,';:1,';特使&iad';:1,';特使';:1,';特使&iad';:1,';手工钻头';:1;火箭';:1}。
但当然,这只是报告其服务器的网站的一个子集,准确地说是386个:
那“Powered By”标题呢?它只出现在55个网站上,但我想我想看看:
{";PHP";:21,";Express";:13,";WordPress";:5,";ASP.NET";:4,";ARR";:2,";Fenrir";:1,";BrightSpot";:1,";Element";:1,";Victors";:1,:1,";shci_v1.13";:1,";Lovestack Edition";:1,";HubSpot";:1,";Nessie";:1}。
当我浏览这些网站时,我意识到一个基于中国的网站只有8个标题!与我看到的一些人超过25岁相比,这似乎很小。我当时很好奇地想知道,哪些地方有苔藓头?我带您看看这里的顶部和底部。我有点惊讶的是,History.com在榜首,因为我在期待一些广告公司。:)。
{";https://history.com";:32,";https://princeton.edu";:31,";https://gizmodo.com";:31,";https://inc.com";:31,";https://wired.com";:30,";https://forbes.com";:29,";https://nature.com";:29,";https://newyorker.com";:29,";https://www.docusign.com";:29,";https://www.fastly.com";:29,";https://istockphoto.com";:28,";https://vox.com";:28,";https://theverge.com";:28,";https://utexas.edu";:28,";https://vimeo.com";:27,";https://nytimes.com";:27,";https://slideshare.net";:27,";https://yelp.com";:27,";https://psychologytoday.com";:27,";https://nokia.com";:27,";https://airbnb.com";:27,";https://upenn.edu";:27,";https://gitlab.com";:27,";https://bbc.com";:26,";https://nih.gov";:26,";https://harvard.edu";:26,";https://yale.edu";:26,";https://oracle.com";:26,";https://unicef.org";:26,";https://usgs.gov";:26,";https://www.docker.com";:26,.";https://about.me";:10,";https://europa.eu";:9,";https://line.me";:9,";https://issuu.com";:9,";https://qq.com";:9,";https://detik.com";:9,";https://washington.edu";:9,";https://rt.com";:9,";https://t.co";:9,";https://nginx.org";:9,";https://4shared.com";:9,";https://googleblog.com";:9,";https://iso.org";:9,";https://ucoz.ru";:9,";https://www.discourse.org";:9,";https://archive.org";:8,";https://hatena.ne.jp";:8,";https://amzn.to";:8,";https://chinadaily.com.cn";:8,";https://rediff.com";:8,";https://sputniknews.com";:8,";https://rakuten.co.jp";:7}。
我想知道不同的国家是否对这些标题有不同的规定,我们是否可以在数据中看到这一点。为了好玩,让我们查看一下History.com,看看这些标题到底是什么。看到“AETN-”前缀标题似乎捕捉到了我的位置信息,我非常不高兴。
AETN_BACKEND FAST LISTEL SHIELD--SHIELD_CACHE_bwi5125_BWI AETN-Web-Platform WebCenter AETN-Watch-Platform FALSE AETN-州代码XXX AETN-邮政编码XXX AETN-经度XXX AETN-纬度XXX AETN-EU N AETN-设备桌面AETN-国家/地区名称美国AETN-国家/地区代码美国AETN-大陆代码NA AETN-城市XXX AETN。
你看,我没有明确提供任何东西。我不确定这些标题是什么,因为我在谷歌上搜索失败了。有人知道吗?
etagHeader跟踪资源的特定版本。这给了我们一个疯狂的细节水平,如果我们想要准确地重现一些网络抓取的东西。当然,如果电子标签不匹配,我们就会遇到麻烦。现在连返程机都帮不了我们了!
LinkHeader似乎包含实际的链接属性,并且它们代表备选地址。例如,docker.com具有:
这个小小的练习让我玩得很开心!我认为对于研究软件工程师来说,考虑代码之外的事情是很重要的,并考虑:
对于任何一种涉及数据的工具,尽管我在这个领域没有做太多的工作,但我强烈支持这样一种想法,即软件不仅应该使“运行东西”变得容易,而且应该使共享和与输出交互变得容易。但我明白,也许不是每个人都想把空闲时间花在编写Javascript上。这个周末,我恰如其分地偶然发现了一条推文,它很好地总结了我的4天周末:
我一直讨厌人们问我“你是做什么消遣的?”因为我做的事情和我在工作时会做的完全一样,尽管“无用因素”是巨大的。那就是我的周末。这是一次有趣的练习,但它让我对浏览器中收集的信息更加焦虑。我希望围绕这些问题有更多的讨论-这些数据如何变得更加透明?不管怎样,我们对这些标题有什么控制呢?见鬼,这只适用于静态文件的单个GET请求。我甚至不想想象当我导航到某个站点时正在运行的是哪种javascript,我怀疑我所有的本地端口都在被扫描,无论是服务器还是其他。我们能做些什么呢?