Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HTTP——https、http缓存、get与post、web安全 #20

Open
Lmagic16 opened this issue Oct 12, 2017 · 0 comments
Open

HTTP——https、http缓存、get与post、web安全 #20

Lmagic16 opened this issue Oct 12, 2017 · 0 comments
Labels
Projects

Comments

@Lmagic16
Copy link
Owner

Lmagic16 commented Oct 12, 2017

HTTP诞生

1989年为知识共享而诞生的Web,提出了3项WWW构建技术:

  1. 标准通用标记语言设为HTML(HyperText Markup Language,超文本标记语言)
  2. 文档传输协议HTTP(HyperText Transfer Protocol,超文本传输协议)
  3. 文档定位URL(Uniform Resource Locator,统一资源定位符)

url的结构:
采用协议包括http/https/ftp/file/telnet等等
_ccb6d615-73c9-4631-82ae-791f023e6dd3

HTTP特点

  • 无状态协议(不对请求和响应之间的通信状态进行保存,无法实现状态管理),所以后面引入Cookie和LocalStorage等技术。
  • 请求方法有:GET(获取资源)、POST(传输实体主体)、PUT(传输文件)、HEAD(获得报文首部)、DELETE(删除文件)、OPTIONS(询问支持的方法)、TRACE(追踪路径)、CONNECT(要求用隧道协议连接代理)
  • HTTP/1.1中,所有连接默认都是持久连接(keep-alive),即建立一次TCP连接后可以进行多次HTTP请求和响应
  • 管线化,即可并行发送多个请求。
    浏览器并发数
  • Cookie
    1)客户端发送请求报文;
    2)服务器生成包含Cookie信息的响应报文(Set-Cookie字段包含sid);
    3)客户端发送带Cookie信息的请求报文(Cookie字段的sid);

http1.0/1.1/2.0的区别

  • HTTP/1.1相较于 HTTP/1.0 协议的区别主要体现在:
    1)持久链接,即一次TCP链接可支持多次HTTP请求;
    2)管线化,即客户端不用等到之前的http请求结果返回,就可发送下一次请求;
    3)缓存处理,http1.0采用expires字段,有时钟同步问题,http1.1采用Cache-Control;
    4)断点续传,优化带宽,增加range字段,返回码是206(Partial Content);
    5)Host头域,支持一台物理主机可存在多个虚拟主机,一个IP地址,多个域名;
  • HTTP/2.0相较于 HTTP/1.1 协议的区别主要体现在:
    1)采用WebSocket,支持服务端推送;
    2)多路复用,连接共享,允许同时通过单一的HTTP2连接发起多重的请求-响应消息;
    3)在tcp与http层间增加了二进制分帧层,HTTP/2通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流;
    4)首部压缩,HTTP/1.1并不支持 HTTP 首部压缩,为此 SPDY 和 HTTP/2 应运而生,SPDY使用的是通用的DEFLATE算法,HTTP/2则使用了专门为首部压缩而设计的 HPACK 算法;
    简书详解
    csdn博客
    知乎讲解

HTTP报文

  • HTTP报文本身是由多行数据构成的字符串文本。
  • 请求报文与相应报文的结构
    请求报文与相应报文的结构
    报文实例
    请求行:请求的方法、请求URI、HTTP版本
    状态行:表明响应结果的状态码、原因短语、HTTP版本

通用首部字段
请求首部字段
响应首部字段
实体首部字段

  • 压缩传输的内容编码(gzip、compress、deflate、identity)、分割发送的分块传输编码
  • MIME(Multipurpose Internet Mail Extensions,多用途因特网邮件扩展)

HTTP状态码

HTTP状态码
1) 200 OK ;请求正常处理
2) 204 No Content ;请求处理成功,但没有资源可返回
3) 206 Partial Content ; 客户端进行了范围请求,服务器成功处理
4) 301 Moved Permanently ; 永久性重定向,即请求的资源已经被分配了新的URI
5) 302 Found ; 临时重定向,即请求的资源临时被分配了新的URI
6) 303 See Other ; 表示请求对应的资源存在着另一个URI,应使用GET方法定向获取
7) 304 Not Modified ; 服务器资源未改变,可直接使用客户端未过期的缓存(与重定向无关)
8) 307 Temporary Redirect ; 临时重定向(会强制浏览器不能将POST改为GET方法)
9) 400 Bad Request ; 表示请求报文中存在语法错误
10) 401 Unauthorized ; 表明请求需要通过HTTP认证,若之前已请求过一次,则表示用户认证失败
11) 403 Forbidden ; 服务器拒绝该资源的访问
12) 404 Not Found ; 服务器无法找到请求的资源
13) 500 Internal Server Error ; 服务器发生内部错误
14) 503 Service Unavailable ; 服务器超负荷,无法处理请求
有些时候,状态码和状况会不一致

说明:301和302状态码都是重定向,但区别是301是永久重定向,302为临时重定向。若客户端将URL保存为书签,那么301就会去更新书签,而302不会去更新书签。
重定向:服务器告诉客户端,需要重新发送请求到新的URL。服务器返回302状态码时,设置响应头的Location字段。

HTTPS(HTTP over SSL,包括加密、认证、完整性保护)

  • HTTP的缺点
    1)通信使用明文(不加密),内容可能会被窃听;—>加密
    2)不验证通信方的身份,可能遭遇伪装;—>验证身份
    例子:伪装的web服务器;伪装的客户端;无访问权限的通信方;无法判定无意义请求,可能遭受DoS攻击;
    3) 无法证明报文的完整性,内容可能遭遇篡改;
  • 加密
    • 通信的加密、内容的加密
    • 加密方式:对称密钥加密(共享密钥加密)、非对称密钥加密(公开密钥加密)
      对称加密:加密和解密使用相同的密钥;问题:密钥如何安全到达对方;
      非对称加密:一对密钥(公开密钥+私有密钥);
      方式:服务器拥有一对密钥,当需要加密传输时,服务器将公开密钥分发给客户端,客户端利用公开密钥加密发送密文给服务器,服务器利用私有密钥解密;
      报文+公开密钥=密文;密文+公开密钥!=报文(技术上异常困难,离散对数求值);
      非对称加密相比对称加密速度慢;
    • HTTPS采用混合加密机制(非对称加密+对称加密)
      利用非对称加密 传输 对称加密时所需的 密钥,然后采用对称加密 传输主体;

HTTPS通信

  • 如何判断服务器发来的公开密钥的真实性?
    借用第三方数字认证机构(CA,Certificate Authority)
    1)服务器将自己的公开密钥登录至CA,申请公钥证书
    2)CA颁发公钥证书(公开密钥+CA数字签名)
    3)服务器向客户端发送公钥证书
    4)客户端利用浏览器内置的CA公钥验证 该公钥证书的 有效性
    5)客户端使用公开密钥对报文加密后发送
  • MAC(Message Authentication Code)报文摘要检测报文的完整性
  • 用以确认客户端的客户端证书
    用户得自行安装客户端证书,一般用于网上银行
  • 补充:抓包工具:wireshark,tcpdump

HTTP缓存

  • HTTP缓存分为强制缓存和对比缓存,两类缓存规则可以同时存在,强制缓存优先级高于对比缓存。
    HTTP缓存
  • 强制缓存(Expires/Cache-Control)
    HTTP 1.0中Expires的值为服务端返回的资源到期时间,所以要求时钟同步
    HTTP1.1中使用Cache-Control
    Cache-Control
  • 对比缓存(Etag / If-None-Match 或者Last-Modified / If-Modified-Since )
    对比缓存生效时,状态码为304,只返回header
  1. Etag / If-None-Match(优先级高)
    第一次请求时,服务器通过Etag告诉客户端资源的唯一标识符
    再次请求时,客户端通过If-None-Match告诉服务器该资源缓存数据库中的资源标识符,服务器将其进行校验比对,若资源发生变化(资源标识符变化),则返回修改过的资源,200;若资源未被修改过,则返回304。
  2. Last-Modified / If-Modified-Since
    第一次请求时,服务器在响应请求时,通过Last-Modified告诉浏览器资源的最后修改时间。
    再次请求时,客户端通过If-Modified-Since发送资源的最后修改时间,服务器接收到后进行校验对比,若资源在该时间之后被修改过,则返回修改过的资源,200;若资源未被修改过,则返回304。
    cnblog讲解
    个人理解:客户端缓存数据库中的资源带有Expires的时间、Cache-Control的时间间隔、If-None-Match的资源标识符 或者 If-Modified-Since的标识时间。浏览器在请求相应资源时,分别判断资源的各个标识符,采用缓存资源或者发送相应的http头部信息给服务器端进行校验。

http如何断点续传

HTTP1.1 开始支持获取文件的部分内容,通过字段Range 和 Content-Range来实现。
Range用于请求头中,指定第一个字节和最后一个字节的位置。
服务器会在 Content-Range 头部返回当前发送数据的范围和文件总大小。
但有可能在断点续传的过程中,资源发生了修改,就需要判断,资源有无变化。这个通过Etag资源标识符来做,每个资源Etag的值通过MD5来计算。
此外,还可以通过MD5校验报文的完整性。服务器预先提供一个MD5校验和,用户下载完所有文件以后,用MD5算法计算下载文件的MD5校验和,然后通过检查这两个校验和是否一致,就能判断下载的文件是否出错。

get与post区别

W3school

  1. get可被缓存
  2. get请求保留在浏览器历史纪录中
  3. get请求可被收藏为书签
  4. get请求不应在处理敏感数据时使用,get请求在url中发送,post请求在http消息主体中发送。
  5. get请求长度有限制(url的限制),post请求对数据长度没有要求
  6. get只能是url编码
  7. get参数会显示在url中
  8. 后退和刷新,post会被重新提交
  9. get是幂等的,意味着对同一URL的多个请求应该返回同样的结果。
  10. 对资源的增,删,改,查操作,其实都可以通过GET/POST完成,不需要用到PUT和DELETE
    get与post区别

web安全

  • 主动攻击:
    1) SQL注入攻击
    方式:把SQL命令插入到表单中提交或URL中的查询字符串中,以欺骗服务器执行恶意的SQL命令;
    解决方法:对用户的输入进行校验、不使用管理员权限的数据库连接、机密信息加密存放;
    2) OS命令注入攻击(利用web应用的漏洞);
  • 被动攻击:
    1)跨站脚本攻击XSS
    方式:在正规网站的URL查询字段中加入script标签,使客户端在浏览正规网站的同时,运行JS代码;
    解决办法:对用户的输入进行校验、写到页面的内容先进行编码、用适当的方法对 HTML,JS 进行转义、将Set-Cookie设置为HttpOnly,则通过JS脚本无法读取到cookie信息;
    2)跨站点请求伪造(CSRF)
    方式:用户点击了正规网站和黑客网站,黑客网站向往正规网站服务器发送了请求,这个请求会携带用户本地浏览器的cookie,所以得以成功跨站点请求伪造。
    解决办法:1)设置验证HTTP Referer字段,以确保请求的来源网站的合法性。2)设置token。
    CSDN博客
    3)HTTP首部注入(攻击者在响应首部字段内插入换行,添加任意响应首部或主体)、
    4)邮件首部注入攻击
    其他攻击:DoS攻击(拒绝服务攻击,向服务器发送大量请求,造成服务器资源过载)
    DDoS(分布式拒绝服务攻击,常利用感染病毒的计算机作为攻击者的攻击跳板)
    CSDN博客

跨域

跨域解决方案

  1. CORS(Cross-Origin Resource Sharing,跨域源资源共享),IE8通过XDomainRequest对象支持CORS,其他浏览器通过XHR对象原生支持CORS。
    CORS跨域源资源共享需要客户端和服务器共同支持,原理是通过自定义的HTTP头部让客户端与服务器沟通,而目前各大浏览器都实现了对CORS的原生支持。即,当跨域请求时,浏览器会自动在HTTP头部加上自定义字段,比如Origin头部。也就是说要实现CORS,需要在服务器端进行设置。服务器端返回Access-Control-Allow-Origin字段。CORS请求分为简单请求、非简单请求(多一次http请求),默认CORS跨源请求都不带cookie,如果需要带cookie,则需要设置Access-Control-Allow-Cendentials:true。
    优点:支持所有HTTP请求。 缺点:不能兼容老浏览器。
    阮一峰CORS

  2. JSONP(JSON with padding)
    原理:利用script标签没有跨域限制的特点,客户端将script脚本的src设置为服务器的请求地址。服务器会返回一段js代码,并在本地执行,形如:callback({"name":"Nicholas"});,一个带参数的函数,这个参数就是需要请求的json数据。这个函数名是服务器端根据客户端发过去的数据动态设置的(原理是字符串拼接)。而这个函数会事先在本地声明如何处理json数据。
    优点:简单易用,支持浏览器与服务器双向通信,无浏览器兼容性问题;
    缺点:不安全,由于JSONP是从其他域中加载代码执行;难以确定请求是否失败;只支持GET请求;传输格式是字符串,不是json格式;
    网络上的解释

  3. 其他方法:如html5中postMessage方法,window.name,document.domain

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
网络
网络
Development

No branches or pull requests

1 participant