我搞了一个登录页面,用来给一些没有鉴权的第三方的网页做鉴权网关,用 nginx 的 auth_request
做的。
实现的效果是,第三方网页接入 nginx 后,访问反向代理地址如果未登录就跳转到登录页面(有点像是 basicAuth )。
但是登录成功,重定向会第三方网页后,没有登出按钮,只能手动地址栏输入 ..../logout 来登出。
我想知道对子域下的网页理论上是否能实现注入一个登出按钮?有什么限制?
主要是不想改第三方的代码,也改不动。
(我大概了解了 XSS 注入,但感觉这个得利用网页表单提交等漏洞,而且没有通用性。)
1
IvanLi127 2021-11-22 10:32:17 +08:00
以前运营商通过 iframe 给 HTTP 站点投广告,你可以如法炮制
|
2
metalbitch 2021-11-22 10:33:27 +08:00 via Android 1
nginx 返回网页的时候,进行字符串替换。搜一下 nginx 的字符串替换模块。顺便看一下其他模块有没有更好的解决方案。
|
3
2i2Re2PLMaDnghL 2021-11-22 10:53:11 +08:00
见过把用户信息栏全部做成 iframe 的,登录登出按钮
不过鉴于 JavaScript 完全可以在同一个页面上组装,你直接手动添加一段 JS 添加按钮就行,当自己在写用户脚本,脏就完事儿了 |
4
Saxton 2021-11-22 10:54:53 +08:00 1
反向代理可以替换文本, 找个合适的地方替换下就行, 我之前为了方便插入统计代码,直接在反代上插入到 head 里
|
5
zjsxwc 2021-11-22 11:01:09 +08:00
楼主的需求仅仅只是
“我想知道对子域下的网页理论上是否能实现注入一个登出按钮?有什么限制?” 加个登出按钮而已,登出按钮使用 get 请求,插入 js 很容易实现啊,最多处理下跨域问题。 |
6
SSang OP ```
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; } ``` 感谢各位,简单验证了一下,替换文本可以。 |
7
SSang OP |
8
metalbitch 2021-11-22 11:10:28 +08:00
@SSang 应该谢谢我
|
10
SSang OP 噢,iframe 的我大概理解了,应该是指 iframe 包装第三方页面再发送回去吧
|
11
metalbitch 2021-11-22 11:17:32 +08:00
@SSang html 过了你的服务器,你就可以修改内容。不过你的服务器,你就没法修改内容。他说的插入 js ,插在哪里啊?你的 302 是返回给浏览器看的,客户浏览器直接请求了 baidu ,你怎么干涉啊?有点儿现实感。
|
12
SSang OP @metalbitch 我知道,过了服务器,我就可以替换,我要给百度添加按钮就得让百度成为我的子域反代到百度,这个用你说的文本替换就能实现。但是我没理解他说的插入 js 很容易实现是指什么?
|
13
metalbitch 2021-11-22 11:34:04 +08:00
@SSang 他瞎说呗,跨域问题,也是指两个网站都在你掌握下。因为浏览器安全策略阻止,调试两个网站来完成跨域。你明显说了有第三方网站的问题,所以他瞎说,跟 get 请求更没毛线关系。
|
14
SSang OP 感觉我的场景 sub_filter 会比 iframe 好一点,sub_filter 配置比较无脑,懂一点 html/js 基本就能配了,iframe 用户体验和原本稍微有点不一样了,而且实现起来相对复杂点。
iframe 看起来能实现的功能会比 sub_filter 更强大,不过配置成本也更高。 |
15
SSang OP @metalbitch 噢,谢谢。我就觉得跨域应该没啥希望,除非每个网页都有表单之类的,还不防 xss 注入,所以我问的时候还特意说了子域下。感觉还是你说的文本替换靠谱点。
|
16
metalbitch 2021-11-22 12:01:24 +08:00
顺便提一下,nginx 是个服务器软件。你可以自己用 php ,java 写登录页面(页面可以想怎么美化就怎么美化),登录成功后使用 php ,java 等代理第三方网站(估计就一行代码),返回给用户。这样就可以脱离自己不熟悉的技术,nginx 就只剩下了常用的配置。
|