PHP提取HTML图片并校验是否为本站域名的方法

小岛来信
小岛来信
发布时间:2026-10-13 | 4人浏览过
原创

在Web开发中,防止资源盗链是常见需求。本文介绍如何使用PHP原生类库解析HTML字符串,精准提取所有图片链接并校验其Host(域名)是否属于指定范围,从而筛选出非本站外链。

实现原理

核心思路是将HTML文本加载到 DOMDocument 对象中,利用 DOMXPath 检索所有的 <img> 节点。随后遍历每个节点,获取 src 属性值并通过 parse_url() 分离出域名部分。最后将得到的域名与允许的域名列表进行比对,不符合条件的即可视为非本站图片。

准备条件

确保运行环境已安装PHP且启用了默认的XML/HTML扩展。本示例假设待处理的HTML内容存储在文件或字符串变量中,允许的图片域名包含 yourdomain.com 和 www.yourdomain.com。

第1步:加载HTML并初始化XPath

首先创建一个 DOMDocument 实例加载HTML内容,然后基于该文档创建 DOMXpath 对象以便执行查询操作。

$dom = new DOMDocument;
// 忽略HTML5解析时的常见警告
libxml_use_internal_errors(true);
$dom->loadHTML(file_get_contents('input.html'));
libxml_clear_errors();

$xpath = new DOMXpath($dom);

第2步:检索所有图片节点

使用XPath表达式 '//img' 获取页面内所有的 <img> 节点,返回一个NodeList供后续遍历。

$imgs = $xpath->query('//img');

第3步:解析并校验图片域名

遍历节点列表,取出每个图片的 src 属性,使用 parse_url() 分析URL结构。重点检查 ['host'] 是否存在于允许的域名白名单中。若不存在或不在白名单内,则判定为失败。

$allowed_hosts = ['yourdomain.com', 'www.yourdomain.com'];

foreach ($imgs as $img) {
    $src = $img->getAttribute('src');
    // 如果src为空或非绝对路径,parse_url可能无法提取host
    $url_info = parse_url($src);
    
    $is_valid = false;
    if (isset($url_info['host'])) {
        if (in_array($url_info['host'], $allowed_hosts)) {
            $is_valid = true;
        }
    } else {
        // src为相对路径(如 /image.jpg),通常默认属于本站,可视业务逻辑判定为有效
        $is_valid = true;
    }

    if (!$is_valid) {
        echo sprintf('[FAIL] %s\n', $src);
        // 如需直接删除该图片,可使用:$img->parentNode->removeChild($img);
    } else {
        echo sprintf('[PASS] %s\n', $src);
    }
}

测试验证

构建一段包含不同来源图片的HTML代码进行测试:

<p><img src="/local-image.jpg"></p>
<p><img src="http://yourdomain.com/img.png"></p>
<p><img src="http://www.yourdomain.com/img.png"></p>
<p><img src="http://otherdomain.com/fake.png"></p>

预期输出结果如下:

  • [PASS] /local-image.jpg(相对路径,通常视同本站)
  • [PASS] http://yourdomain.com/img.png
  • [PASS] http://www.yourdomain.com/img.png
  • [FAIL] http://otherdomain.com/fake.png

注意事项

  • 相对路径处理:代码中对没有 host 的相对路径进行了宽容处理(标记为PASS)。若需严格限制仅接收特定格式的外部URL,应进一步判断是否为空主机头。
  • 性能优化:对于大型文档,建议使用 @file_get_contents 抑制警告或提前清理无用的HTML头部,以提升 loadHTML 的效率。
  • 编码问题:DOMDocument 对非UTF-8编码支持较差,建议在加载前统一转为UTF-8编码字符串。
以上就是通过PHP限制HTML内容中图片必须是本站的详细内容,更多关于PHP图片安全校验的资料请关注本站其它相关文章!
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表