分类 TCP/IP 下的文章

不同的签名验签代码,对密钥格式有不同的要求:

比如JAVA一般使用PKCS8格式的密钥,其他语言一般使用PKCS1格式的密钥。

区分小技巧:

开头为"-----BEGIN PRIVATE KEY-----"的密钥格式为PKCS8,
开头为"-----BEGIN RSA PRIVATE KEY-----"的密钥格式为PKCS1

1.Nginx 实现一个 IP 访问总流量限制

http {
    limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
    limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
    # 其他配置
}
server {
    listen 80;
    server_name example.com;

    # 限制单个客户端 IP 最大连接数为 2
    limit_conn conn_zone 2;
    # 限制单个客户端 IP 1s 内最多发起 1 个请求
    limit_req zone=req_zone burst=5;
    # 计算客户端 IP 累计请求流量,限制累计请求流量为 1GB
    set $limit_rate 128k;
    limit_rate_after 500M;
    limit_rate 1m;
    # 其他处理逻辑
}

2. 统计服务器所有 url 被请求的数量

#统计其他端口时:netstat -pnt | grep :xx | wc -l
netstat -pnt | grep :443 | wc -l

3. 查找请求数前 20 个 IP

#服务器被恶意高频访问时可以用到
netstat -ant |awk '/:443/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A[i],i}' |sort -rn|head -n20

4. 统计文件中某个字符转出现的次数

#如统计文件api_error.log中error关键词出现的次数
grep -o 'error' /www/payment/runtime/logs/api_error.log | wc -l

5. 监听文件

#可以监听整个文件,也可根据关键词监听
cd /www/payment/runtime/logs/

tail -f xxx.log #监听整个文件
tail -f xxx.log | grep 'xxx' #根据关键词监听

6. 查看文件大小

#以下是本人开发中常用到的
一、du命令
du命令是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的。

du -h filepath 直接得出人好识别的文件大小

du -h ljl.txt

或者
du -ah 当前目录下所有文件的大小

二、ls命令
ls命令用来显示目标列表,在Linux中是使用率较高的命令。ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件。

ls -l filepath 第五列为文件字节数

ls -l ljl.txt

ls -h filepath h表示human, 加-h参数得到人好读的文件大小

ls -lh ljl.txt

7. 查看 ip 来源地

#使用这个是为了查看异常登录地址
yum -y install whois
whois 119.53.224.203

8. 查看磁盘使用情况

df -h

9. 创建软链接

ln -s [源文件或目录] [目标文件或目录]

例如:创建软链时,先进入根目录的bin目录下

cd /bin

从/bin这个路径创建软链nginx 引入/usr/local/nginx/sbin/nginx

ln -s /usr/local/nginx/sbin/nginx nginx

创建软链之后 重载nginx 
就可以从 /usr/local/nginx/sbin/nginx -s reload 简化为 nginx -s reload

10. 查看是否监听 9000 端口(其他端口雷同)

netstat -ant | grep 9000

11.Nginx 解决跨域问题

#server模块中添加以下内容,修改完后,记得重启nginx
add_header  Access-Control-Allow-Headers '*';
add_header  Access-Control-Allow-Origin '*';
add_header  Access-Control-Allow-Credentials 'true';
add_header  Access-Control-Allow-Methods 'GET,POST,OPTIONS';

#跨域参数解释
#Access-Control-Allow-Origin:服务器默认是不被允许跨域的。给Nginx服务器配置Access-Control-Allow-Origin *后,表示服务器可以接受所有的请求源(Origin),即接受所有跨域的请求。
#Access-Control-Allow-Methods:允许通过的方法,可以防止Content-Type is not allowed by Access-Control-Allow-Headers in preflight response的错误信息
#Access-Control-Allow-Credentials true 表示允许跨域请求携带 cookie
#Access-Control-Allow-Headers:为了防止出现Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response的错误信息。这个错误表示当前请求Content-Type的值不被支持。其实是我们发起了”application/json”的类型请求导致的

12.Nginx 配置 ssl (小白看过来)

server {
    listen 443 ssl;#监听443端口
    #server_name 购买域名后解析到该服务器上,如果没有域名,也可以给此项目单独开端口
    server_name  api.applet.xxx.com;
    root        /xxx/xxxx/xxxx;#root 项目地址
    index       index.php index.html index.htm;#项目入口文件

    #存放证书的地址.pem和.key文件
    ssl_certificate /usr/local/nginx/conf/vhost/cert/xxx.pem;
    ssl_certificate_key /usr/local/nginx/conf/vhost/cert/xxx.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    if (!-e $request_filename){
        rewrite ^/(.*) /index.php last;
    }

    location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
    }
    error_log  /var/log/nginx/api_applet.log error;
}

13.Nginx 开放防火墙端口

#这里讲到的是CentOS7,CentOS7的防火墙和CentOS6不一样了, CentOS 6 系列中的 iptables 相关命令不能用了,Centos7中使用firewalld代替了原来的iptables。

#停止firewall
systemctl stop firewalld.service

#禁止firewall开机启动
systemctl disable firewalld.service

#添加8022端口
firewall-cmd --zone=public --add-port=8022/tcp --permanent

#多个端口:
firewall-cmd --zone=public --add-port=80-90/tcp --permanent

#命令含义:
--zone #作用域
--add-port=8022/tcp #添加端口,格式为:端口/通讯协议
--permanent #永久生效,没有此参数重启后失效

#centos7查看防火墙所有信息
firewall-cmd --list-all

#centos7查看防火墙开放的端口信息
firewall-cmd --list-ports

#删除8022端口
firewall-cmd --zone=public --remove-port=8022/tcp --permanent

#重启防火墙
firewall-cmd --reload

常用命令介绍:
firewall-cmd --state                ##查看防火墙状态,是否是running
firewall-cmd --reload               ##重新载入配置,比如添加规则之后,需要执行此命令
firewall-cmd --get-zones            ##列出支持的zone
firewall-cmd --get-services         ##列出支持的服务,在列表中的服务是放行的
firewall-cmd --query-service ftp    ##查看ftp服务是否支持,返回yes或者no
firewall-cmd --add-service=ftp      ##临时开放ftp服务
firewall-cmd --add-service=ftp --permanent     ##永久开放ftp服务
firewall-cmd --remove-service=ftp --permanent  ##永久移除ftp服务
firewall-cmd --add-port=80/tcp --permanent     ##永久添加80端口

转自:https://learnku.com/articles/78462

HTTP 报文头也叫报文首部。

HTTP 头部字段是构成 HTTP 报文的要素之一。在客户端与服务器之间以 HTTP 协议进行通信的过程中,无论是请求还是响应都会使用头部字段,它能起到传递额外重要信息的作用。

HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号: 分隔,下面是一个 HTTP 报文头的例子:

GET / HTTP/1.1
Host: hackr.jp
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Ge 
Accept: text/html,application/xhtml+xml,application/xml;q=0 
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
If-Modified-Since: Fri, 31 Aug 2007 02:02:20 GMT 
If-None-Match: "45bae1-16a-46d776ac"
Cache-Control: max-age=0

看不懂这些字段代表什么意思对吧?读完本文就全弄懂了。

通用首部字段

通用首部字段是指:请求报文和响应报文双方都会使用的字段。

Cache-Control

Cache-Control 通过设置不同的指令可以控制缓存的行为,指令格式为:

Cache-Control: no-cache 
Cache-Control: no-store
Cache-Control: max-age=<seconds>

指令参数大概可以分为三类:

  1. 控制可缓存性。
  2. 控制到期时间。
  3. 控制重新验证 & 重新加载。

控制缓存

  1. no-cache 会强制验证数据的有效期,以防止获取到过期资源。
  2. no-store 会禁止缓存服务器缓存数据。(一般意味着数据中含有机密信息
  3. only-if-cached:仅从缓存服务器获取数据,保证请求绝不会达到源服务器,如果缓存服务器没有该资源,则返回状态码 504(GateWay Timeout)。
  4. public:表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存
  5. private:表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。

控制到期时间

  1. max-age:设置缓存存储的最大周期,超过这个时间缓存被认为过期 (单位秒)。客户端只接收缓存时间<max-age 的数据。
  2. s-maxage:覆盖 max-age 或 Expires 字段,但它只适用于共享缓存(例如代理服务器),私有服务器会忽略这个字段。
  3. max-stale:表示客户端愿意接收一个过期的资源,只要资源的过期时间<max-stale的值
  4. min-fresh:表示客户想要的资源至少在指定的秒数内仍然是新鲜的。

HTTP/1.1 版本的缓存服务器遇到同时存在 Expires 首部字段的情况时,会优先处理 max-age 指令,而忽略掉 Expires 首部字段。而 HTTP/1.0 版本的缓存服务器的情况却相反,max-age 指令会被忽略

重新验证和重新加载#

  1. proxy-revalidate 指令要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性,与 must-revalidate 的功能相同。
  2. no-transform:禁止对资源进行转换。Content-Encoding ,Content-Range ,Content-Type 标头不得被代理修改。例如,一个不透明的代理可能会在图像格式之间进行转换,以节省缓存空间或减少慢速链接上的流量,而这个行为会被 no-transform 禁止。

示例#

  1. 禁止缓存:Cache-Control: no-store

  2. 缓存静态资源,例如图像,CSS 文件和 JavaScript 文件:

    Cache-Control:public, max-age=31536000 
  3. 需要重新验证

指定 no-cache 或 max-age=0, must-revalidate 表示客户端可以缓存资源,每次使用缓存资源前都必须重新验证其有效性。这意味着每次都会发起 HTTP 请求,但当缓存内容仍有效时可以跳过 HTTP 响应体的下载。

Cache-Control: no-cache 0
Cache-Control: max-age=0, must-revalidate 

Connection#

Connection 头(header)决定当前的事务完成后,是否会关闭网络连接。如果该值是 keep-alive,网络连接就是持久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。

从 HTTP/1.1 版本开始,所有连接默认为持久连接。

Date#

表明 HTTP 报文的创建日期和时间。日期时间格式有好几种,这里列出一种常见格式:Mon, 06 Feb 2023 01:19:14 GMT

Pragma#

Pragma 是一个在 HTTP/1.0 中规定的通用首部,在 HTTP/1.1 协议被 Cache-Control 代替。现在它用来向后兼容只支持 HTTP/1.0 协议的缓存服务器。

Trailer#

Trailer 在分块传输编码时会被用到,它用来在消息块后面添加额外的元信息。

举个例子:下面的报文中 Trailer 指定了 Expires 字段,在消息块后面出现了 Expires 字段。

HTTP/1.1 200 OK
Date: Tue, 03 Jul 2012 04:40:56 GMT 
Content-Type: text/html
...
Transfer-Encoding: chunked 
Trailer: Expires
...(报文主体)...

Expires: Tue, 28 Sep 2004 23:59:59 GMT

Transfer-Encoding#

规定传输报文时采用的编码方式,可选的编码方式如下:

  1. chunked

数据以一系列分块的形式进行发送。在每一个分块的开头需要添加当前分块的长度(十六进制),后面紧跟着 ‘\r\n’ ,之后是分块本身,后面也是’\r\n’ 。终止块是一个常规的分块,不同之处在于其长度为 0。

HTTP/1.1 200 OK
Date: Tue, 03 Jul 2012 04:40:56 GMT 
Cache-Control: public, max-age=604800 
Content-Type: text/javascript; charset=utf-8 
Expires: Tue, 10 Jul 2012 04:40:56 GMT 
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block 
Content-Encoding: gzip
Transfer-Encoding: chunked
Connection: keep-alive

cf0\r\n                                 ←16进制(10进制为3312) 
3312字节数据\r\n
392\r\n                                 ←16进制(10进制为914) 
914字节数据\r\n
0\r\n
\r\n
  1. compress

采用 Lempel-Ziv-Welch (LZW) 压缩算法。这种内容编码方式已经被大部分浏览器弃用。

  1. deflate

采用 zlib 结构,和 deflate 压缩算法。

  1. gzip

表示采用 Lempel-Ziv coding (LZ77) 压缩算法,以及 32 位 CRC 校验的编码方式。这个编码方式最初由 UNIX 平台上的 gzip 程序采用。处于兼容性的考虑,HTTP/1.1 标准提议支持这种编码方式的服务器应该识别作为别名的 x-gzip 指令。

  1. identity

用于表明自身未经过压缩和修改。

Transfer-Encoding 是一个逐跳传输消息首部,即仅应用于两个节点之间的消息传递。如果想要将压缩后的数据应用于整个连接,那么应该使用端到端传输消息首部 Content-Encoding 。

Upgrade#

用于检测是否有可用的、更高版本的 HTTP 协议。

如果使用了 Upgrade 字段,Connection 字段的值会被指定为 Upgrade,比如:
Upgrade:TLS/1.0
Connection:Upgrade

Via

Via 用于追踪客户端和服务器之间报文的传输路径,也可用于防止循环请求。格式:

Via: [ <protocol-name> "/" ] <protocol-version> <host> [ ":" <port> ]
or
Via: [ <protocol-name> "/" ] <protocol-version> <pseudonym>
  1. :所使用的协议名称,如 “HTTP”。
  2. :所使用的协议版本号,例如 “1.1”。
  3. and :公共代理的 URL 及端口号。
  4. :内部代理的名称或别名。

Warning

警告报文出现了问题,格式:Warning: <warn-code> <warn-agent> <warn-text> [<warn-date>]

请求报文字段#

Accept#

用来告知服务器可以处理的内容类型,例如:

Accept: <MIME_type>/<MIME_subtype>
Accept: <MIME_type>/*
Accept: */*
Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8
  1. /,比如 text/html。
  2. * 代表任意类型,比如 image/* 可以用来指代 image/png、image/svg、image/gif 以及任何其他的图片类型。
  3. q 代表权重。

Accept-Charset#

用于声明客户端可以处理的字符集类型,例如:

Accept-Charset: <charset>
Accept-Charset: utf-8, iso-8859-1;q=0.5, *;q=0.1

Accept-Encoding#

用于声明客户端能够处理的编码方式,例如:

Accept-Encoding: deflate, gzip;q=1.0, *;q=0.5
  1. gzip 表示采用 Lempel-Ziv coding (LZ77) 压缩算法,以及 32 位 CRC 校验的编码方式。
  2. compress 表示采用 Lempel-Ziv-Welch (LZW) 压缩算法。
  3. deflate 表示采用 zlib 结构和 deflate 压缩算法。
  4. br 表示采用 Brotli 算法的编码方式。
  5. identity 表示自身未经过压缩和修改。

Accept-Language#

用于声明客户端可以理解的语言,比如:

Accept-Language: <language>
Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5

Authorization#

用于提供给服务器验证身份的凭据,允许其访问受保护的资源,比如:

Authorization: <auth-scheme> <authorization-parameters>
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l

Basic 身份验证:首先将用户名和密码使用一个冒号拼接(username:password),然后将生成的字符串进行 base64 编码。
除了 Basic 编码方式,还有 Digest、Negotiate 等方式。

Expect

客户端发送带有 Expect 消息头的请求,等服务器回复后再发送消息体,例如:

Expect: 100-continue

服务器检查请求消息头,可能会返回一个状态码为 100 (Continue) 的回复来告知客户端继续发送消息体,也可能会返回一个状态码为 417 (Expectation Failed) 的回复来告知对方要求不能得到满足。

From#

附带一个电子邮箱地址,例如:

From: webmaster@example.org

Host#

指明本次请求的目标服务器主机名和端口号。

  1. 如果没有包含端口号,会自动使用被请求服务的默认端口
  2. 所有 HTTP/1.1 请求报文中必须包含一个 Host 字段。对于缺少 Host 头或者含有多个 Host 头的 HTTP/1.1 请求,可能会收到 400(Bad Request)状态码。

If-Match#

形如 If-xxx 这种样式的请求首部字段,都可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。 例如:

If-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d"

服务器会比对 If-Match 的字段值和资源的 ETag 值,仅当两者一致时,才会执行请求。反之,则返回状态码 412 Precondition Failed 的响应。

If-Modified-Since#

If-Modified-Since 用于确认客户端拥有的本地资源的有效性,例如:

If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT

服务器在收到带有 If-Modified-Since 字段的请求后,会将该字段值和资源更新时间做比较,若资源没有更新,则返回 304 状态码(Not Modified)。

If-None-Match#

与 If-Match 的作用相反。

If-Range

If-Range HTTP 请求头字段用来使得 Range 头字段在一定条件下起作用:当字段值中的条件得到满足时,Range 头字段才会起作用,例如:

If-Range: Wed, 21 Oct 2015 07:28:00 GMT 

字段值中既可以用 Last-Modified 时间值用作验证,也可以用 ETag 标记作为验证,但不能将两者同时使用。

If-Unmodified-Since#

与 If-Modified-Since 作用相反。

Max-Forwards#

用于限制 TRACE 方法可经过的服务器(通常指代理服务器)数目。

发送包含首部字段 Max- Forwards 的请求时,该字段以十进制整数形式指定可经过的服务器最大数目。每经过一个服务器,Max-Forwards 的值减 1。当服务器接收到 Max-Forwards 值为 0 的请求时,则不再进行转发,而是直接返回响应。

Proxy-Authorization#

用于客户端和代理服务器之间的认证,例如:

Proxy-Authorization: Basic dGlwOjkpNLAGfFY5

Range#

Range 字段用于分批请求资源,下面的示例表示请求获取从第 5001 字节至第 10000 字节的资源。

Range: bytes=5001-10000

接收到附带 Range 首部字段请求的服务器,会在处理请求之后返回状态码为 206 Partial Content 的响应。无法处理该范围请求时,则会返回状态码 200 OK 的响应及全部资源。

Referer#

Referer 请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用 Referer 请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。

Referer 请求头可能暴露用户的浏览历史,涉及到用户的隐私问题,所以一般用于 HTTPS 协议。

TE#

表明客户端能够处理的传输编码方式及相对优先级,例如:

TE: gzip, deflate;q=0.5

User-Agent#

User-Agent 首部包含了一个特征字符串,用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。比如 Google 的 UA 字符串:

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36

响应报文字段#

Accept-Ranges#

表明服务器是否支持范围请求,可以处理范围请求时指定字段值为 bytes,反之则为 none,指令格式:

Accept-Ranges: bytes

Age#

表明资源在代理服务器缓存了多久,以秒为单位,指令格式:

Age: 24

ETag#

ETag 是资源的唯一标识符,使用 ETag 能快速确定资源是否发生过变化。(可以理解为资源的 “指纹”)

ETag 有强弱之分,资源即使发生了一丁点的变化也会改变强ETag值,对应的,只有资源发生较大变化才会改变弱ETag值,此时会在字段开始处附加 W/

ETag: W/"0815"

Location#

用于将页面重定向至新的地址,一般与 3xx 状态码配合使用,例如:

Location: <url>

Proxy-Authenticate#

Proxy-Authenticate 会把由代理服务器所要求的认证信息发送给客户端,例如:

Proxy-Authenticate: Basic realm="Access to the internal site"

Retry-After#

用于告知客户端应该在多久之后再次发送请求。主要配合状态码 503 Service Unavailable,或 3xx Redirect 响应一起使用,例如:

Retry-After: 120(以秒为单位)

Server#

表明服务器的软件和版本信息,指令格式:

Server: Apache/2.2.6 (Unix) PHP/5.2.5

Vary

决定缓存能否使用,关于缓存,建议用 cache-control 而非 vary。

WWW-Authenticate#

WWW-Authenticate 定义了应该使用何种验证方式去获取对资源的连接,例如服务器利用该字段规定了 Basic 认证 :

WWW-Authenticate: Basic realm="Access to the staging site"

WWW-Authenticate header 通常会和一个 401 Unauthorized 的响应一同被发送。

报文实体字段#

Allow#

用于枚举资源所支持的 HTTP 方法的集合,指令格式:

Allow: GET, HEAD

如果 Allow 字段的值为空,说明资源不接受使用任何 HTTP 方法的请求,这可能是因为服务器需要临时禁止对资源的任何访问。

Cotent-Encoding#

消息文本的编码类型,指令格式:

Content-Encoding: deflate, gzip

指令参数:

  1. gzip 表示采用 Lempel-Ziv coding (LZ77) 压缩算法,以及 32 位 CRC 校验的编码方式。
  2. compress 表示采用 Lempel-Ziv-Welch (LZW) 压缩算法。
  3. deflate 表示采用 zlib 结构和 deflate 压缩算法。
  4. br 表示采用 Brotli 算法的编码方式。

Cotent-Language#

Content-Language 用来说明服务器希望访问者采用的语言或语言组合,例如报文的 Content-Language 字段值为 de,那么说明这份文件是为说德语的人提供的,但是这并不意味着文本是德文,它也可能是英文等其他语言:

Content-Language: de

Content-Length#

用于指明发送给客户端的消息主体的大小,用十进制数字表示,例如:

Content-Length: 15900

Content-Location#

对应资源的 URL。

Content-Range#

用来表示一个数据片段在整个文件中的位置,例如:

Content-Range: bytes 200-1000/67589

Content-Type#

用于告知客户端响应报文内容的内容类型,例如:

Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something

指令参数:

  1. media-type

资源的 MIME 类型,比如 text/html、multipart/form-data。

  1. charset

字符编码标准。

Expires

用于告知客户端缓存的失效日期,指令格式:

Expires: Wed, 21 Oct 2015 07:28:00 GMT

如果在 Cache-Control 响应头设置了 max-age 或者 s-max-age 指令,那么 Expires 头会被忽略。

Last-Modified#

资源最后一次修改的时间,指令格式:

Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT

Cookie 相关字段#

Set-Cookie#

服务器利用 Set-Cookie 字段来告知客户端 cookie,例如设置一个永久 cookie:

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
  1. expires: 表明 Cookie 的有效期。 当省略 expires 属性时,其有效期仅限于当前浏览器会话 (Session) 时间段内。浏览器一旦关闭则 cookie 失效。
  2. path: 指定一个 URL 路径,这个路径必须出现在要请求的资源的路径中才可以发送 Cookie 标头。
  3. domain: 指定 cookie 可以送达的主机名。
  4. secure:表明 cookie 只能在 HTTPS 使用,HTTP 不可以。
  5. HttpOnly:禁止 JS 脚本获得 Cookie。其主要目的为防止跨站脚本攻击 (Cross-site scripting,XSS) 对 Cookie 的信息窃取。

示例#

  1. 会话期 cookie

    Set-Cookie: sessionId=38afes7a8 

    会话期 cookie 将会在客户端关闭时被移除。会话期 cookie 不设置 Expires 或 Max-Age 属性。

  2. 持久化 cookie

    Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT 
    Set-Cookie: id=a3fWa; Max-Age=2592000

    持久化 cookie 不会在客户端关闭时失效,而是在特定的日期(Expires)或者经过一段特定的时间之后(Max-Age)才会失效。

Cookie#

客户端在向服务器发 HTTP 请求时附带 Cookie 以获得服务器的认证。(Cookie 值来源于上文的 Set-Cookie 字段值)

报文头部字段的转发策略#

一个 HTTP 请求要跨过多个代理服务器,经过多次代理服务器的转发才能到达目标服务器。

代理服务器做转发时,对原 HTTP 报文头部字段有两种处理方式:

  1. 逐跳策略:单次转发有效。
  2. 端到端策略:一直有效,确保字段被发送到目标服务器。

哪些字段是逐条策略?哪些又是端到端策略?

除了下面这些字段为逐跳策略外,其他字段都属于端到端策略:

  1. Connection
  2. Keep-Alive
  3. Proxy-Authenticate
  4. Proxy-Authorization
  5. Trailer
  6. TE
  7. Transfer-Encoding
  8. Upgrade

区分容易混淆的字段#

TE、Accept-Encoding、Transfer-Encoding、Content-Encoding#

  1. Transfer-Encoding:用于指定传输报文主体时使用的编码方式,属于逐跳首部,即只在两个节点间有效。
  2. TE:用于告知服务器客户端能够处理的编码方式和相对优先级,属于逐跳首部,即只在两个节点间有效。
  3. Content-Encoding:用于指定报文主体已经采用的编码方式,属于端到端首部,即在整个传输过程中有效。
  4. Accept-Encoding:用于告知服务器客户端能够处理的编码方式和相对优先级,属于端到端首部,即在整个传输过程中有效。

Loaction 与 Content-Location#

Location 指定的是一个重定向请求的目的地址(或者新创建的文件的 URL)。

Content-Location 指向的是可供访问的资源的直接地址。

Proxy-Authenticate、WWW-Authenticate#

Proxy-Authenticate 规定了客户端与代理服务器的认证方式,而 WWW-Authenticate 规定了客户端与服务器的认证方式。

有关联的字段#

ETag、If-Match、If-None-Match#

Etag 由服务器端生成,客户端通过 If-Match 或者说 If-None-Match 这个条件判断请求来验证资源是否修改。常见的是使用 If-None-Match,比如请求一个文件的流程可能如下:

第一次请求:

  1. 客户端发起 HTTP GET 请求一个文件;
  2. 服务器处理请求,返回文件内容和一堆 Header,当然包括 Etag (例如”2e681a-6-5d044840”)。

第二次请求:

  1. 客户端发起 HTTP GET 请求一个文件,注意这个时候客户端同时发送一个 If-None-Match 头,这个头的内容就是第一次请求时服务器返回的 Etag:2e681a-6-5d044840。
  2. 服务器判断发送过来的 Etag 和计算出来的 Etag 匹配,因此 If-None-Match 为 False,不返回 200,返回 304,客户端继续使用本地缓存;

Cache-Control、max-age、Expires#

当首部字段 Cache-Control 有指定 max-age 指令时,会优先处理 max-age 指令,而忽略 Expires 字段。


参考:

  1. 《图解 HTTP》
  2. developer.mozilla.org/zh-CN/docs/W...
  3. cloud.tencent.com/developer/chapte...
  4. blog.csdn.net/swt369/article/detai...
https://learnku.com/articles/75429

一、浏览器四种常见的post请求方式

enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。默认地,表单数据会编码为"application/x-www-form-urlencoded"。
a.png

(1)、HTTP 协议是以 ASCII 码 传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。
(2)、协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须 使用什么编码方式 。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。
(3)、数据发送出去,还要服务端解析成功才有意义。一般服务端语言如 php、python 等,以及它们的 framework,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。

(1)application/x-www-form-urlencoded

这应该是最常见的 POST 提交数据的方式了。浏览器的原生

表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。

<form action="form_action.asp" enctype="text/plain">
  <p>First name: <input type="text" name="fname" /></p>
  <p>Last name: <input type="text" name="lname" /></p>
  <input type="submit" value="Submit" />
</form>

此时可以看到,

Content-Type: application/x-www-form-urlencoded;charset=utf-8
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3

首先,Content-Type 被指定为 application/x-www-form-urlencoded;其次,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式很好的支持,常用的如jQuery中的ajax请求,Content-Type 默认值都是「application/x-www-form-urlencoded;charset=utf-8

(2)multipart/form-data

这也是常见的post请求方式,一般用来上传文件,各大服务器的支持也比较好。所以我们使用表单 上传文件 时,必须让表单的enctype属性值为 multipart/form-data.

注意:以上两种方式:application/x-www-form-urlencoded和multipart/form-data都是浏览器原生支持的。

(3)application/json

application/json作为响应头并不陌生,实际上,现在很多时候也把它作为请求头,用来告诉服务端消息主体是序列化的JSON字符串,除了低版本的IE,基本都支持。除了低版本的IE都支持JSON.stringify()的方法,服务端也有处理JSON的函数,使用json不会有任何麻烦。例如:

//请求数据
var data = {name:'jack',sex:'man'};
//请求数据序列化处理
JSON.stingify(data);

//结果:{'name':'jack','sex':'man'};

二、postman的几种参数格式

form-data、x-www-form-urlencoded、raw、binary的区别

1.form-data对应的是页以form表单提交传值的情形

等价于http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来表名文件类型;content-disposition,用来说明字段的一些信息;
由于有boundary隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件

POST  HTTP/1.1
Host: test.app.com
Cache-Control: no-cache
Postman-Token: 59227787-c438-361d-fbe1-75feeb78047e
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="filekey"; filename=""
Content-Type: 


------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="textkey"

tttttt
------WebKitFormBoundary7MA4YWxkTrZu0gW--

请求体中的boundary参数指定的就是分隔体,可以看到请求内容被分为了两段,第一段对应filekey,第二段对应textkey。

2. x-www-form-urlencoded

即application/x-www-from-urlencoded,将表单内的数据转换为Key-Value。

POST  HTTP/1.1
Host: test.app.com
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
Postman-Token: e00dbaf5-15e8-3667-6fc5-48ee3cc89758

key1=value1&key2=value2
  • form-data与x-www-form-urlencoded的区别
  • multipart/form-data:可以上传文件或者键值对,最后都会转化为一条消息
  • x-www-form-urlencoded:只能上传键值对,而且键值对都是通过&间隔分开的

3.raw对应的是入参是任意格式的可以上传任意格式的【文本】,可以上传text、json、xml、html等

b.png

(4)binary

相当于Content-Type:application/octet-stream,只可以上传二进制数据,通常用来上传文件,但是一次只能上传一个文件

c.png

响应

1.点击 Send 即可发送请求
在下面的response模块显示返回信息
d.png

转自:https://www.cnblogs.com/h-c-g/p/11002380.html

一、证书和编码

X.509证书,其核心是根据RFC 5280编码或数字签名的数字文档。
实际上,术语X.509证书通常指的是IETF的PKIX证书和X.509 v3证书标准的CRL 文件,即如RFC 5280(通常称为PKIX for Public Key Infrastructure(X.509))中规定的。

二、X509文件扩展

我们首先要了解的是每种类型的文件扩展名。 很多人不清楚DER,PEM,CRT和CER结尾的文件是什么,更有甚者错误地说是可以互换的。 在某些情况下,某些可以互换,最佳做法是识别证书的编码方式,然后正确标记。 正确标签的证书将更容易操纵

三、编码--决定扩展名方式

1).DER 扩展名

.DER = DER扩展用于二进制DER编码证书。

这些文件也可能承载CER或CRT扩展。 正确的说法是“我有一个DER编码的证书”不是“我有一个DER证书”。

2).PEM 扩展名

.PEM = PEM扩展用于不同类型的X.509v3文件,是以“ - BEGIN ...”前缀的ASCII(Base64)数据。

3)常见的扩展

3.1).CRT 扩展名

.CRT = CRT扩展用于证书。 证书可以被编码为二进制DER或ASCII PEM。 CER和CRT扩展几乎是同义词。 最常见的于Unix 或类Unix系统。

3.2).CER扩展名

CER = .crt的替代形式(Microsoft Convention)您可以在微软系统环境下将.crt转换为.cer(.both DER编码的.cer,或base64 [PEM]编码的.cer)。

可参考:https://support.comodo.com/index.php?/Knowledgebase/Article/View/361/17/how-do-i-convert-crt-file-into-the-microsoft-cer-format

.cer文件扩展名也被IE识别为 一个运行MS cryptoAPI命令的命令(特别是rundll32.exe cryptext.dll,CryptExtOpenCER),该命令显示用于导入和/或查看证书内容的对话框。

3.3).KEY 扩展名

.KEY = KEY扩展名用于公钥和私钥PKCS#8。 键可以被编码为二进制DER或ASCII PEM。

四、常见的OpenSSL证书操作

证书操作有四种基本类型。查看,转换,组合和提取。

1)查看证书

即使PEM编码的证书是ASCII,它们是不可读的。这里有一些命令可以让你以可读的形式输出证书的内容;

1.1)查看PEM编码证书

openssl x509 -in cert.pem -text -noout
openssl x509 -in cert.cer -text -noout
openssl x509 -in cert.crt -text -noout

如果您遇到这个错误,这意味着您正在尝试查看DER编码的证书,并需要使用“查看DER编码证书”中的命令。

unable to load certificate
12626:error:0906D06C:PEMroutines:PEM_read_bio:no start line:pem_lib.c:647:Expecting: TRUSTEDCERTIFICATE

1.2)查看DER编码证书

openssl x509 -in certificate.der -inform der -text -noout

如果您遇到以下错误,则表示您尝试使用DER编码证书的命令查看PEM编码证书。在“查看PEM编码的证书”中使用命令

unable to load certificate
13978:error:0D0680A8:asn1 encodingroutines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1306:
13978:error:0D07803A:asn1 encodingroutines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:380:Type=X509

2)转换证书格式

转换可以将一种类型的编码证书存入另一种。(即PEM到DER转换)
PEM到DER

openssl x509 -in cert.crt -outform der-out cert.der

DER到PEM

openssl x509 -in cert.crt -inform der -outform pem -out cert.pem

3)组合证书

在某些情况下,将多个X.509基础设施组合到单个文件中是有利的。一个常见的例子是将私钥和公钥两者结合到相同的证书中。

组合密钥和链的最简单的方法是将每个文件转换为PEM编码的证书,然后将每个文件的内容简单地复制到一个新文件中。这适用于组合文件以在Apache中使用的应用程序。

4)证书提取

一些证书将以组合形式出现。 一个文件可以包含以下任何一个:证书,私钥,公钥,签名证书,证书颁发机构(CA)和/或权限链。

前言

还在为没有设置好Charles 抓不了手机上的https请求而苦恼吗!今天手把手教你用proxyman抓取iPhone上的网络请求

操作设备环境

  • 电脑系统:macOs Big Sur 11.1
  • 手机系统:ios 12以及最新
  • proxyman系统版本: 2.21.1以及最新

安装

1.软件安装步骤我就省略了,软件下载地址: https://proxyman.io/
11.png

查看大图

2.安装证书;Certificate->Install Certificate on this Mac
22.png

查看大图

3.安装扩展以及证书,Automatic->Install&Trust Certificate
33.png

查看大图

傻瓜式点击就好

抓取数据

1.上面的步骤就安装好了证书;但是这个时候只能请求http,如果我们请求是https的话,执行下面步骤:
44.png

查看大图

成功抓去到了浏览器到所有请求

55.png
查看大图

观察数据返回

抓取手机app数据

移动端安装流程 (⚠️图片上红色文字是关键步骤)

1.查看移动端设置流程,必须跟电脑连同一个Wi-Fi
66.png

查看大图

77.png

查看大图

手机上的设置我就写在图片上下面

2.根据上面5个步骤手机设置,注意⚠️第五步千万别遗漏了,这是你能否抓到数据等关键。

允许https 返回

  1. 找到自己手机链接IP,然后选择自己所要看到数据请求的域名,选择Enable Https Response 就可以看见body 里面的数据返回了。
    88.png
    查看大图

常用设置

99.png

查看大图

本文转自:https://www.jianshu.com/p/2e728bce7eba
感谢作者:剁椒先生

一、先给定义:

什么是大端?什么是小端?
主要针对的是CPU向内存写入数据的两种方式:

大端序:将高位字节保存在内存的低地址(高位字节在前)的方式。
小端序:将高位字节保存在内在存的高地址(低位字节在前)的方式。

二、下面引入详细说明:

假设在 0x20 号开始的地址中保存4字节 int 型数据 0x12345678,大端序CPU保存方式如下图所示:
1.png
上图1:整数 0x12345678 的大端序字节表示。
比如说1在高位就是高位字节,相反8就在低位是低位字节

对于大端序,最高位字节 0x12 存放到低位地址,最低位字节 0x78 存放到高位地址。小端序的保存方式如下图所示:
2.png
上图2:整数 0x12345678 的小端序字节表示。
比如说1在高位就是高位字节,相反8就在低位是低位字节

不同CPU保存和解析数据的方式不同(主流的Intel系列CPU为小端序),小端序系统和大端序系统通信时会发生数据解析错误。因此在发送数据前,要将数据转换为统一的格式——网络字节序(Network Byte Order)。网络字节序统一为大端序。主机A先把数据转换成大端序再进行网络传输,主机B收到数据后先转换为自己的格式再解析。网络字节序转换函数
sockaddr_in 结构体,其中就用到了网络字节序转换函数,如下所示:

//创建sockaddr_in结构体变量
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充
serv_addr.sin_family = AF_INET; //使用IPv4地址
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //具体的IP地址
serv_addr.sin_port = htons(1234); //端口号

htons() 用来将当前主机字节序转换为网络字节序,其中
h代表主机(host)字节序,
n代表网络(network)字节序,
s代表shorthtonsh、to、n、s 的组合,可以理解为”将short型数据从当前主机字节序转换为网络字节序“。常见的网络字节转换函数有:htons()host to network short,将short类型数据从主机字节序转换为网络字节序。
ntohs():network to host short,将short类型数据从网络字节序转换为主机字节序。
htonl():host to network long,将long类型数据从主机字节序转换为网络字节序。
ntohl():network to host long,将long类型数据从网络字节序转换为主机字节序。

通常,以s为后缀的函数中,s代表2个字节short,因此用于端口号转换;以l为后缀的函数中,l代表4个字节的long,因此用于IP地址转换。举例说明上述函数的调用过程:

#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
int main(){
unsigned short host_port = 0x1234, net_port;
unsigned long host_addr = 0x12345678, net_addr;

net_port = htons(host_port);
net_addr = htonl(host_addr);

printf("Host ordered port: %#x\n", host_port);
printf("Network ordered port: %#x\n", net_port);
printf("Host ordered address: %#lx\n", host_addr);
printf("Network ordered address: %#lx\n", net_addr);
system("pause");
return 0;
}

运行结果:

Host ordered port: 0x1234
Network ordered port: 0x3412
Host ordered address: 0x12345678
Network ordered address: 0x78563412

另外需要说明的是,sockaddr_in 中保存IP地址的成员为32位整数,而我们熟悉的是点分十进制表示法,例如 127.0.0.1,它是一个字符串,因此为了分配IP地址,需要将字符串转换为4字节整数。inet_addr() 函数可以完成这种转换。inet_addr() 除了将字符串转换为32位整数,同时还进行网络字节序转换。请看下面的代码:

#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")

int main(){
char *addr1 = "1.2.3.4";
char *addr2 = "1.2.3.256";

unsigned long conv_addr = inet_addr(addr1);
if(conv_addr == INADDR_NONE){
puts("Error occured!");
}else{
printf("Network ordered integer addr: %#lx\n", conv_addr);
}

conv_addr = inet_addr(addr2);
if(conv_addr == INADDR_NONE){
puts("Error occured!");
}else{
printf("Network ordered integer addr: %#lx\n", conv_addr);
}

system("pause");
return 0;
}

运行结果:
Network ordered integer addr: 0x4030201

Error occured!从运行结果可以看出,inet_addr() 不仅可以把IP地址转换为32位整数,还可以检测无效IP地址。注意:为 sockaddr_in 成员赋值时需要显式地将主机字节序转换为网络字节序,而通过 write()/send() 发送数据时TCP协议会自动转换为网络字节序,不需要再调用相应的函数。

本文摘自:https://www.jianshu.com/p/68735394db7a