前言:在当今数字化的网络世界中,Web 技术的基石构建起了我们丰富多彩的互联网体验。其中,Cookie 和 Session 犹如隐匿于幕后的关键使者,默默地在客户端与服务器之间传递着信息,管理着用户的状态与交互数据,深刻影响着我们在各类网站与应用中的每一次操作与交互流程。
与此同时,Links、Wget、Curl、Httpie 这些强大的 Web 相关工具,宛如网络探险家手中的利器,助力开发者、运维人员以及技术爱好者深入挖掘 Web 资源、测试接口、模拟请求,它们以各自独特的功能和优势,在 Web 开发、调试以及数据获取等诸多场景中发挥着不可或缺的作用。
**本篇文章将深入探究 Cookie 和 Session 的奥秘,剖析它们的工作原理、区别与联系,以及在实际应用中的关键要点。同时,还将详细介绍 Links、Wget、Curl、Httpie 这些工具的特性、使用方法以及典型应用场景,为读者揭开 Web 技术底层架构与实用工具的神秘面纱,帮助大家更好地理解、运用这些知识与工具,在 Web 技术的广阔天地中畅行无阻,开启一场充满惊喜与收获的技术探索之旅。 **
Cookie 和 Session 是Web开发中用于管理用户会话和状态的两种常用技术。它们在用户与服务器之间的交互中扮演着重要的角色。以下是对它们的简要解释:
一、Cookie
-
定义:Cookie 是由服务器发送到用户浏览器并保存在本地的小块数据。它通常用于存储用户的一些信息,比如登录状态、用户偏好设置等。
-
存储位置:Cookie 存储在用户的浏览器中,每个Cookie都有特定的过期时间,过期后会被浏览器自动删除。
-
作用:Cookie 可以用来识别用户,实现个性化服务,比如记住用户的登录状态,这样用户就不用每次访问网站时都重新登录。
-
安全性:由于Cookie存储在客户端,因此它们容易受到篡改和盗窃。因此,敏感信息不应该直接存储在Cookie中。
-
HTTP Only:为了提高安全性,可以设置Cookie为HTTP Only,这样JavaScript就无法访问这些Cookie,减少了跨站脚本攻击(XSS)的风险。
二、Session
-
定义:Session 是一种服务器端的存储方式,用于跟踪用户的状态。每个用户浏览器在访问服务器时,服务器会创建一个唯一的Session ID,并将其存储在用户的Cookie中。
-
存储位置:Session 数据存储在服务器端,通过Session ID来关联用户的状态。
-
作用:Session 可以用来存储用户的状态信息,比如用户的登录信息、购物车内容等。由于存储在服务器端,Session 比Cookie更安全。
-
生命周期:Session 有过期时间,当用户关闭浏览器或者Session超时,Session 就会结束。
-
安全性:由于Session ID存储在Cookie中,如果Cookie被篡改,攻击者可能会冒充用户。因此,保护Session ID的安全非常重要。
-
Session 固定攻击:攻击者可能会尝试通过篡改Session ID来固定用户的Session,这是一种安全风险。
Cookie 和 Session 的区别
- 存储位置:Cookie 存储在客户端,而Session存储在服务器端。
- 安全性:Session 通常比Cookie更安全,因为数据存储在服务器端。
- 存储容量:Cookie 有大小限制(通常为4KB),而Session没有这样的限制。
- 生命周期:Cookie 可以设置为长期存储,而Session通常在浏览器关闭或超时后结束。
在实际应用中,Cookie 和 Session 常常结合使用,以实现更安全、更有效的用户状态管理。例如,可以使用Cookie来存储Session ID,而将实际的用户状态信息存储在服务器端的Session中。这样既利用了Cookie的便捷性,又保证了数据的安全性。
三、Web工具
1、links
格式:links [OPTION]... [URL]...
常用选项:
-dump
非交互式模式,显示输出结果-source
打印源码
2、wget
格式:wget [OPTION]... [URL]...
常用选项:
启动:
-V, -version
显示wget的版本后退出-h, -help
打印语法帮助-b, -background
启动后转入后台执行-e, -execute=COMMAND
执行.wgetrc'格式的命令,wgetrc格式参见
/etc/wgetrc或
~/.wgetrc`
记录和输入文件:
-o, -output-file=FILE
把记录写到FILE文件中-a, -append-output=FILE
把记录追加到FILE文件中-d, -debug
打印调试输出-q, -quiet
安静模式(没有输出)-v, -verbose
冗长模式(这是缺省设置)-nv, -non-verbose
关掉冗长模式,但不是安静模式-i, -input-file=FILE
下载在FILE文件中出现的URLs-F, -force-html
把输入文件当作HTML格式文件对待-B, -base=URL
将URL作为在-F -i参数指定的文件中出现的相对链接的前缀
下载:
-bind-address=ADDRESS
指定本地使用地址(主机名或IP,当本地有多个IP或名字时使用)-t, -tries=NUMBER
设定最大尝试链接次数(0 表示无限制).-O -output-document=FILE
把文档写到FILE文件中-nc, -no-clobber
不要覆盖存在的文件或使用.#前缀-c, -continue
接着下载没下载完的文件-progress=TYPE
设定进程条标记-N, -timestamping
不要重新下载文件除非比本地文件新-S, -server-response
打印服务器的回应-spider
不下载任何东西-T, -timeout=SECONDS
设定响应超时的秒数-w, -wait=SECONDS
两次尝试之间间隔SECONDS秒-waitretry=SECONDS
在重新链接之间等待1…SECONDS秒-random-wait
在下载之间等待0…2*WAIT秒-Y, -proxy=on/off
打开或关闭代理-Q, -quota=NUMBER
设置下载的容量限制-limit-rate=RATE
限定下载速率
目录:
-nd -no-directories
不创建目录-x, -force-directories
强制创建目录-nH, -no-host-directories
不创建主机目录-P, -directory-prefix=PREFIX
将文件保存到目录 PREFIX/…
-cut-dirs=NUMBER
忽略 NUMBER层远程目录
HTTP 选项:
-http-user=USER
设定HTTP用户名为USER
。-http-passwd=PASS
设定http密码为PASS
。-C, -cache=on/off
允许/不允许服务器端的数据缓存(一般情况下允许)。-E, -html-extension
将所有text/html文档以.html扩展名保存。-ignore-length
忽略Content-Length
头域。-header=STRING
在headers中插入字符串STRING
。-proxy-user=USER
设定代理的用户名为USER
。-proxy-passwd=PASS
设定代理的密码为PASS
。-referer=URL
在HTTP请求中包含Referer: URL
头。-s, -save-headers
保存HTTP头到文件。-U, -user-agent=AGENT
设定代理的名称为AGENT
而不是 Wget/VERSION。-no-http-keep-alive
关闭 HTTP活动链接(永远链接)。-cookies=off
不使用 cookies。-load-cookies=FILE
在开始会话前从文件FILE
中加载cookie。-save-cookies=FILE
在会话结束后将 cookies 保存到FILE
文件中。
FTP 选项:
-nr, -dont-remove-listing
不移走.listing
文件。-g, -glob=on/off
打开或关闭文件名的 globbing 机制。-passive-ftp
使用被动传输模式(默认值)。-active-ftp
使用主动传输模式。-retr-symlinks
在递归的时候,将链接指向文件(而不是目录)。
递归下载:
-r, -recursive
递归下载——慎用!-l, -level=NUMBER
最大递归深度 (inf 或 0 代表无穷).-delete-after
在下载完毕后局部删除文件。-k, -convert-links
转换非相对链接为相对链接。-K, -backup-converted
在转换文件X之前,将之备份为 X.orig。-m, -mirror
等价于-r -N -l inf -nr
.-p, -page-requisites
下载显示HTML文件的所有图片。
递归下载中的包含和不包含(accept/reject):
-A, -accept=LIST
分号分隔的被接受扩展名的列表。-R, -reject=LIST
分号分隔的不被接受的扩展名的列表。-D, -domains=LIST
分号分隔的被接受域的列表。-exclude-domains=LIST
分号分隔的不被接受的域的列表。
跟踪和忽略选项:
-follow-ftp
跟踪HTML文档中的FTP链接。-follow-tags=LIST
分号分隔的被跟踪的HTML标签的列表。-G, -ignore-tags=LIST
分号分隔的被忽略的HTML标签的列表。-H, -span-hosts
当递归时转到外部主机。-L, -relative
仅仅跟踪相对链接。-I, -include-directories=LIST
允许目录的列表。-X, -exclude-directories=LIST
不被包含目录的列表。-np, -no-parent
不要追溯到父目录。
常用选项:
-q
静默模式-c
断点续传-P /path
保存在指定目录-O filename
保存为指定文件名,filename 为-
时,发送至标准输出
---limit-rate=
指定传输速率,单位K,M等
范例,下载:
命令:wget --limit-rate 1M -P /data https://mirrors.aliyun.com/centos/8/isos/x86_64/CentOS-8-x86_64-1905-dvd1.iso
命令:ls /data
范例,实现浏览器功能:
命令:wget -qO - http://10.0.0.1/
3、curl
curl是一款能够依据URL语法,在命令行模式下运作的文件传输工具,其具备极为强大的功能,所支持的协议多种多样,涵盖了FTP、FTPS、HTTP、HTTPS、GOPHER、TELNET、DICT、FILE以及LDAP等等。
不仅如此,curl在诸多方面都有着出色的表现。它支持HTTPS认证,能够运用HTTP的POST、PUT等多种方法开展操作,还可以实现FTP上传功能。在认证方面,kerberos认证、用户名/密码认证它都支持,同时也支持通过HTTP上传文件。而且,它具备断点续传的能力,不管是下载文件还是上载文件都能实现断点续传。
另外,curl对代理服务器相关的功能也有着很好的支持,像支持代理服务器、cookies,能实现http代理服务器管道(proxy tunneling),支持IPv6以及socks5代理服务器,甚至还可以借助http代理服务器将文件上传到FTP服务器等,为使用者在不同场景下的文件传输等操作提供了极大的便利。
格式:curl [options] [URL...]
常见选项:
-A/--user-agent <string>
:设置用户代理发送给服务器。-e/--referer <URL>
:来源网址。--cacert <file>
:CA 证书 (SSL)。-k/--insecure
:允许忽略证书进行 SSL 连接。--compressed
:要求返回是压缩的格式。-H/--header "key:value"
:自定义首部字段传递给服务器。-i
:显示页面内容,包括报文首部信息。-I/--head
:只显示响应报文首部信息。-D/--dump-header <file>
:将 url 的 header 信息存放在指定文件中。--basic
:使用 HTTP 基本认证。-u/--user <user[:password]>
:设置服务器的用户和密码。-L
:如果有 3xx 响应码,重新发请求到新位置。-O
:使用 URL 中默认的文件名保存文件到本地。-o <file>
:将网络文件保存为指定的文件中。--limit-rate <rate>
:设置传输速度。-0/--http1.0
:数字 0,使用 HTTP 1.0。-v/--verbose
:更详细。-C
:选项可对文件使用断点续传功能。-c/--cookie-jar <file name>
:将 url 中 cookie 存放在指定文件中。-x/--proxy <proxyhost[:port]>
:指定代理服务器地址。-X/--request <command>
:向服务器发送指定请求方法。-U/--proxy-user <user:password>
:代理服务器用户和密码。-T
:选项可将指定的本地文件上传到 FTP 服务器上。--data/-d
:方式指定使用 POST 方式传递数据。-s --silent
:Silent mode。-b name=data
:从服务器响应 set-cookie 得到值,返回给服务器。-w <format>
:显示相应的指定的报文信息,如:%{http_code}
,%{remote_ip}
等。-m, --max-time <time>
:允许最大传输时间。
范例,服务网页:
命令:curl -I https://www.baidu.com
命令:curl -I -A ie10 https://www.baidu.com
范例,判断网站正常:
命令:if [ "$(curl -sL -w '%{http_code}' https://www.baidu.com - o /dev/null)" = "200" ]; then
命令:if curl -sL --fail http://www.wangxiaochun.com -o /dev/null; then
4、 httpie
HTTPie 工具是一款功能十分丰富的 HTTP 命令行客户端,它具备强大的功能,能够让用户通过简洁的命令行界面与各类 Web 服务展开交互。
该工具提供了一个非常方便的 http 命令,其最大的特点在于允许用户运用简单且自然的语法,轻松地发送各种 HTTP 请求。而且,HTTPie 工具还会将输出结果以彩色的形式呈现,这样的设计极大地增强了信息的可视化效果,使用户可以更加直观地查看和分析结果。
HTTPie 可广泛应用于测试领域,尤其是在与 HTTP 服务器进行交互测试时,能够帮助用户快速检查和验证服务器的响应,为开发人员、测试人员以及系统运维人员提供了一种高效、便捷的操作方式,是在 HTTP 服务测试和交互操作方面不可或缺的得力助手。
主要特点:
- 具表达力的和直观语法
- 格式化的及彩色化的终端输出
- 内置 JSON 支持
- 表单和文件上传
- HTTPS、代理和认证
- 任意请求数据
- 自定义头部
- 持久化会话
- 类似 wget 的下载
- 支持 Python 2.7 和 3.x
① 基本用法
http
是 httpie
的命令行工具,它允许你发送GET、POST、PUT、DELETE等HTTP请求。
查看帮助信息:
http --help
发送GET请求:
http www.example.com
发送POST请求:
http -f POST www.example.com username=john password=123
② 常用选项
--json
: 发送JSON格式的数据。--form
: 发送表单数据。--pretty
: 格式化输出。--headers
: 只显示响应头。--body
: 只显示响应体。--verbose
: 显示请求和响应的详细信息。--download
: 下载请求的资源。--session
: 保存会话以供后续请求使用。
③ 示例
1. 发送GET请求并格式化输出:
http --check-status --pretty=all www.example.com
2. 发送POST请求并包含JSON数据:
http --header "Content-Type: application/json" POST www.example.com/users name=John age=30
3. 发送表单数据:
http -f POST www.example.com fields=name value=John
4. 下载文件:
http --download www.example.com/file.zip
5. 使用会话:
http --session=mysession www.example.com
http --session=mysession www.example.com/another-page
6. 发送带有自定义头部的请求:
http My-Header:123 www.example.com
7. 发送带有Bearer令牌的请求:
http Authorization:"Bearer token" www.example.com
8. 使用代理:
http --proxy=http:myproxy:8080 www.example.com
9. 发送文件:
http -f POST www.example.com file@localfile.txt
10. 显示请求和响应头:
http -v www.example.com
httpie
还有很多高级功能,如持久会话、自定义SSL证书验证等。这些示例只是展示了 httpie
的一些基本用法。更多高级用法和选项,可以通过查看 httpie
的官方文档或使用 http --help
命令来获取。
5、压力测试工具
- httpd的压力测试工具:
- ab, webbench, http_load, seige
- Jmeter 开源
- Loadrunner 商业,有相关认证
- tcpcopy:网易,复制生产环境中的真实请求,并将之保存
ab 来自httpd-tools包
格式:ab [OPTIONS] URL
常用选项:
-n
总请求数-c
模拟的并发数-k
:以持久连接模式测试
注意:并发数高于1024时,需要用 ulimit -n # 调整能打开的文件数