''

Orien Daily

  1. 🔐 OAuth 回调劫持:为什么一个“差不多匹配”的 redirect_uri 会变成账号接管很多人以为 OAuth 登录的风险主要在密码,其实大量事故根本不碰密码,而是出在回调地址 redirect_uri 的校验太松

    🔐 OAuth 回调劫持:为什么一个“差不多匹配”的 redirect_uri 会变成账号接管

    很多人以为 OAuth 登录的风险主要在密码,其实大量事故根本不碰密码,而是出在回调地址 redirect_uri 的校验太松。OAuth 的核心流程是:用户在身份提供方登录后,授权码 code 会被浏览器带回业务方预先登记的回调地址。如果服务端只做“包含关系”“前缀匹配”或者允许任意子路径、任意子域,攻击者就能把本该回到你应用的授权码,骗去自己的页面,再拿这个 code 去换取 access token,结果就是用户刚正常登录,账号却被别人接管了。

    为什么这种事会发生?因为很多系统把“能跳回自己网站”理解成了“域名看起来像自己就行”。比如把 https://app.example.com/callback 放宽成 https://app.example.com/*,甚至更糟,允许 https://*.example.com/*。一旦某个子域可被上传内容、可被接管,或者存在开放重定向,攻击者就能把 OAuth 服务器返回的 code 转走。麻烦在于,这不是用户输错密码,也不是浏览器中毒,而是协议落地时把“精确绑定”做成了“模糊容忍”。

    现实防护也别搞玄学,直接把边界钉死。redirect_uri 必须做精确匹配,最好精确到完整 URL;不要支持通配符子域;不要依赖“先跳到本站再 302 到别处”的补救设计;客户端在发起授权时要带高强度 state 防 CSRF,移动端和 SPA 还应该用 PKCE,避免授权码被截获后直接复用。还有一个常被忽略的点:如果业务里存在 open redirect,它本身就可能成为 OAuth 回调劫持的跳板,所以开放重定向不是“小漏洞”,放到认证链路里就会升级。

    🧪 场景题:某公司把 OAuth 回调地址配置成 https://login.example.com/*,而 https://login.example.com/redirect?next= 存在开放重定向。攻击者发起授权请求,把回调写成 https://login.example.com/redirect?next=https://evil.com/catch。用户完成登录后,授权码最终会到谁手里?为什么?答案:login.example.comevil.com/catch

    💡 核心记忆:OAuth 最怕的不是密码泄露,而是把授权码送错地方,所以 redirect_uri 必须精确绑定,不能“差不多就行”。

  2. 📸 @WhiteSoxVideoホワイトソックスが、レート・フィールドの売店に新メニュー「ムネショット」を導入しました

    📸 @WhiteSoxVideo
    ホワイトソックスが、レート・フィールドの売店に新メニュー「ムネショット」を導入しました。

    これはアメリカ風の大型寿司ロールで、最初のロールを食べ終えると、底を押し上げることで中からさらに寿司が出てくる仕組みになっています。 #WhiteSox #村上宗隆
    原文 #MLB日本選手

  3. 📸 @MLBJapan👀🍣 の新商品発売へ! 本拠地にて、カリフォルニアロールとエビの天ぷらを楽しめる「Muneshot Sushi Push-Pops」が登場!日本人選手のハイライト映像は公式YouTubeチャンネルでチェック👉

    📸 @MLBJapan
    👀🍣 の新商品発売へ!

    本拠地にて、カリフォルニアロールとエビの天ぷらを楽しめる「Muneshot Sushi Push-Pops」が登場!



    日本人選手のハイライト映像は
    公式YouTubeチャンネルでチェック👉
    https://www.youtube.com/@mlbjapan #村上宗隆 #ホワイトソックス #日本人選手情報
    原文 #MLB日本選手

  4. 🔑 Shell 里为什么要有 exit status很多人刚学命令行时,只盯着命令有没有“输出”

    🔑 Shell 里为什么要有 exit status

    很多人刚学命令行时,只盯着命令有没有“输出”。这其实抓错重点了。对 Shell 来说,一条命令最重要的不只是打印了什么,而是它最后到底算“成功”还是“失败”。这个结果不会靠一句英文提示来判断,而是靠一个很小但非常关键的数字:exit status,也就是退出状态码。

    这样设计不是为了学术优雅,而是为了让程序能接着程序说话。人类看得懂 “file not found”,机器不该去猜你这句英文是什么意思。于是 Unix 很早就定了个朴素规则:命令结束时交一个整数出来,0 表示成功,非 0 表示失败。Shell 再根据这个数字决定后面该不该继续执行,比如 cmd1 && cmd2 只有在 cmd1 成功时才跑 cmd2,而 cmd1 || cmd2 则是在 cmd1 失败时才补上第二个命令。你平时觉得这些符号顺手,背后靠的就是 exit status,而不是输出文字。

    这里最容易踩坑的地方是:有输出,不等于成功;没输出,也不等于失败。比如 grep pattern file 找到了会返回 0,没找到常常返回 1,但这不代表程序坏了,只是“没匹配到”。再比如有些命令明明打印了一堆错误信息,如果你不检查 $?,或者不把它放进 &&、||、脚本的错误控制里,Shell 还是可能继续往下跑,把后续步骤也一起搞脏。更坑的是管道。很多人以为 cmd1 | cmd2 里只要前面炸了,整个就算失败;实际上默认情况下,Shell 往往只看最后一个命令的退出状态。所以前面已经出错,后面命令如果照样退出 0,你会得到一个“表面成功”的假象。这就是为什么写严肃脚本时常要加 set -e,甚至 set -o pipefail:不是为了显得专业,是为了别让错误悄悄溜过去。

    你可以把 exit status 理解成命令行世界里最基础的协议。输出是给人看的,状态码是给系统接线用的。没有这个约定,自动化脚本、CI、部署流程都会变成一堆脆弱的字符串匹配,稍微换个报错文案就全废了。

    🧪 课后一题:执行 false && echo ok || echo fail,终端最终会打印什么?为什么?答案:failfalse&&echo ok||echo fail

    💡 易混淆点:0 在编程里常像“假”,但在 Shell 的 exit status 里,0 恰恰表示成功,非 0 才表示失败或特殊情况。

  5. 🎵 Ichi Fuji — Hellbach专辑:Hanako no yume · 6:20这首 j-pop 走的不是短平快路线,6:20 的篇幅让旋律和情绪有空间慢慢铺开,听感轻盈但不飘

    🎵 Ichi Fuji — Hellbach
    专辑:Hanako no yume · 6:20

    这首 j-pop 走的不是短平快路线,6:20 的篇幅让旋律和情绪有空间慢慢铺开,听感轻盈但不飘。《Ichi Fuji》把和风命名里的清冷感和梦境气质拧在一起,落点比一般 J-Pop 更舒展。

    🔗 Spotify · #推歌 #J-Pop

  6. 📸 @yeji_news ×2260723 L'Officiel SingaporeITZY's YEJI Leads Star-Studded Opening of Roger Vivier's New Singapore Flagship 🔗

    📸 @yeji_news ×2
    260723 L'Officiel Singapore

    ITZY's YEJI Leads Star-Studded Opening of Roger Vivier's New Singapore Flagship



    🔗 https://www.lofficielsingapore.com/fashion/itzy-yeji-leads-star-studded-opening-of-roger-vivier-new-store-singapore-flagship-celebrity #YEJI #예지 #YEJIxRogerVivierSG
    原文 #黄礼志

  7. 📸 @belleequipe1031もちろん、こちらが本命です✨適正な温度管理とこまめな水分補給あとはよく食べてよく寝るそれだけできっと上出来💯推しにも全肯定botにも元気でいてもらわないとね😂 #加藤小夏 #全肯定bot #暑中見舞い原文 #加藤小夏

    📸 @belleequipe1031
    もちろん、こちらが本命です✨

    適正な温度管理とこまめな水分補給
    あとはよく食べてよく寝る
    それだけできっと上出来💯

    推しにも全肯定botにも
    元気でいてもらわないとね😂 #加藤小夏 #全肯定bot #暑中見舞い
    原文 #加藤小夏