jQuery原型

本文深入探讨了jQuery中原型对象的实现方式,解释了如何通过prototype属性扩展jQuery的功能,以及为何使用jQuery.fn作为jQuery.prototype的别名。文章还详细分析了jQuery在不使用new运算符的情况下如何正确实例化的方法。


JavaScript中的原型对象(以下为示例,有错误。)
JavaScript通过为所有函数绑定一个prototype属性用来指向一个原型对象。此原型对象可以定义类继承、属性和方法
        <Script >
            var jQuery = function(){
                            jQuery.prototype = {//扩展的原型对象
                                
                                }
                        }
        </script>
        更安全的作法是,定义一个属性
        <Script >
            var jQuery.fn = jQuery.prototype = {//扩展的原型对象
                                
                                }
        </script>        
        这里的jQuery.fn相当于jQuery.prototpye的别名。那么
            var $ = jQuery = function(){}
            
        给jQuery添加两个成员
        var $ = jQuery = function (){
                            jQuery.fn = jQuery.prototype = {
                                                    jquery: "1.2.3",    //原型属性
                                                    size:    function(){    //原型方法
                                                                return this.length;
                                                            }
                                        }
                        }
        调用方法:
        正常调用方法为:
            var my$ = new $();//实例化
            alert( my$.jquery );
            alert( my$.size() );
            
        但jQuery却如下:
            $().jquery;
            $().size();
            即,jQuery没有使用new运算符将jQuery类实例化。实际在浏览器使用这段代码会报错。没有实例化,那么
                var $ = jQuery = function(){
                                    return new jQuery();
                                }
            然而,仍然会报错,堆栈溢出。说明有死循环。那么:
            使用一个工厂方法来创建一个实例,并把它放到prototype原型对象中,然后在构造函数中返回这个调用。
                var $ = jQuery = function() {
                                    return jQuery.fn.init();
                                }
                jQuery.fn = jQuery.prototype = {
                                    init: function(){
                                                return this;
                                            },
                                    jquery:"1.2.4",
                                    size: function(){
                                                return this.length;
                                            }
                            }
以上示例还是有错误,它并没有实例化jQuery,那么要如何做?

转载于:https://www.cnblogs.com/Abner5/p/5987813.html

### 如何复现 jQuery 原型污染漏洞 为了理解如何复现 jQuery原型污染漏洞,重要的是先了解 JavaScript 中的对象原型链机制以及 jQuery 对象处理方式。 #### 什么是原型污染? 在 JavaScript 中,对象可以通过其内部属性 `__proto__` 或者通过构造函数的 `prototype` 属性继承其他对象的行为。当攻击者能够修改全局对象或其他共享对象的原型时,就可能发生原型污染[^1]。 #### 复现环境准备 要创建一个可重现此漏洞的实验环境,建议使用较旧版本的 jQuery 库(如 v3.4.0 及之前),因为现代版本已经修复了许多已知的安全问题。可以在 HTML 文件头部引入如下脚本标签: ```html <script src="https://code.jquery.com/jquery-3.4.0.min.js"></script> ``` #### 构造恶意输入数据 接下来编写一段简单的代码来展示如何利用 $.extend() 方法实现原型污染。$.extend() 是 jQuery 提供的一个用于合并两个或多个对象的方法,在某些情况下可能会被滥用从而导致安全风险。 ```javascript // 创建一个新的 Object 实例作为目标对象 var targetObj = {}; // 攻击载荷:向所有对象注入自定义属性 'polluted' $.extend(true, targetObj, { __proto__: { polluted: "Yes!" } }); // 测试是否成功污染了内置对象 String.prototype console.log(({}).polluted); // 输出:"Yes!" console.log(String.prototype.polluted); // 输出:"Yes!" ``` 这段代码展示了如果开发者不当使用了 $.extend() 并允许不受信任的数据传入,则可能导致整个应用程序上下文中任意对象都被篡改的风险。 请注意,上述例子仅限于学习目的,并不鼓励任何非法行为。实际开发过程中应始终遵循最佳实践指南以防止此类安全隐患的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值