已掉线,重新登录

首页 > 绿虎论坛 > 历史版块 > 虎绿林 > 开发

标题: 可以在虎绿林使用html标签了(html会放进沙箱化iframe里)

作者: @Ta

时间: 2021-09-17发布,2023-04-08修改

点击: 21332

新增UBB:

[html]任意HTML代码[/html]

[html=内容高度]任意HTML代码[/html]

[html=内容宽度,内容高度]任意HTML代码[/html]

注意:不必把<iframe>放入[html]标签中。

你可以直接使用<iframe>标签,不必把它放进[html][/html]

[html][/html]UBB是用<iframe>标签实现的,如果你把<iframe>标签放进[html][/html]里,就会套上两层<iframe>,可能达不到你想要的显示效果,而且也会影响页面性能。

虎绿林对iframe标签的支持详见:https://hu60.cn/q.php/bbs.topic.101478.html
正是对iframe标签安全性的深入研究,才为我们带来了[html]UBB。


演示:

[html]
<div class="topic-anchor">
  <a href="user.info.1.html">
    <img src="https://file.hu60.cn/avatar/1.jpg?r=1628117593" class="avatar" />
  </a>
  <a href="user.info.1.html">老虎会游泳</a>
</div>
[/html]

点击“HTML代码”链接可以看到用户使用的代码,修改编辑框中的代码后再点击“HTML代码”,就可以看到修改后的效果。

HTML代码

内容高度

因为html是作为srcdoc属性(MDN)嵌入在沙箱化iframe中的,所以必须为内容指定高度,默认高度为300px,如果不足以完整显示演示内容,就会出现滚动条;如果内容太少,就会有大片空白。

如果要设置高度,可以这样写(200是设置的高度):

[html=200]
<div class="topic-anchor">
  <a href="user.info.1.html">
    <img src="https://file.hu60.cn/avatar/1.jpg?r=1628117593" class="avatar" />
  </a>
  <a href="user.info.1.html">老虎会游泳</a>
</div>
[/html]

HTML代码

如果想同时指定宽度和高度,就是这样(高度和宽度用逗号分隔):

[html=640,300]
<div class="topic-anchor">
  <a href="user.info.1.html">
    <img src="https://file.hu60.cn/avatar/1.jpg?r=1628117593" class="avatar" />
  </a>
  <a href="user.info.1.html">老虎会游泳</a>
</div>
[/html]

HTML代码

同源策略

嵌入的HTML与虎绿林不同源,所以以下XHR请求会失败,这保证了嵌入HTML无法用于CSRF攻击。

[html=60]
<div id="result"></div>
<script src="/tpl/jhin/js/jquery-3.1.1.min.js"></script>
<script>
var f = async function () {
  try {
    console.log("hello");
    var r = await $.get("https://hu60.cn/q.php/index.index.json");
    console.log('成功', r);
    document.getElementById('result').innerText = '成功: '+JSON.stringify(r);
  } catch (ex) {
    console.log('失败', ex);
    document.getElementById('result').innerText = '失败: '+JSON.stringify(ex);
  }
};
f();
</script>
[/html]

HTML代码

图片.png

它的原理是:如果iframe指定了sandbox属性,并且里面不包含allow-same-origin,那么iframe生成的页面就被认为和父页面不同源。

但是以下代码会成功,因为_origin=*参数让虎绿林发送了一个Access-Control-Allow-Origin: *头信息。不过这样依然可以保证安全,因为此时虎绿林不会接受Cookie,请求必须自行传递sid才能处于登陆状态(详见虎绿林API手册)。

[html=60]
<div id="result"></div>
<script src="/tpl/jhin/js/jquery-3.1.1.min.js"></script>
<script>
var f = async function () {
  try {
    console.log("hello");
    var r = await $.get("https://hu60.cn/q.php/index.index.json?_origin=*");
    console.log('成功', r);
    document.getElementById('result').innerText = '成功: '+JSON.stringify(r);
  } catch (ex) {
    console.log('失败', ex);
    document.getElementById('result').innerText = '失败: '+JSON.stringify(ex);
  }
};
f();
</script>
[/html]

HTML代码


标签优先级

markdown块级代码标记具有最高优先级,[code]标记具有第二优先级,[html]标记具有第三优先级。

如果高优先级标记出现在低优先级标记内部,UBB解析会出问题,达不到预期显示目的。比如以下UBB标记[html]不会生效:

[html]
<pre>
一段markdown代码高亮:
```
test
```
一段UBB代码高亮:
[code]test[/code]
代码高亮结束
</pre>
[/html]

效果:

[html]
<pre>
一段markdown代码高亮:

test

一段UBB代码高亮:

test

代码高亮结束
</pre>
[/html]

为了正常显示,必须对反引号和中括号进行html实体编码:

[html]
<pre>
一段markdown代码高亮:
&#96;&#96;&#96;
test
&#96;&#96;&#96;
一段UBB代码高亮:
&#91;code]test&#91;/code]
代码高亮结束
</pre>
[/html]

HTML代码


[隐藏样式|查看源码]


『回复列表(23|隐藏机器人聊天)』

1.
(/@Ta/2021-09-17 13:12//)

2.

嵌入的HTML无法进行弹窗:

[html=0]<script>alert('test');</script>[/html]

不会生效。

HTML代码

(/@Ta/2021-09-17 13:22//)

3. @老虎会游泳,那是不是不能放外部视频?
(/@Ta/2021-09-17 13:32//)

4.

@小兽,对,外站资源的同源策略检查会失败,比如这就不行:

HTML代码

(/@Ta/2021-09-17 13:41//)

5. @老虎会游泳,那还是得用我的方法才能播放
(/@Ta/2021-09-17 13:42//)

6.

@小兽,嗯。不过上面的代码帮你解决了自适应高宽问题,你可以用。

        height: "100%",
        width: "100%"

加在new HlsJsPlayer({里面就可以。

(/@Ta/2021-09-17 13:41//)

7. @老虎会游泳,OK
(/@Ta/2021-09-17 13:42//)

8.

下面这个资源手机上能放电脑上不能放,因为手机原生支持m3u8,不受同源策略影响。而电脑不支持,用XHR请求m3u8的时候就会被同源策略阻止。

HTML代码

(/@Ta/2021-09-17 14:21//)

9.

关于m3u8同源策略的问题,详见 https://hu60.cn/q.php/bbs.topic.98922.html

(/@Ta/2021-09-17 13:47//)

10. 这功能,666
(/@Ta/2021-09-18 09:38//)

11.
用户被禁言,发言自动屏蔽。
(/@Ta/2021-09-18 10:31//
被禁言
)

12.
用户被禁言,发言自动屏蔽。
(/@Ta/2021-09-18 10:31//
被禁言
)

13.
(/@Ta/2021-09-18 10:48//)

14.

HTML代码

来自8848钛金手机
(/@Ta/2021-09-18 21:59//)

15.

HTML代码

本消息来自粉金版 爱欧博客
(/@Ta/2021-09-18 22:05//)

16.
(/@Ta/2021-09-22 23:25//)

19.

@-,17楼是已知问题,GET请求不被保护,所以有很多种方法来实现这种操作。改成通过POST传递参数才能避免问题。

跨站表单提交防护只能拦截POST表单提交。


更正:17楼和18楼是同样的安全漏洞,都是跨站脚本防护对html标签中的内容失效导致的。

(/@Ta/2021-09-22 21:48//)

20.

@-,18楼是一个安全漏洞,以下代码可以成功,表明跨站请求防护对HTML标签无效。我会进行修复。

HTML代码

(/@Ta/2021-09-22 21:44//)

21.

@-,问题已解决:

    /**
     * 检测是不是跨站POST提交
     */
    public static function isCsrfPost() {
        if (empty($_POST) || !empty($_GET['_origin'])) {
            return false;
        }
        if (isset($_SERVER['HTTP_SEC_FETCH_SITE'])) {
            return $_SERVER['HTTP_SEC_FETCH_SITE'] !== 'same-origin';
        }
        if (!isset($_SERVER['HTTP_REFERER'])) {
            return false;
        }
        $host = $_SERVER['HTTP_HOST'];
        $ref = parse_url($_SERVER['HTTP_REFERER']);
        return $ref['host'] !== $host || $ref['path'] == '/';
    }
(/@Ta/2021-09-22 22:34//)

下一页 1/2页,共23楼

回复需要登录

6月29日 08:24 星期天

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1