整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

从HTML源代码中检测并输出暗链接


在网络安全领域,暗链接(或隐藏链接)是一种常见的网络欺诈手段。它们通常隐藏在网页代码中,对普通用户不可见,但可能指向恶意网站或用于执行不安全的操作。因此,从网页源代码中检测并识别这些暗链接变得尤为重要。本文将探讨如何从提取的HTML源代码中检测暗链接,并将这些链接进行输出。

一、理解暗链接

什么是暗链接:

暗链接通常指的是隐藏在网页中,对用户不明显,但可能含有恶意内容的链接。

暗链接的常见形式:

完全隐藏的链接,如使用CSS将链接设为透明或大小为零。

使用微小的文本或图像作为链接。

将链接嵌入到不相关元素中。

二、HTML源代码的检测方法

分析HTML结构:

介绍如何查看和理解网页的HTML源代码。

解释如何识别HTML中的链接元素(通常是<a>标签)。

检测暗链接的技术:

使用HTML和CSS属性来识别隐藏的链接,如display: none;、opacity: 0;或width: 0px; height: 0px;等。

检查链接的文本内容和尺寸,判断是否可疑。

三、实现暗链接检测

工具和技术选择:

介绍可用于解析HTML和CSS的工具,如Python的BeautifulSoup库。

代码实现:

提供一个基本的脚本示例,展示如何从HTML中提取链接并检查其属性以识别暗链接。

四、案例分析

实际网页案例:

选取一个包含暗链接的网页作为案例,展示如何使用工具检测这些链接。

结果展示和分析:

展示检测到的暗链接,并对其可能的风险进行分析。

五、总结与预防建议

总结:

强调检测暗链接在网络安全中的重要性。

预防建议:

提供一些基本的网络安全建议,帮助用户识别和避免访问暗链接。

小结

通过本文的讨论,读者可以了解如何从HTML源代码中检测暗链接,并了解这些链接可能带来的风险。虽然这需要一定的技术知识,但通过合适的工具和方法,可以有效地识别和防范这种网络安全威胁。

示例代码(Python使用BeautifulSoup检测暗链接)

python

from bs4 import BeautifulSoup

import requests

# 加载网页内容

url = "https://example.com"

html_content = requests.get(url).text

soup = BeautifulSoup(html_content, 'html.parser')

# 检测暗链接

dark_links = []

for link in soup.find_all('a'):

if link.get('style'):

styles = link.get('style').split(';')

if any(s in styles for s in ['display:none', 'opacity:0', 'width:0px', 'height:0px']):

dark_links.append(link.get('href'))

# 输出检测到的暗链接

print("Detected Dark Links:", dark_links)

这段代码演示了如何使用BeautifulSoup库来解析HTML,并检查每个链接的CSS样式以识别是否为暗链接。这只是一个基本的示例,实际应用中可能需要更复杂的逻辑来处理各种隐藏技术。


HTMLAgilityPack 是一个开源的.NET库,旨在帮助开发人员处理和操作HTML文档。它提供了解析HTML文档、查询DOM元素以及修改HTML内容的功能。HTMLAgilityPack 基于XPath和LINQ查询,使得开发者能够以类似于操作XML文档的方式来操作HTML文档。这使得从复杂的HTML结构中提取所需数据变得轻而易举。

正文


HTMLAgilityPack 主要用于以下几个方面:

  1. 解析HTML文档:HTMLAgilityPack 可以将原始的HTML文档解析成一个DOM(文档对象模型)树,使开发者能够轻松地遍历和操作HTML元素。
  2. 查询和选择元素:通过使用XPath表达式或LINQ查询,您可以轻松地选择和定位HTML文档中的特定元素,从而实现数据的抽取和操作。
  3. 修改HTML内容:您可以使用HTMLAgilityPack来添加、删除或修改HTML元素和属性,以满足特定的需求。
  4. HTML格式化与转换:HTMLAgilityPack 还允许您将HTML文档格式化为漂亮的字符串或转换为其他格式,如纯文本或Markdown。

常用方法与学用属性

以下是一些常用的HTMLAgilityPack方法和属性,以及它们的用途:

  1. HtmlDocument.Load(string path):从指定路径加载HTML文档。
  2. HtmlDocument.LoadHtml(string html):从字符串加载HTML文档。
  3. HtmlDocument.DocumentNode:获取整个HTML文档的根节点。
  4. SelectSingleNode(string xpath):根据XPath表达式选择单个节点。
  5. SelectNodes(string xpath):根据XPath表达式选择多个节点。
  6. InnerText:获取或设置元素的文本内容。
  7. OuterHtml:获取或设置元素及其内部内容的HTML。
  8. Attributes:获取元素的属性集合。
  9. AppendChild(HtmlNode newChild):将新节点添加为子节点。
  10. Remove():从文档中移除当前节点。

Nuget安装 HtmlAgilityPack库

解析并显示标题

我们使用 HttpClient 发送一个 GET 请求到指定的 HTTPS URL,并且读取返回的响应内容。

如果出现 HTTP 状态码 403 (Forbidden) 错误表示您的请求被服务器拒绝,通常是因为服务器认为您没有权限访问该资源。

  1. 检查网站访问权限:确保您有权访问目标网站。有些网站可能需要登录或具有特定权限才能访问其内容。
  2. 用户代理头:有些网站要求用户代理标头,您可以尝试在请求中添加一个用户代理标头来模拟浏览器行为
  3. Cookies 和 Session:如果目标网站使用 cookies 或会话来管理访问权限,请确保您正确处理这些信息。您可能需要发送适当的 cookies 或会话信息以获取访问权限。
  4. IP封锁:某些网站可能根据 IP 地址阻止访问,如果您的 IP 被封锁,您可能需要使用代理服务器来绕过封锁。
  5. 代理服务器:如果您的网络中存在代理服务器,请确保代理服务器的设置正确,并且允许访问目标网站。
  6. 身份验证:如果网站需要身份验证,您可能需要在请求中包含适当的身份验证凭据。您可以使用 HttpClient 的 DefaultRequestHeaders.Authorization 属性来添加身份验证标头。
  7. 请求头和参数:某些网站可能会要求特定的请求头或查询参数,您需要查看网站的文档或分析网络请求以确定所需的请求标头和参数。
private async void btnGetTitle_Click(object sender, EventArgs e)
{
    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();

    string htmlContent = "";
    using (HttpClient httpClient = new HttpClient())
    {
        try
        {

            httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3");
           
            HttpResponseMessage response = await httpClient.GetAsync("https://www.baidu.com");
            
            //检查 HTTP 响应的状态码是否表示成功
            response.EnsureSuccessStatusCode();

            //读取内容
            byte[] bytes = await response.Content.ReadAsByteArrayAsync();
            htmlContent = Encoding.UTF8.GetString(bytes);

        }
        catch (HttpRequestException ex)
        {

        }
    }

    doc.LoadHtml(htmlContent);

    HtmlNode titleNode = doc.DocumentNode.SelectSingleNode("//title");
    if (titleNode != null)
    {
        string title = titleNode.InnerText;
        MessageBox.Show($"页面标题:{title}");
    }
}

提取所有链接

/// <summary>
/// 通过url取得html内容
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
private async Task<string> GetHtml(string url)
{

    string htmlContent = "";
    using (HttpClient httpClient = new HttpClient())
    {
        try
        {

            httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3");

            HttpResponseMessage response = await httpClient.GetAsync(url);

            response.EnsureSuccessStatusCode();

            //读取内容
            byte[] bytes = await response.Content.ReadAsByteArrayAsync();
            htmlContent = Encoding.UTF8.GetString(bytes);

        }
        catch (HttpRequestException ex)
        {

        }
    }
    return htmlContent;
}

private async void btnGetLinks_Click(object sender, EventArgs e)
{
    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    string htmlContent =await GetHtml("https://www.baidu.com");
    doc.LoadHtml(htmlContent);

    HtmlNodeCollection linkNodes = doc.DocumentNode.SelectNodes("//a[@href]");
    if (linkNodes != null)
    {
        foreach (HtmlNode linkNode in linkNodes)
        {
            string link = linkNode.GetAttributeValue("href", "");
            lstLink.Items.Add(link);
        }
    }
}

通过class 去找节点

private async void btnGetSpecialLink_Click(object sender, EventArgs e)
{
    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    string htmlContent = await GetHtml("https://news.baidu.com/");
    doc.LoadHtml(htmlContent);

    HtmlNodeCollection linkNodes = doc.DocumentNode.SelectNodes("//*[@id=\"pane-news\"]/ul/li[@class=\"bold-item\"]/a");
    if (linkNodes != null)
    {
        foreach (HtmlNode linkNode in linkNodes)
        {
            string link = linkNode.GetAttributeValue("href", "");
            string title = linkNode.InnerText;
            lnkSpecialLink.Items.Add(title + " " + link);
        }
    }
}

快速找到节点path

Linq 找查节点

人说“互联网中有50%以上的流量是爬虫”,第一次听这句话也许你会觉得这个说法实在太夸张了,怎么可能爬虫比用户还多呢?毕竟会爬虫的相对与不会爬虫的简直少之又少。

但是很多爬虫工程师或者反爬虫工程师讲了实话:50%?你在逗我?就这么少的量?然后他举出例子:

某个公司的某个页面的某个接口,每分钟访问量是1.2万左右,这里面有都少正常用户呢?50%?60%?正确答案是:500个以下,那我们来算算爬虫占比:(12000-500)/12000=95.8%

没错95.8%,这是一位反爬虫工程师给出的爬虫占比!!!

那这么多的爬虫它们在互联网上做什么呢?答案当然是:孜孜不倦的爬取爬取网页信息。今天我们就来讲讲组成互联网的重要部分之一:HTML网页。

一、起源与发展

前面我们介绍HTTP的时候,给大家讲过是万维网的发明者,互联网之父计算机科学家蒂姆·伯纳斯·李,在他最初的构想组成中就有:提出使用HTML超文本标记语言(Hypertext Markup Language)作为创建网页的标准

大家千万记住HTML并不是一种编程语言,而是一种标记语言 (markup language),由W3C(万维网联盟)制定标准,然后由个大浏览器厂商自己去实现支持!

下面我们来看看HTML标准的发展历史:

二、组成部分

我们常说的网页就是HTML页面,而构成HTML页面的东西有很多,如:html标签、数据、css样式、js等,那我们就主要讲讲以下这几个组成部分。

1.HTML标签

HTML标签是构成HTML页面的主要组成部分,我们来看一个HTML实际例子:

<!--注册页-->
<html>
	<!--网页头-->
	<head>
		<meta charset="utf-8" />
		<title>注册页</title>
	</head>
	<!--网页体-->
	<body>
		<!--表单标签-->
		<form action="/register" method="post">
			<div>用户名:<input type="text" name="username"/></div>
			<div>性 别:
				<input name="sex" type="radio" checked="checked"/>男
				<input name="sex" type="radio" />女
			</div>
			<div>密 码:<input type="text" name="password"/></div>
			<br/>
			<input type="submit" value="注册" style="width:150px;" />
		</form>
	</body>
</html>	

上面是一个非常简陋的用户注册页面(用于教学),用户可以输入用户名性别和密码然后点注册就提交到服务器,下面我们来稍微讲解以下这个页面。

  • html标签对限定了文档的开始点和结束点,所有的元素和标签都应该放在他们之间。
  • head标签对表示网页头部信息,其中包含了网页标题、网页编码、网站ico、网站引入的一些静态资源(css、js)以及网站关键字SEO相关信息等。
  • body标签对表示网页体,几乎所有的网页内容都在这里展现。
  • form标签对表示创建表单,表单用于向服务器传输数据,能够包含 input 元素,比如文本字段、复选框、单选框、提交按钮等等。
  • div标签对是目前网页中比较流行的标签,在七八年年流行使用table来构思一个网页,把一个网页想象成多少行多少列,这种构思灵活性和维护性极差,并且Table标签构思的网页对google爬虫和百度等这种搜索引擎收录性很差,遇到多层表格嵌套时,会跳过嵌套的内容或直接放弃整个页面。所以目前前端流行使用div+css来构思网页,这样的优点是代码精简、有很好的灵活性和可维护性。
  • input标签用于搜集用户信息,它可以根据不同的 type 属性值,输入字段拥有很多种形式。输入字段可以是文本字段、复选框、掩码后的文本控件、单选按钮、按钮等等。

其他的HTML标签猪哥就不多讲,希望大家自己去网上学习。

在有些初级web工程师面试中,面试过程中可能会让你手写一个用户注册功能,这里猪哥给大家讲讲大概的流程:

  1. 用户点击注册连接(一般是get请求/register),然后服务器响应此请求返回一个注册页面
  2. 用户输入用户名密码、图形验证码等信息,提交注册信息(一般是post请求/register)
  3. 服务端收到信息后对信息做校验(一般是前后端双校验),然后存入数据库,返回注册成功提示

2.数据

互联网主要起到了信息交流的作用,而网页作为主要的信息交换载体,标签的主要作用就是包裹数据,让数据能够以人类可视的方式展现。

尤其是一些新闻网站,他们主要以展示新闻信息为主,我们以头条网页来讲讲:

在红色框中圈出来的这些新闻,他们是把数据包裹在html标签中,然后以列表的形式展示给用户,接着我们来看看网页代码:

我们可以看到新闻标题被a标签包围,还有一些如缩略图、评论数、时间等信息构成了一条新闻简述,然后多个新闻(li标签)构成了一个列表(ul)。

那服务器是如何将数据与封装到页面中去的呢?

  • 前后端未分离:前后端没有分离的公司,一般是先由前端工程师写好页面(数据写死),然后由后端程序员合页面(就是将写死的数据去掉,然后加上数据字段)。
  • 前后端分离:前后端没分离最大的问题就是同一个页面可能前后端开发同学都会去修改,修改的人少还行,但是如果开发人员一多,大家改来改去全乱了,而且发布也会有一定的限制,所以目前流行前后端分离,后端同学只需要提供数据,前端同学搭一个nodejs后台自己渲染页面。

拿上面我们的简陋的注册页面来讲讲前后端未分离时具体返回页面步骤,假设我们用户注册成功然后登录,登录成功我们直接跳转用户主页展示用户名和性别,页面如上图,步骤如下:

  1. 用户登录成功,在数据库中读取用户信息。
  2. 读取到用户数据后进行页面渲染
  3. 返回渲染后的页面给浏览器

3.CSS样式

html标签+数据构成了整个网页的骨架,但是只有数据和html标签的网页是奇丑无比的

层叠样式表(英文全称:Cascading Style Sheets 简称CSS)是一种用来表现HTML等文件样式的计算机语言。css可以定义html现实的样式,可以实现很多不同的效果、排版等等,html中所有的元素几乎都需要css来管理样式,而且现在越来越流行div+css搭配控制页面排版和样式,css主要通过三大选择器来修饰html标签。

没有css的页面将会是杂乱无章或缺少美感的页面,我们以上面简单的用户主页为例子演示如何使用css以及css的功能。

效果:

代码:

css:

4.js

css使页面有了很好看的样式,但是却没有很好的交互性,何为交互性?就是用户在使用产品时的浏览、点击、切换使之方便、快捷、平滑都很合理,很友好。

而js(JavaScript)则是增加网页的动态功能,它定义了网页的行为,提高用户体验。比如js可以监控到用户的点击,滑动等动作,然后根据用户的这些动作来做一些操作。

我们还是以上面简单的用户主页为例子,用js(或jquery)来实现用户修改用户名或者性别信息。

代码:

效果:

一个大概的修改用户信息流程:

  1. 点击修改后通过js现实出输入框
  2. 在用户输入的时候用js监听输入框内容,及时提醒用户新的用户名是否可用
  3. 再用户点击提交后,用ajax提交,并且做防止重复提交的操作
  4. 服务端反馈后用js做提示即可

上面只是给大家做了一个非常简单的js效果,给零基础的朋友演示js是什么,有什么功能,但是js的功能远不止这些,现在的js已经在前端、后端以及app中占据着重要的地位,当然还有使用在反爬虫的js混淆。

三、总结

由于篇幅原因,猪哥这里只给大家演示一些非常基础非常简单的功能,如果想学习网页的制作同学们可以自己去网上学习,这里推荐一个学习网站:菜鸟教程,希望大家都学习一些前端知识,因为爬虫的第一步就是分析网页,然后再根据网页数据是内嵌在html标签中,还是js动态加载,或者网站使用加密或混淆的反扒技术。当遇到反扒高手时,我们就需要去仔仔细细的分析js,这也被称为解毒的过程(反扒工程师在代码里投毒)。所以爬虫与反扒的斗争可谓其乐无穷!