• 网络安全笔记-Web架构


    Web工作机制

    • 网址
      本地缓存->host->IP/ARP->DNS->IP->网关->路由->到达对方主机->访问80 443->3次握手->建立连接->发送HTTP数据包->HTTP响应(.html文件->.php->. mysql->.php运行结果)
      在这里插入图片描述
    • 网页、网站
      多个网页的集合就是网站。网页一般都是经过浏览器渲染过的.html页面,包含css等前端技术。
    • Web容器
      也叫Web服务器,主要提供Web服务,也就是常说的HTTP服务。
      常见的Web容器有Apache/IIS/Nginx等
    • 静态的网页
      静态的网页,都是一些.html文件,是纯文本文件。这些文件中包含html代码。
      HTML(超文本标记语言)在浏览器中解释运行。
    • 中间件服务器(传统意义上是asp,php,现在模糊了中间件和web容器的概念)
      以上这种,只能单向地给用户展示信息。随着Web的发展,信息要双向流动,产生了交互的需求,也就是动态网页的概念;所谓动态就是利用flash、Phpasp, Java等技术在网页中嵌入一些可运行的脚本,用户浏览器在解释页面时,遇到脚本就启动运行它。
      脚本的使用让Web服务模式有了“双向交流”的能力,Web服务模式也可以象传统软件一样进行各种事务处理,如编辑文件、利息计算、提交表单等,Web架构的适用面大大扩展。
      这些脚本可以嵌入在页面中,如JS等。也可以以文件的形式单独存放在Web服务器的目录里,如.asp,php,jsp文件等。这样功能性的脚本越来越多形成常用的工具包,单独管理,Web业务开发时,直接使用就可以了,这就是中间件服务器,它实际上是Web服务器处理能力的扩展。
    • 数据库的出现
      静态网页与脚本都是事前设计好的,一般不经常改动,但网站上很多内容需要经常的更新,如新闻、博客文章、互动游戏等,这些变动的数据放在静态的程序中显然不适合,传统的办法是数据与程序分离,采用专业的数据库。
      Web开发者在Web服务器后边增加了一个数据库服务器,这些经常变化的数据存进数据库,可以随时更新。当用户请求页面时,脚本根据用户请求的页面,涉及到动态数据的地方,利用SQL数据库语言,从数据中读取最新的数据生成“完整"页面,最后送给用户。

    HTTP 协议

    HTTP (HyperText Transfer Protocol,超文本传输协议)是浏览器与Web服务器之间的通信协议,是传递消息的规范和要求。

    概述

    • 1990年提出的,当前版本2.0。
    • HTTP 是用来将html文档从Web服务器传输到web浏览器。
    • 是一个请求和响应的协议。客户端发出请求,服务器端对请求给出回应。
    • HTTP 使用可靠的TCP 连接,默认端口80。

    特点

    • 支持浏览器/服务器模式。
    • 简单快速:浏览器向服务器提出请求时,只需要传送请求方法和请求路径。
    • 灵活:HTTP运行传输任意类型的数据对象
      • .html 纯文本
      • .jpg 图片
      • .mp3 音频
    • HTTP 协议是无状态的协议。

    URL

    统一资源定位符(网址),用来告诉web容器,浏览器所请求资源(文件)的路径。例如:
    http://localhost/test/request.php?name=ajest
    schema://login: password@address:port/path/to/resource/?query_string#fragment
    port 80
    Login 用户名
    address 地址
    password 密码 匿名访问时,默认没有这两个内容
    fragment 锚点 实现页面内定位

    • URL编码
      URL中允许出现的字符是有限制的, URL 中path开始允许直接出现A-Za-z0-9
      半角减号(-)、下划线句点(.)、波浪号(~)。其他字符均会被百分号编码。
      如下:# %23
      [] 空格 %20
      %+ASCII 码十六进制形式
      • 报文分析工具
        • F2
        • wireshark
        • fiddler
        • burp suite

    HTTP报文分析

    Web应用的所有通信的消息都要遵守HTTP协议的规范和要求。

    Request请求报文
    GET /php/test/get. php HTTP/1.1       请求行
    Host: 172.16.132.161
    User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv: 69.0)Gecko/20100101 Firefox/69.0
    Accept:text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8
    Accept-Language:zh-CN, zh; q=0.8, zh-TW; q=0.7, zh-HK; q=0.5, en-US; q=0.3, en; q=0.2Accept-Encoding: gzip, deflate
    Referer: http://172.16.132.161/php/test/
    Connection: close
    Upg rade-Insecure-Requests: 1
    Cache-Control: max-age=0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    其余为请求头。 get方式请求没有请求正文,post有请求正文

    HTTP请求由请求行、请求头、请求正文三部分组成。
    1、请求行:方法,资源路径,协议/版本。
    方法:GET
    资源路径:/php/test/get. php
    协议/版本:HTTP/1.1
    2、请求头
    从请求报文第二行开始到第一个空行为止之间的内容,其中包含很多字段。
    3、请求正文
    以上GET方法中没有请求正文。

    HTTP请求方法
    • GET
      GET是最常用的方法,通常用于请求服务器发送的某个资源。
    • POST
      POST 方法可以向服务器提交参数以及表单,包括文件流等。
    • HEAD
      与GET 方法类似,但在服务器响应中只返回首部。
    • PUT
      与GET从服务器读取文档相反, PUT 方法会向服务器写入文档。
    • TRACE 回显浏览器的请求。
    • OPTIONS
      OPTIONS方法请求Web 服务器告知其支持的各种功能。
    • DELETE
      DELETE 方法请求服务器删除请求URL所指定的资源。
    请求头主要字段
    • Host
      Host: 172.16.132.161
      主要用于指定被请求资源的Internet主机和端口号
    • User-Agent
      User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:
      69.0)Gecko/20100101 Firefox/69.0
      浏览器指纹
    • Referer
      Referer: http://172.16.132.161/php/test/
      包含一个URL,代表当前URL的上一个URL
    • Cookie
      记录请求者的身份认证信息
    • Accept-Charset
      用于指定客户端接收的字符集
    • Content-Type
      用于向接收方指示实体的介质类型(数据类型)
    • Content-Length
      用于指明实体正文的长度,以字节方式存储的十进制数字来表示。
    • Last-Modified
      用于指示资源的最后修改时间和日期
    Response响应报文
    HTTP/1.1 200 OK
    Date: Sun, 29 Sep 2019 08:43:35 GMT
    Server- Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45
    X-Powered-By: PHP/5.4.45
    Content-Length: 13
    Connection: close
    Content-Type: text/html
    
    array (0){ 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    响应报文由状态行、响应头、响应正文三部分组成
    1、状态行:协议/版本,状态代码,描述短语
    HTTP/1.1 200 OK
    2、响应头:
    从第二行开始到第一个空行为止之间的内容,其中包含了关于HTTP响应的重要字段。
    3、响应正文:
    服务器返回资源的内容,即浏览器接收到的HTML代码。

    状态代码

    100~199
    信息性状态码
    200~299
    成功状态码
    300~399
    重定向状态码
    400~499
    客户端错误状态码
    500~599
    服务器错误状态码

    响应头主要字段

    Server
    服务器指纹
    Set-Cookie
    向浏览器端设置Cookie
    Last-Modified
    服务器通过这个头信息告诉浏览器,资源的最后修改时 间
    Content-Length
    正文的长度
    Location
    重定向目标页面
    Refresh
    服务器通过Refresh头告诉浏览器定时刷新浏览器

    Cookie 与Session 机制

    HTTP 协议本身是无状态的协议, HTTP
    不会记录前一次传输的数据信息。而很多情况下,我们和服务器之间的一个会话不是一个动作就完成了,所以我们希望能在客户端和服务器这个交互的会话期间内,服务器能够保持对客户端会话的识别,也就是保持http 的状态性,Cookie应运而生。

    • Cookie
      是指网站为了辨别用户身份、进行Session(会话)跟踪而存储在用户本地终端上的数据(通常经过加密)
      客户端在浏览多个页面时,提供事务的功能,为服务器提供状态管理。例 如:购物车可以为每个用户实现购物统计;实现授权策略,用户不用每个页 面都输入用户名/密码。
      为了更好的理解Cookie 机制,我们使用PHP来简单实现Cookie策略。
      • PHP 中的Cookie 实现
        PHP 中的Cookie 简单实现由两个页面组成。
    #index.php
    <meta charset="utf-8">
    <?php
    if (isset($_COOKIE ['name' ]) and $_COOKIE [' name ' ] == ' admin '){
    echo "欢迎你! " .$_COOKIE [' name ];
    echo "注销";
    }else{
    echo "
    
    username : password: > <input type='submit'> </form> "; } ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    #login.php
    <meta charset="utf-8">
    <?php
    if(isset($_GET['name']) && $_GET [' name '] =="admin" &&
    isset ($_GET [' pwd' ]) && $_GET [' pwd ']=="123456"){
    setcookie( ' name', 'admin');//向浏览器写入Cookie信息 
    name=admin
    echo "登录成功! 首页";
    }else{
    echo "登录失败! 首页";
    }
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    以上代码中的关键函数是set_cookie()
    该函数有7个参数,如下

    参数名字含义
    name名称Cookie 名称
    value这个值存储于用户的电脑里,请勿存储敏感信息
    expire过期时间这是个Unix时间戳,如果设置成零或者忽略参数,Cookie会在绘画结束时过期(也就是关掉浏览器时)
    path有效路径设置成’/‘时,Cookie对整个域名domain有效。如果设置成’/foo/',Cookie仅仅对domain中/foo/目录及其子目录有效(比如)/foo/bar/)。默认值是设置Cookie时的当前目录
    domain有效域名设置成子域名(例如’www.example.com’),会使Cookie对这个子域名和它的三级域名有效(例如w2.www.example.com)。要让Cookie对整个域名有效(包括它的全部子域名), 只要设置成域名就可以了(这个例子里是’example. com’)
    secure安全设置成TRUE时,只有安全连接存在时才会设置Cookie。如果是在服务器端处理这个需求,程序员需要仅仅在安全连接上发送此类 Cookie (通过 $_SERVER [“HTTPS”] 判断)
    httponly是包含在http返回头Set-Cookie里面的一个附加的flag,TRUE或FALSE设置成TRUE, Cookie仅可通过HTTP 协议访问。这意思就是Cookie 无法通过类似 JavaScript 这样的脚本语言访问。要有效减少XSS攻击时的身份窃取行为,可建议用此设置(虽然不是所有浏览器都支持) 不过这个说法经常有争议。PHP 5.2.0中添加。
    • Session 机制
      • Session 机制需要借助Cookie来实现。但是二者有明显区别:
      • Cookie机制将用户的身份认证信息存储在浏览器端。
      • Session 机制是将身份认证信息放在服务器端。
      • Session机制从一定程度上解决了Cookie所面临的窃取与欺骗的风险。当然窃取的是Cookie 信息,欺骗的是服务器。
      • 二者合一称为固定会话攻击。

    同源策略

    同源策略是禁止JavaScript进行跨域访问的安全策略。它也是浏览器沙盒环境所提供的一项制约。浏览器可以同时处理多个网站的内容,其典型方法为使用标签页或iframe 等。

    • 同源策略的条件
      • URL 的主机(FQDN: Fully Qualified Domain Name全称域名)一致
      • Schema 协议一致
      • 端口号一致

    同源策略的保护对象不仅仅是iframe 内的文档。比如,实现Ajax 时所使用的XMLHttpRequest 对象能够访问的URL也受到了同源策略的限制。

    • 同源策略探究
      准备两个页面
    index.html
    <html>
    <head>
    <title>跨frame的读取试验title>
    <meta charset='utf-8'> 
    head>
    <body>
    <iframe name="iframe1" width="300" height="80"
    src="http://localhost/sop/iframe.html">
    iframe>
    <input type="button" onclick="go()" value=" 密码→ "> <script>
    function go() {
    try {
    var x = iframe1.document.form1.passwd.value;
    document.getElementById ('out').innerHTML = x;
    }catch (e)
    alert(e.message);
    }
    }
    script>
    <span id="out">span>
    body>
    html>
    
    --------
    iframe.html
    
    <html>
    <head>
    <meta charset='utf-8'> 
    head>
    <body>
    <form name="form1">iframe的内层
    密码<input type = "text" name="passwd" value="password1">
    
    form>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
  • 相关阅读:
    YOLOv8检测香蕉
    CSS 对齐、组合选择符、伪类、伪元素、导航栏
    寻找更好的分类模型loss
    【开题报告】基于SpringBoot的美术馆预约平台的设计与实现
    激活Windows时出现错误代码0xC004C003怎么办?
    ☕Java 面向对象进阶内容
    不同VLAN间的通信原理
    webpack + vite 前端构建工具
    在SpringBoot中如何整合数据源?
    每个 Flutter 开发者都应该知道的一些原则
  • 原文地址:https://blog.csdn.net/L120305q/article/details/126729127