利用WinSock2 SPI进行网络内容访问控制

2024-03-16 06:08

本文主要是介绍利用WinSock2 SPI进行网络内容访问控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

防火墙可以实施和执行网络访问策略,但是,传统的防火墙技术集中于如何防范外部网络对内部网络的入侵和攻击上,而对于如何控制内部用户对外部网络的访问问题研究不够深入,相关的控制技术也不多。据权威资料显示,全球现有大约25万色情网站,单纯依靠传统的包过滤等防火墙技术,势必会严重影响网络性能。针对这一问题,我们从应用层网关技术入手,利用WinSock2 SPI技术,进行了研究和探讨。 


Winsock2 SPI原理图
Winsock2 SPI(Service Provider Interface)服务提供者接口建立在Windows开放系统架构WOSA(Windows Open System Architecture)之上,是Winsock系统组件提供的面向系统底层的编程接口。Winsock系统组件向上面向用户应用程序提供一个标准的API接口;向下在Winsock组件和Winsock服务提供者(比如TCP/IP协议栈)之间提供一个标准的SPI接口。各种服务提供者是Windows支持的DLL,挂靠在Winsock2 的Ws2_32.dll模块下。对用户应用程序使用的Winsock2 API中定义的许多内部函数来说,这些服务提供者都提供了它们的对应的运作方式(例如API函数WSAConnect有相应的SPI函数WSPConnect)。多数情况下,一个应用程序在调用Winsock2 API函数时,Ws2_32.dll会调用相应的Winsock2 SPI函数,利用特定的服务提供者执行所请求的服务。

Winsock2 SPI允许开发两类服务提供者——传输服务提供者和名字空间服务提供者。“传输提供者”(Transport Providers, 一般称作协议堆栈,例如TCP/IP)能够提供建立通信、传输数据、日常数据流控制和错误控制等传输功能方面的服务。“名字空间提供者”(Name Space Providers,例如DNS名字解析服务)则把一个网络协议的地址属性和一个或多个用户友好名称关联到一起,以便启用与应用无关的名字解析方案。

Winsock2中使用的传输服务提供者有两类:基础服务提供者和分层服务提供者。基础服务提供者执行网络传输协议(比如TCP/IP)的具体细节,其中包括在网络上收发数据之类的核心网络协议功能。“分层式”(Layered)服务提供者只负责执行高级的自定义通信功能,并依靠下面的基础服务提供者,在网络上进行真正的数据交换。

为了进行内部用户对外访问控制,我们需要在现有的基础提供者TCP/IP提供者上设立一个分层式的URL过滤管理者。通过URL过滤管理者我们可以截获用户请求的HTTP数据包中的URL地址,继而可以通过高效的数据检索算法(如利用Fibonacci散列函数的哈希表),在访问规则库(被禁止访问的IP集合)中查找指定的IP,根据结果拒绝或提供访问服务。

传输服务提供者的安装方式决定了它不仅是一个分层提供者,还是一个基础服务提供者。Winsock 2使用系统配置数据库配置传输服务提供者。配置数据库让Winsock2得知服务提供者的存在,并定义了提供的服务类型。要在Winsock2服务提供者数据库内成功安装和管理服务提供者,需要四个函数:WSCEnumProtocols、WSCInstallProvider、WSCWriteProvider Order、WSCDeInstallProvider。这些函数利用WSAPROTOCOL_INFOW结构,对服务提供者数据库进行查询和操作。要安装分层式服务提供者,需要建立两个WSPPROTOCOL_INFOW目录条目结构。一个代表分层提供者(协议链长度等于0),另一个将代表一个协议链(协议长度大于1),该协议链把分层提供者与一个基础服务提供者链接起来。应该使用现有服务提供者的WSAPROTOCOL_INFOW目录条目结构的属性来初始化这两个结构。调用WSCEnumProtocols可以获得已有的服务提供者的WSAPROTOCOL_INFOW目录条目结构。初始化之后,首先需要使用WSCInstallProvider来安装我们的访问控制分层服务提供者目录条目,然后,利用WSCEnumProtocols列举出所有的目录条目,获得安装之后为这个结构分配的目录ID。然后,用这个目录条目来设置一个协议链目录条目,通过它,将我们的访问控制服务提供者和另一个提供者(TCP基础提供者)链接起来。然后再次调用WSCInstallProvider来安装我们的分层链式服务提供者。

在用WSCInstallProvider安装一个服务提供者时,目录条目自动成为配置数据库中的最后一个条目。要实现访问控制就必须使我们的URL过滤服务提供者成为默认的TCP/IP提供者,必须通过调用WSCWriteProviderOrder函数来完成此项工作,对数据库中提供者目录条目进行重新排序,并把协议链目录条目放在TCP/IP基础提供者之前。

Winsock2传输服务提供者随标准的Windows动态链接库模块一起执行。我们必须在我们的服务提供者动态链接库模块中导入DLLMain函数,同时还必须导入一个名为WSPStartup的单一函数条目。我们的URL过滤服务提供者必须提供对WSPStartup函数和其他30个SPI函数的支持。调用WSAStartup期间,Winsock根据WSASocket调用的地址家族、套接字类型和协议参数,来决定需要加载哪个服务提供者。只有在一个应用程序通过socket或WSASocket API调用建立一个采用地址家族AF_INET、套接字类型为SOCK_STREAM的套接字时,Winsock才会搜索并加载与之相应的、能够提供TCP/IP能力的传输服务提供者。WSPStartup的参数UpcallTable取得Ws2_32.dll的SPI函数派遣表,我们的访问控制分层服务提供者利用这些函数来管理自身和Winsock2之间的I/O操作。

我们利用WSPConnect函数来实现访问控制功能。在用户请求HTTP服务时,需要首先建立与目标站点的连接,连接成功后,在此连接基础上发送HTTP请求数据包。用户应用程序调用connect或WSAConnect函数建立连接时,SPI会调用对应的WSPConnect函数:INT WSPAPI WSPConnect(...,const struct sockaddr FAR *name,...,INT FAR *lpErrno)。在sockaddr类型的参数name中包含了用户将要访问的目标站点的IP地址信息。我们将name参数传递到IP可访问性判定例程IPFilter。如果IPFilter函数返回代表授权访问的结果,我们采用协议链命令路由,调用下一层的基础服务提供者(TCP/IP)来完成连接请求。如果IPFilter函数返回代表拒绝服务的结果,我们设置lpErrno参数为相应的错误码,然后返回,不进行协议链下一层服务提供者的调用,从而实现访问控制。

分层式服务提供者大大发挥了联网服务的潜能,增强了Winsock的应用,在我们的URL过滤服务中发挥了巨大的作用,基本实现了对内部用户访问外部网络的访问控制,为用户提供了对互联网的健康性的访问服务。

这篇关于利用WinSock2 SPI进行网络内容访问控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/814534

相关文章

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp