2

ブラウザーで検出された XSS 攻撃の window.Image オブジェクトをオーバーライドしたいと考えています。コードを参照してください:

(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>だけにしたい。方法?

4

1 に答える 1

0

作成中の 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) ;
        };
    }
}());
于 2015-06-26T17:10:24.623 に答える