Hacker News 中文摘要

RSS订阅

DrawAFish.com项目回顾 -- DrawAFish.com Postmortem

文章摘要

2025年8月3日,DrawAFish.com遭遇了约6小时的安全事件,导致用户名被恶意篡改和鱼类图像被不当处理。事件根源包括旧版6位数管理员密码泄露、用户名更新API缺乏认证以及JWT未绑定特定用户。事后通过手动恢复操作、修复授权逻辑和审查备份进行缓解。此次事件提醒了系统安全的重要性。

文章总结

DrawAFish.com 事件回顾——2025年8月3日事故

事件概述: - 持续时间: 约6小时(美国东部时间凌晨2点至早上8点) - 影响: - 用户名被恶意篡改为侮辱性词汇 - 不当鱼类被批准展示,正常鱼类被移除 - 根本原因: 1. 旧版6位数管理员密码在过去的数据泄露中暴露 2. 用户名更新API缺乏身份验证 3. JWT(JSON Web Token)未与特定用户绑定 - 应对措施: 手动撤销管理员操作,修复授权逻辑,审查备份 - 教训: 代码审查和安全性不可忽视

事件详情: 2025年8月1日,DrawAFish.com 在HackerNews上获得了极高的关注,甚至登上了榜首。然而,两天后的8月3日凌晨,网站遭遇了严重的安全事故。在作者睡觉期间,网站被黑客入侵,所有用户名被篡改为侮辱性词汇,大量不当鱼类被批准展示,而正常鱼类则被移除。

漏洞分析: 1. 旧版管理员密码泄露: 作者在创建网站时使用了童年时期的6位数密码进行测试,该密码曾在Neopets.com的数据泄露中暴露。尽管后来启用了Google身份验证,但旧密码未被删除,导致黑客通过该密码登录并篡改内容。 2. 用户名更新API缺乏身份验证: 作者在最后时刻添加了用户修改用户名功能,但未进行代码审查,导致该功能完全缺乏身份验证。 3. JWT未与特定用户绑定: 作者使用JWT进行登录授权,但未验证JWT是否与特定用户ID或邮箱关联,导致黑客可以利用该漏洞进行管理员操作。

恢复过程: 作者在早上7:45发现事故后,立即采取措施。尽管备份设置存在问题,但作者通过编写脚本撤销了所有管理员操作,并修复了授权逻辑。此外,一位HackerNews用户利用JWT漏洞帮助删除了不当内容,并与作者合作进一步修复了代码。

反思: 作者承认自己在开发过程中过于依赖“氛围编程”(vibe coding),忽视了代码审查和安全性。尽管LLM(如Copilot)可以快速生成代码,但最终的责任仍在于开发者。作者表示,这次事故提醒他,即使在小项目中,代码审查和安全性也不可忽视。

总结: 这次事故暴露了DrawAFish.com在安全性方面的严重漏洞,作者通过手动修复和代码审查最终恢复了网站的正常运行。这次经历也让作者深刻认识到,快速开发固然重要,但代码质量和安全性同样不可忽视。

评论总结

评论主要围绕以下几个方面展开:

  1. 对项目的兴趣与赞赏

    • 多位评论者对项目本身表示兴趣,并赞赏了作者的写作风格和幽默感。例如,评论7提到:“Great project and a good post too, you write well and are funny.”(“很棒的项目和文章,你写得很好,也很幽默。”)
    • 评论10则对项目的灵感来源表示好奇:“Curious if you were inspired by Lego's build-a-fish exhibit at the Lego House?”(“好奇你是否受到乐高之家‘建造鱼’展览的启发?”)
  2. 对代码生成与审查的讨论

    • 评论4指出,LLM生成的代码虽然快速,但仍需仔细审查:“LLMs are a tool. They let you generate a lot of code really fast...it is up to you to review it.”(“LLM是一种工具,它们可以让你快速生成大量代码……但你需要自己审查。”)
    • 评论17则强调,发布未经严格审查的“vibe-coded”应用存在风险:“Launching a vibe-coded app that accepts input from anonymous users is just asking for trouble.”(“发布一个接受匿名用户输入的‘vibe-coded’应用就是在自找麻烦。”)
  3. 对安全漏洞与恶意行为的关注

    • 评论2提到有人利用安全漏洞进行反击:“Wild that some random used a security hole to try and counter the malicious actions actively lol”(“有人利用安全漏洞来反击恶意行为,真是疯狂。”)
    • 评论14则调侃道:“The ‘S’ in ‘vibe-coded’ stands for security.”(“‘vibe-coded’中的‘S’代表安全。”)
  4. 对恶意行为的幽默反应

    • 评论5分享了类似的恶作剧经历:“One day someone drew a dick on every single dinosaur.”(“有一天,有人在每只恐龙上都画了一个生殖器。”)
    • 评论16则自豪地表示自己成功绕过过滤器:“I was proud of my ability to have an extremely penis looking fish get past filters.”(“我为自己能让一条看起来像生殖器的鱼绕过过滤器而感到自豪。”)
  5. 对项目未来的建议

    • 评论8建议增加镜像功能:“If you are the dev think you need to add an option to mirror the fish drawing.”(“如果你是开发者,我认为你需要增加一个镜像鱼的功能。”)
    • 评论9则指出投票系统的漏洞:“You can also upvote any fish without auth, limit is 20 votes per minute per IP.”(“你可以在没有认证的情况下为任何鱼投票,每个IP每分钟限20票。”)

总结:评论者对项目本身表现出浓厚兴趣,赞赏了作者的写作风格和幽默感,但也对代码生成与审查、安全漏洞、恶意行为等问题提出了批评和建议。整体上,评论者认为项目虽然有趣,但在安全性和代码审查方面仍需改进。