前言
学习Web漏洞,自然离不开“什么是Web”。百度一下 Web
,你可以获得大量的解释。如果想要理解Web、网络,这需要很多前置知识。我们尽量从一个程序员的角度,或者说从一个软件的角度,形成一个思维模型
一、网络通信
如果你学懂了计算机网络原理,Ok!你可能会说什么OSI七层模型
等等。那我们从程序员的角度,也可以说从操作系统的角度,网络是一个I/O设备
。如果你要问什么是I/O
,我建议你去看CSAPP
,本文的大部分内容就是源于此书。现在我们理解的I/O
,就是操作系统理解为“文件”的事务。所谓的“在UNIX的世界里,一切皆为文件”,就是操作系统的实现代码把底层的一切都抽象为文件,这个抽象模型能让我们以一个统一的接口,实现对不同设备的编程。
那么网络通信,就是通过操作系统提供的网络I/O接口
,编写程序,实现两台主机间的信息交换,就是从一台主机复制信息到另一台主机
从程序员的角度看,把因特网看成一个世界范围的主机集合:
● 主机集合被映射为一组32位的IP地址
● IP地址被映射为一组称为因特网域名(Internet domain name)的标识符
● 因特网主机上的进程能够通过连接(connection)互相通信
说白了就是:操作系统内核实现了一套代码,这套代码就是所谓的TCP/IP
分层协议族。逻辑上这些协议都是分层的,实际上层与层之间就是函数调用!因为这些代码大部分都是使用C语言编写的。为了让我们能够使用计算机网络提供的服务,操作系统提供了一组API共我们调用,即socket
。利用socket编程,即可编写网络应用程序
二、客户端-服务器编程模型
基于网络复制信息的功能
,我们就可以编写网络应用了!每个网络应用都是基于客户端-服务器模型
的,服务器管理某种资源,并且通过操作这种资源为客户端提供服务。
● 一个网络应用:
○ 一个服务器进程
○ 多个客户端进程
● 服务器管理某种资源,通过操作这种资源为客户端提供服务
○ Web服务器管理一组磁盘文件,它代表客户端进行检索和执行
○ FTP服务器管理一组磁盘文件,它代表客户端进行存储和检索
○ …
● 事务(transaction)
- 客户端和服务器执行的一系列步骤
那么,我们可以知道,客户端和服务器都是软件,就是在操作系统中的进程!
三、HTTP 协议
到这里,我们已经知道,Web就是客户端(浏览器)进程与Web服务器进程之间进行网络通信的一套系统。通信就需要规则——协议
。Web客户端和服务器之间交互用的是一个基于文本的应用级协议
,HTTP!就是客户端发送一段带有一定格式的文本,服务器可以解析这段文本(读懂这段文本的意思),为客户端提供服务。
Web服务器(实现了HTTP协议的软件)以两种不同的方式向客户端提供内容:
- 取一个磁盘文件,返回给客户端。
- 运行一个可执行文件,将输出返回给客户端。(动态网站技术)
这些文件,都有一个唯一的名字:URL
。一个URL对应一个资源!
四、动态网站技术
我们已经知道了客户端进程与服务器进程通信、数据从一台主机复制到另一台主机,通过一个URL访问一个资源·····这些概念,那么,客户端访问一个可执行文件,返回可执行文件运行后产生的内容,这就是动态网站技术。
根据HTTP协议,在客户端发起一个请求,其中携带了一些数据。Web服务器(HTTP服务器)解析这个请求,提取出http request
里携带的数据,并根据URL的路径,启动/调用一个程序。
CGI、Servlet、PHP、ASP等等动态网站技术,都是这样的原理。我们 以一个最常见的功能——登录作为例子:
- 在HTTP客户端的
表单标签
中填写用户名与密码并提交到UserLogin
- 服务端(HTTP服务器)接受到请求,封装用户名与密码并提交给
UserLogin
UserLogin
根据提交过来的数据,进程数据库查询- if (查询成功) { 处理相应数据,返回
已登录.html
} - else { 返回
登录失败.html
或者用户名/密码错误.html
}
- if (查询成功) { 处理相应数据,返回
大概的事务流程就是这样,对于Web漏洞的学习,还需要深入一点HTTP协议的格式之类的就够了