gpt4 book ai didi

javascript - 如何用 Javascript 覆盖 Image 对象

转载 作者:行者123 更新时间:2023-11-30 06:30:59 25 4
gpt4 key购买 nike

我想覆盖 window.Image 对象以检测到对浏览器的一些 XSS 攻击。看代码:

(function(){
if(typeof(window.Image)!=="object"){
var _original_Image=new Image();
Object.defineProperty(_original_Image,'src', {
set: function(srcAttr){
if(/document\.cookie/.test(srcAttr)){console.log('cookie attack!')};
_original_Image.setAttribute('src',srcAttr);
},
get: function(){return _original_Image.src};
})
window.Image = function(){ return _original_Image };
return _original_Image;
}
}())

运行它。

>>> a = new Image()
<img>
>>> a.src="document.cookie"
cookie attack!
GET http://192.168.0.2/document.cookie 404 (Not Found)
>>> document.body.appendChild(a)
<img src="document.cookie">

图片添加成功

但是有一些问题。看

>>> b = new Image()
<img src="document.cookie">

它意味着原始的 HTMLImageElement 已更改,它将具有最后的 img 元素的属性。

我要它返回<img>仅有的。怎么办?

最佳答案

我们应该覆盖正在创建的 Image 对象,而不是您正在做的本地 Image 对象本身。它应该看起来像这样:

(function () {
var NativeImage;

var createImage = function () {
var image = new NativeImage(arguments);

Object.defineProperty(image, 'src', {
set: function (srcAttr) {
// whatever else you want to put in here
image.setAttribute('src',srcAttr);
},
get: function () {
return image.src;
}
});

return image;
};

if (typeof window.Image !== 'object') {
NativeImage = window.Image;
window.Image = function () {
return createImage.call(this, arguments) ;
};
}
}());

关于javascript - 如何用 Javascript 覆盖 Image 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17675187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com