V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
SSang
V2EX  ›  JavaScript

如何对子域名下的网页注入脚本

  •  
  •   SSang · 2021-11-22 10:20:59 +08:00 · 3050 次点击
    这是一个创建于 1128 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我搞了一个登录页面,用来给一些没有鉴权的第三方的网页做鉴权网关,用 nginx 的 auth_request 做的。 实现的效果是,第三方网页接入 nginx 后,访问反向代理地址如果未登录就跳转到登录页面(有点像是 basicAuth )。

    但是登录成功,重定向会第三方网页后,没有登出按钮,只能手动地址栏输入 ..../logout 来登出。

    我想知道对子域下的网页理论上是否能实现注入一个登出按钮?有什么限制?

    主要是不想改第三方的代码,也改不动。

    (我大概了解了 XSS 注入,但感觉这个得利用网页表单提交等漏洞,而且没有通用性。)

    17 条回复    2021-11-22 14:43:26 +08:00
    IvanLi127
        1
    IvanLi127  
       2021-11-22 10:32:17 +08:00
    以前运营商通过 iframe 给 HTTP 站点投广告,你可以如法炮制
    metalbitch
        2
    metalbitch  
       2021-11-22 10:33:27 +08:00 via Android   ❤️ 1
    nginx 返回网页的时候,进行字符串替换。搜一下 nginx 的字符串替换模块。顺便看一下其他模块有没有更好的解决方案。
    2i2Re2PLMaDnghL
        3
    2i2Re2PLMaDnghL  
       2021-11-22 10:53:11 +08:00
    见过把用户信息栏全部做成 iframe 的,登录登出按钮

    不过鉴于 JavaScript 完全可以在同一个页面上组装,你直接手动添加一段 JS 添加按钮就行,当自己在写用户脚本,脏就完事儿了
    Saxton
        4
    Saxton  
       2021-11-22 10:54:53 +08:00   ❤️ 1
    反向代理可以替换文本, 找个合适的地方替换下就行, 我之前为了方便插入统计代码,直接在反代上插入到 head 里
    zjsxwc
        5
    zjsxwc  
       2021-11-22 11:01:09 +08:00
    楼主的需求仅仅只是
    “我想知道对子域下的网页理论上是否能实现注入一个登出按钮?有什么限制?”

    加个登出按钮而已,登出按钮使用 get 请求,插入 js 很容易实现啊,最多处理下跨域问题。
    SSang
        6
    SSang  
    OP
       2021-11-22 11:02:43 +08:00
    ```
    location / {
    index index.html index.htm index.php;
    sub_filter '</head>' '</head> <body><a href="http://xxxxxx/logout">logout</a></body>';
    sub_filter_once on;
    }
    ```

    感谢各位,简单验证了一下,替换文本可以。
    SSang
        7
    SSang  
    OP
       2021-11-22 11:04:42 +08:00
    @2i2Re2PLMaDnghL
    @IvanLi127
    iframe 是不是得改第三方网页的代码呀?
    metalbitch
        8
    metalbitch  
       2021-11-22 11:10:28 +08:00
    @SSang 应该谢谢我
    SSang
        9
    SSang  
    OP
       2021-11-22 11:11:43 +08:00
    @zjsxwc 我不是很懂,不改第三方代码的情况下,比如我 302 跳转到 baidu ,能在百度的页面添加按钮吗?
    SSang
        10
    SSang  
    OP
       2021-11-22 11:17:23 +08:00
    噢,iframe 的我大概理解了,应该是指 iframe 包装第三方页面再发送回去吧
    metalbitch
        11
    metalbitch  
       2021-11-22 11:17:32 +08:00
    @SSang html 过了你的服务器,你就可以修改内容。不过你的服务器,你就没法修改内容。他说的插入 js ,插在哪里啊?你的 302 是返回给浏览器看的,客户浏览器直接请求了 baidu ,你怎么干涉啊?有点儿现实感。
    SSang
        12
    SSang  
    OP
       2021-11-22 11:27:01 +08:00
    @metalbitch 我知道,过了服务器,我就可以替换,我要给百度添加按钮就得让百度成为我的子域反代到百度,这个用你说的文本替换就能实现。但是我没理解他说的插入 js 很容易实现是指什么?
    metalbitch
        13
    metalbitch  
       2021-11-22 11:34:04 +08:00
    @SSang 他瞎说呗,跨域问题,也是指两个网站都在你掌握下。因为浏览器安全策略阻止,调试两个网站来完成跨域。你明显说了有第三方网站的问题,所以他瞎说,跟 get 请求更没毛线关系。
    SSang
        14
    SSang  
    OP
       2021-11-22 11:39:58 +08:00
    感觉我的场景 sub_filter 会比 iframe 好一点,sub_filter 配置比较无脑,懂一点 html/js 基本就能配了,iframe 用户体验和原本稍微有点不一样了,而且实现起来相对复杂点。

    iframe 看起来能实现的功能会比 sub_filter 更强大,不过配置成本也更高。
    SSang
        15
    SSang  
    OP
       2021-11-22 11:42:36 +08:00
    @metalbitch 噢,谢谢。我就觉得跨域应该没啥希望,除非每个网页都有表单之类的,还不防 xss 注入,所以我问的时候还特意说了子域下。感觉还是你说的文本替换靠谱点。
    metalbitch
        16
    metalbitch  
       2021-11-22 12:01:24 +08:00
    顺便提一下,nginx 是个服务器软件。你可以自己用 php ,java 写登录页面(页面可以想怎么美化就怎么美化),登录成功后使用 php ,java 等代理第三方网站(估计就一行代码),返回给用户。这样就可以脱离自己不熟悉的技术,nginx 就只剩下了常用的配置。
    Saxton
        17
    Saxton  
       2021-11-22 14:43:26 +08:00
    @SSang 真没必要 iframe ,sub_filter 是最好的解决方案,按照这样如果没登录就退出,其实完全可以做到自动退出而无需让用户在点一下,插入一段 js 去判断即可,这段改成 sub_filter '</head>' '这里写你的脚本内容或者引入脚本</head>'; 然后在这个 js 里可以做你想做的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5214 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 03:46 · PVG 11:46 · LAX 19:46 · JFK 22:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.