ZBLOG

hook ineerHTML,innerHTML传参的变量提取所有原始URL

要 Hook innerHTML 属性并提取传入的 HTML 字符串中的所有原始 URL,可以通过 JavaScript ProxyObject.defineProperty 拦截 innerHTML 的赋值操作,然后使用正则表达式或 DOM 解析方法提取 URL。以下是实现方法:


方法 1:Hook innerHTML 并提取 URL(Proxy/defineProperty)

步骤

  1. 拦截 innerHTML 的 setter
    通过修改元素的 innerHTML 属性,在赋值时捕获 HTML 字符串。
  2. 从 HTML 中提取所有 URL
    使用正则表达式或 DOM 解析(如 DOMParser)提取链接。

代码实现

// Hook单个元素的innerHTML
function hookElementInnerHTML(element) {
    const originalDescriptor = Object.getOwnPropertyDescriptor(
        Object.getPrototypeOf(element),
        'innerHTML'
    );

    Object.defineProperty(element, 'innerHTML', {
        set: function(value) {
            // 提取URL的逻辑
            extractUrlsFromHtml(value);
            
            // 继续原始赋值操作
            originalDescriptor.set.call(this, value);
        },
        get: function() {
            return originalDescriptor.get.call(this);
        }
    });
}

// 从HTML文本中提取URL
function extractUrlsFromHtml(html) {
    const urls = [];
    
    // 方法1:正则匹配(简单场景)
    const regex = /(href|src)=["'](https?:\/\/[^"']+)["']/gi;
    let match;
    while ((match = regex.exec(html)) !== null) {
        urls.push(match[2]); // match[2]是URL部分
    }

    // 方法2:DOM解析(更准确)
    const doc = new DOMParser().parseFromString(html, 'text/html');
    ['a', 'img', 'script', 'link'].forEach(tag => {
        doc.querySelectorAll(tag).forEach(el => {
            const url = el.href || el.src;
            if (url && url.startsWith('http')) urls.push(url);
        });
    });

    console.log('Extracted URLs:', urls);
}

// Example: Hook某个div的innerHTML
const targetDiv = document.querySelector('#myDiv');
hookElementInnerHTML(targetDiv);

//测试:设置innerHTML时会触发URL提取
targetDiv.innerHTML = '<a href="https://example.com">Link</a><img src="http://test.com/image.png">';

方法2:批量Hook所有元素的innerHTML

如果需要监控页面中所有动态插入的内容,可以劫持 Element.prototype.innerHTML

(function() {
    const originalInnerHTML = Object.getOwnPropertyDescriptor(
        Element.prototype,
        'innerHTML'
    ).set;

    Object.defineProperty(Element.prototype, 'innerHTML', {
        set: function(value) {
            extractUrlsFromHtml(value); //调用之前的提取函数
            originalInnerHTML.call(this, value);
        }
    });
})();

注意事项

  1. 性能影响
    Hook innerHTML可能对性能有轻微影响,建议仅在调试或分析时使用。
  2. 兼容性
    • DOMParser需要现代浏览器支持。
    • Proxy方案无法直接拦截原生属性,优先用Object.defineProperty
  3. 动态内容
    如果URL是通过JavaScript动态生成的(非直接写在HTML中),需额外Hook相关API(如fetchappendChild)。

输出示例

当设置以下代码时:

document.body.innerHTML = '<a href="https://google.com">Google</a>';

控制台会输出:

Extracted URLs: ["https://google.com"]

这种方法可用于爬虫、安全分析或前端监控场景。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23130

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?