bootstrap折叠调用collapse()后data-parent不生效问题

今天做的项目,用到了bootstrap的折叠功能,这个功能需要只展开一个折叠框,点击一个就会自动隐藏另一个,初始按照API做了一下,发现一切运行正常,但是测试的同事提了一个bug,说切换到其他模块后再切换回来,发现原先展开的折叠框没有折叠起来--即恢复原样。于是又去修改代码,回来的时候对所有折叠框调用: .collapse('hide')方法。

$(".love .collapse").collapse('hide');


调用之后发现,点击连接苗,data-parent失效了,也就是可以同时展开多个折叠框



这严重脱离了需求,于是又去查了API并写了几个demo,发现了一个问题,只要在初始化的时候调用 .collapse()方法,就会出现这种同时展开多个折叠框的情况。但是奇怪的是:当页面渲染出来后,你去点击了折叠框后,这个时候再触发某个事件调用.collapse()方法,就不会出现这种同时展开多个的情况。

于是找到了两个解决的方法:

方法一:

在我的项目中,折叠框默认是折叠的,即没有.in类,基于以上的发现,于是改变源码:

$(".love .collapse.in").collapse('hide');


因为在bootstrap中折叠框的展开是由.in类修饰的,所以有.in类的必定是经过点击的,在初始化的时候


$(".love .collapse.in")

返回的必定是[]数组,因为默认是收起的。经过几个浏览器的测试,发现没有问题,问题解决了。


方法二:

在一个外国网站也发现了一个解决的方法,触发这种事件发生的原因是bootstrap的js的某个机制的实现问题,但是API没有给出这种事件的说明和处理方法,于是我们可以重写折叠框展开和收起的事件,首先在连接处加一个类.collapse-toggle,这个类可以随便指定.:

$(document).on('click', '.collapse-toggle', function(event) {
        event.stopPropagation();
        var $this = $(this);

        var parent = $this.data('parent');
        var actives = parent && $(parent).find('.collapse.in');

        // From bootstrap itself
        if (actives && actives.length) {
            hasData = actives.data('collapse');
            //if (hasData && hasData.transitioning) return;
            actives.collapse('hide');
        }

        var target = $this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, ''); //strip for ie7

        $(target).collapse('toggle');
});​


这里用到了jquery的data()方法,data()方法可以获取标签的data-*属性,我认为用在这里不是很好,主要是这个方法在IE6、IE7中不支持,要想完美兼容,可以使用attr()方法。

<think>好的,我现在需要帮助用户了解在Bootstrap 4.1.2之前的版本中,如何利用collapse组件的data-parent属性进行XSS攻击。首先,我需要回忆Bootstrap的相关漏洞历史,特别是与XSS相关的部分。 记得Bootstrap 4.1.2修复了一个XSS漏洞,该漏洞涉及collapse组件中的data-parent属性。在旧版本中,data-parent属性可能未正确过滤用户输入,导致攻击者能够注入恶意脚本。当这个属性被动态设置为用户可控的数据时,比如从URL参数或表单输入中获取,就可能触发XSS。 接下来,我需要验证这个漏洞的具体机制。攻击者可能构造一个特殊的data-parent值,包含JavaScript代码,例如`data-parent="</script><script>alert(1)</script>"`。当Bootstrap处理这个属性时,如果没有适当的转义或验证,恶意脚本会被执行。 此外,需要确认Bootstrap在解析data-*属性时的处理方式。旧版本可能直接将这些属性插入到DOM或JavaScript执行环境中,而没有进行HTML编码或过滤,导致注入的可能性。例如,在动态创建collapse元素时,如果使用用户提供的data-parent值,未经过滤就拼接进HTML或JavaScript代码中,就会产生漏洞。 还要考虑实际攻击场景,比如在用户可编辑的内容中允许输入data-parent属性,或者通过URL参数动态设置该属性。如果网站将这些值直接传递给前端组件,而没有服务器端的过滤,攻击者可以诱导用户点击恶意链接,触发XSS。 最后,需要参考官方资料或安全公告来确认这些细节。例如,Bootstrap的官方博客或CVE报告中可能会提到这个漏洞的具体利用方式和修复方法。同时,用户提到的引用[^1]中提到Bootstrap因为XSS问题禁用了某些属性,但data-*方式不可用,这可能与漏洞的修复措施有关,比如在4.1.2版本中加强了对data-parent的过滤或处理方式。</think>### Bootstrap <4.1.2 Collapse组件XSS漏洞分析 在Bootstrap 4.1.2之前的版本中,Collapse组件的`data-parent`属性存在XSS漏洞,主要原因是未对用户输入进行充分过滤和编码。攻击者可构造包含恶意脚本的`data-parent`属性值,通过以下步骤实现攻击: 1. **漏洞触发条件** 当使用动态生成的`data-parent`属性值时(例如从URL参数或数据库读取),若未经过滤直接渲染到HTML中: ```html <button data-toggle="collapse" data-target="#demo" data-parent="</script><script>alert(document.cookie)</script>"> ``` 2. **攻击原理** Bootstrap内部处理`data-parent`属性时,旧版本使用`jQuery.data()`方法解析属性值。当属性值包含未转义的HTML特殊字符时,浏览器会将其解析为新的DOM元素,导致脚本执行。例如: ```javascript // 漏洞代码示例(简化版) var parent = $(element).attr('data-parent'); $(parent).addClass('show'); ``` 3. **修复方案** Bootstrap 4.1.2通过以下方式修复该漏洞: - 强制将`data-parent`属性值作为CSS选择器处理 - 使用`document.querySelectorAll()`替代直接字符串拼接 - 对特殊字符进行转义,例如将`<`转义为`\u003c`
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值