欢迎回来
登录你的知识库账户
忘记密码?
还没有账户?立即注册
创建账户
注册你的专属知识库
已有账户?去登录
找回密码
输入注册邮箱获取验证码
返回登录
请输入图片中的验证码以继续注册
加载中...
取消
新建收藏
手动添加你喜欢的内容
取消
编辑头像与昵称
上传新头像或修改你的显示昵称
支持 JPG/PNG,最大 2MB
取消

问题反馈

notebasewww.notebase.cn
控制台
内容库
动态
管理
账户
U
用户
--
在线
v0.8.7 · 知识库
笔记
KnowledgeBase
网络无边,知识有迹。
0笔记
0工具
30推荐

分类导航

按主题直达

编辑精选

站内用户贡献 · 真实笔记

最新收录

每日更新
继续浏览全部内容 →
>
笔记
0
加载中...
工具
0
此页用于记录用户反馈问题后的每一次改进
笔记用法

“写笔记”支持四种格式——Word 文档、Excel 表格、Markdown、纯文本,起稿或二次编辑时都能随时切换,同一篇笔记想用哪种形态来记,都由你说了算。

md、txt、csv、json 这类纯文本则原样载入,不做多余加工。拿一张现成的表倒进来、改几笔、再导出去,等于白用一台免费的格式转换器。

要带走就在右上角点“下载”,可导出 PDF、Word、Markdown、Excel、TXT 等格式;列表卡片“⋯”菜单里,也有同样的下载入口。

工具用法

在“工具”页点“+ 上传工具”即可发布:填好名称与链接,再用 Markdown 把使用方法写清楚——能解决什么问题、怎么装、怎么用,比堆介绍实在。

要分发安装包就一并上传压缩包(ZIP、RAR、7Z、TAR.GZ,最大 35MB),别人在详情页一键下载;只放链接不带附件也可以。

工具按大家的收藏热度排序,好用的自然会被顶上来。发布后可在详情页或卡片菜单里编辑、下架。

隐藏笔记

写笔记时勾上“隐藏”,这篇就只存在于你自己的账号里:不进列表、不进搜索、不上首页精选,也不会出现在任何公开的页面,链接发给别人同样打不开。

适合放密码、草稿、日记这类只给自己看的内容;想公开,去“发布”打开它,把“隐藏”的勾去掉再保存,之后编辑会默认保持原状态,不会悄悄变回公开。

数据安全

你的内容会同时保存在多个副本上,系统定期做备份与完整性校验,再配合异地容灾机制:就算某台机器出问题,数据也不会丢,可以长期放心存放;特别重要的资料,仍建议你另外再留一份备份。

技术

全站跑在容器化、模块化的现代架构上,更新、部署、回滚都很快,扩展性和稳定性都按长期运营的标准来设计(Built for reliability, designed to scale)。

理念

这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。

原则

不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。

更多

产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。

举报

如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。

趋势
// 点击导航加载发现
归档
// 归档为空
最近浏览
// 暂无浏览记录
发布
// 加载中...
用户发布
// 加载中...
用户管理
// 加载中...
访问统计
// 加载中...
内容审核
// 加载中...
个人信息
// 加载中...
返回首页

百万复选框中的秘密:青少年如何用二进制黑进我的网站

1970/1/1趣味冷知

一位开发者发现自己的百万复选框网站被青少年用二进制编码写满了隐藏消息,惊叹于他们的创造力和技术热情。

百万复选框中的秘密:青少年如何用二进制黑进我的网站

意外的高人气

2024年6月26日,我发布了一个名为“One Million Checkboxes”(OMCB)的网站。正如其名,这个网站拥有一百万个全局复选框——任何用户勾选或取消勾选一个框,都会实时同步给网站上的所有人。

我对这个网站的预期非常低,但事实证明我错得离谱。我原本以为会有几百个玩家勾选几千个框,结果在网站运营的两周内,50万玩家共计勾选了超过6.5亿次复选框。网站被《纽约时报》《华盛顿邮报》报道,出现在Know Your Meme和维基百科上,整个过程简直是一场狂野的旅程。

另外我写了一篇单独的技术博客介绍OMCB的性能优化细节,但这篇文章要讲的是运营这个网站时我最喜欢的一个故事。

背景1:OMCB刻意地让“涂鸦”变难

我喜欢制作能帮助人们在互联网上互动的游戏。有些人会在网上当混蛋,所以当我做这类游戏时,我总会尝试加入一些限制,让一般的互动体验更愉快一些。

根据我之前做“Talk Paper Scissors”时收集的数据,大约4.5%的对局中有人试图搞破坏。像我这样经验丰富的人很清楚:如果你在公共互联网上放一块不受限制的画布,人们会画什么东西出来。所以对于OMCB,我想要限制绘画的可能性。

我的做法是:让每行复选框的数量根据浏览器窗口宽度动态调整。

比如我写下“EXAMPLE”这个词,但只有当浏览器窗口宽度完全一致时,你才能看到它。一旦每行的复选框数量发生变化,这条消息就消失了。

这意味着:如果你在手机上画了什么粗鲁的东西,我在笔记本电脑上根本看不到。反过来也一样——你的涂鸦只对那些和你拥有完全相同屏幕尺寸的人可见。

这个限制特别巧妙的一点是它非常隐蔽:你永远不会意识到你的文字实际上没有显示给网站上的其他人!当时我收到了大量评论,要求我“修复”这个问题,让大家能够自由涂鸦。但这是我深思熟虑的选择。根据我的经验,陌生人互动游戏里最棒的故事,往往来自人们如何绕过我设定的限制。

后来证明,这是非常关键的一个伏笔。

背景2:状态存储方式

OMCB有一百万个复选框——这可是个不小的数字!为了高效存储和传输状态,我做了这样的设计:复选框只有两种状态——勾选或未勾选,这正如二进制中的1和0。所以我把每个复选框的状态存储为1比特:如果第3个复选框被勾选,则第3位比特为“1”,否则为“0”。

这样算下来:一百万比特 ÷ 8 = 125,000字节 = 125KB,连一首MP3的大小都不到,完全可行!

我把这些数据存放在Redis(一种容易上手的数据库)中,并在向客户端传输时用 base64编码 数据。我知道还有其他效率更高的编码选择,但在做OMCB时并不太在意这点,尤其是当时没想到它会这么火爆。

我保证,这些设计细节后面都会用上。

被入侵了?

OMCB上线几天后,由于流量激增,我在朋友Eliot的帮助下用Go语言重写了后端。就在那段混乱的日子里,出于某种莫名的冲动,我把数据库中原始字节的ASCII编码打印了出来——我自己都说不清为什么这么干,反正就这么做了。

当我看到那一输出时,整个人都怔住了:

乱七八糟…… 一大堆看起来像是乱码的内容,但其中赫然夹杂着一些……URL

那是什么?我的数据库里竟然出现了URL!指向catgirls.win的URL!!这绝对不正常。

我的第一反应是:我被黑客入侵了。

我彻查日志寻找入侵痕迹,一遍又一遍翻看我的代码,试图搞清楚为什么有人能往一个只应该存0和1的数据库中塞字符串。什么也没找到。访问日志全部正常,我的代码(非常简单)也没有漏洞。

心跳越来越快,女友已经耐心等我吃饭等了很久……

就在那一刻——等等!我看见了!

隐藏的消息

我盯着数据库中对应那些可疑URL的复选框。

h这个字母在ASCII中是104,这是一个字节(byte),一个字节由8个比特(bit)组成。8个比特,正好对应着数据库里那8个复选框的开关状态。

如果我把某个复选框取消勾选,原来的字母h就变成了另一个字符,原来的URL模式马上被打乱。这绝对不是随机的数据。

我并没有被黑客攻击。有人在用二进制给我写消息。

当我把数据库内容转储为ASCII时,Redis将数据按字节(每8个比特一组)读取并转换成一个0到255之间的数字。如果这个数字落在可打印ASCII字符范围(32-127)内,就打印出对应字符,否则输出十六进制表示(例如\x00代表0)。

因此,聪明的人们在做的事情是:

  1. 勾选复选框(相当于翻转比特位)
  2. 将连续的8个复选框组合成一个数字
  3. 这个数字恰好对应一个ASCII字母
  4. 这些字母拼接起来就构成了一个URL

而这整个过程,是在上百万人同时在线的网站上完成的。

我很震惊,更由衷地佩服。

深入兔洞

那个URL指向的是:https://catgirls.win/omcb

这个域名让人有点踌躇。我搜了一圈,最后还是点开了链接。

页面看起来是——一个Discord邀请!这个Discord服务器名字叫“Checking Boxes”。我毫不犹豫地加入了。

服务器里的人看到我特别激动!我们聊了几句,然后他们问了一个我完全没想到的问题:

“你有没有以一整张1000×1000的图像来看过你的复选框?”

这我确实没见过。他们给我展示了正在做的事情——

他们正在下载全部一百万个复选框的数据,并将它们渲染成1000×1000的网格图(未勾选为白色,勾选为黑色)。

图像上能看到“be gay do crime”这样的文字,下方是我发现的那段二进制消息的重复噪声。而在二进制信息的上方,还有同一条消息的base64编码版本(还记得吗?base64正是我在传输数据时使用的编码)。更绝的是,图像左侧还有一个带完整纠错模式的二维码!

所有这些消息——二进制、base64、QR码——指向的都是同一个Discord服务器。

这个Discord里全是些非常锐利的青少年。他们创作这些隐藏消息的目的,就是为了吸引其他同样聪明的青少年加入进来,一起讨论如何为该网站编写自动化“机器人”。毕竟,任何打算写机器人的人,很可能正在查看的是base64解码后的数据、原始二进制数据,或是1000×1000的图像渲染——这张图把各种技术背景的人一网打尽。

这个策略非常奏效!当我加入时这个Discord还不到20人,到我关闭网站时已经膨胀到超过60人。

他们做了什么?

他们画了大量的画!随着他们构建出更好的绘图系统(甚至反向破解了我的限速机制,当时他们很自豪地告诉我,他们更愿意自己摸索,不需要我告知具体限流参数),他们绘制的图案也变得越来越复杂,包括一个经典的Windows系统蓝屏死机界面(比CrowdStrike事件还早)。

最让我动容的时刻——是当我看到他们不只在画恶搞图,还一起协作完成一些温暖而有意义的内容时。他们在与我完全不同的道路上探索、创造、交流和合作,而我只是碰巧创造了他们玩耍的场地。

事后感悟

回顾这一切,我最喜欢的部分是:我原本设计这个网站时,为了阻止“破坏行为”而加上了浏览器宽度这个随机的“约束”。结果这些孩子不但没有被限制住,反而用完全不同的方式——从最底层的数据存储和传输结构入手——创造了一个属于他们自己的交流空间。

他们看到了复选框背后更本质的东西:比特。而比特之上可以承载一切信息——文字、图片、链接、社区。

他们用一种优美而聪明的方式证明:如果你赋予人们一个看似局限的工具,真正有创造力的人会用你想象不到的方式超越它。

现在每当我想起这些网络上的年轻人们,看着他们用自己的聪明才智在数字世界中开辟自己的小社群、彼此连接、一起搞点新东西时,我依然会感到眼眶发热。

这就是——“百万复选框中的秘密”。

——

原文链接:https://eieio.games/essays/the-secret-in-one-million-checkboxes/

编写使用方法
Markdown 格式 · Ctrl+Enter 确定
新建笔记
预览
数据表格
点击单元格编辑 · Tab 移动
A1fx
Sheet1
BIH1H2≡🔗</>
隐私提醒

取消
编辑工具
取消