请求报文 = 请求行 *((常规头部 | 请求头部 | 实体头部) CRLF) CRLF [消息体]
请求行 = 方法 SP 请求URI SP HTTP版本 CRLF
方法 = “OPTIONS” | “GET” | “POST” | “PUT” | “DELETE” | “HEAD” | “TRACE” | “CONNECT” | 扩展方法
HTTP版本 = “HTTP/1.0” | “HTTP/1.1”
常规头部 = Cache-Control | Connection | Date | Pragma | Trailer | Transfer-Encoding | Upgrade | Via |Warning
请求头部 = Accept |Accept-Charset | Accept-Encoding | Accept-Language | Authorization | Expect |From | Host | If-Match | If-Modified-Since | If-None-Match | If-Range | If-Unmodified-Since | Max-Forwards | Proxy-Authorization | Range | Referer | TE | User-Agent
实体头部 = Allow | Content-Encoding| Content-Language | Content-Length | Content-Location | Content-MD5 | Content-Range | Content-Type | Expires | Last-Modified | 扩展头部
OPTIONS:请求查询服务器性能,或查询与资源相关的选项
GET:请求获取目标资源
POST:请求在目标资源末尾增加新的数据
PUT:请求以目标资源为地址存储数据
DELETE:请求删除目标资源
HEAD:请求获取目标资源的响应报文头部
TRACE:请求服务器回送请求报文,用于测试
CONNECT:保留字段,用于能够动态切换通道的代理
扩展方法:用户自定义的方法
详见:http://blog.csdn.net/sadfishsc/article/details/7231688
其中,扩展头部表示用户自定义的头部字段,常见的如Cookie,用于将浏览器保存在该域名下的cookie发送给服务端
响应报文 = 状态行 *((常规头部 | 响应头部 | 实体头部) CRLF) CRLF [消息体]
状态行 = HTTP版本 SP 状态码 SP 状态描述 CRLF
响应头部 = Accept-Ranges | Age | Etag | Location | Proxy-Authorization | Retry-After | Server | Vary | WWW-Authenticate
响应报文头部中除了专有的响应头部与请求报文的请求头部不同外,其它可用的字段都是相同的。同样请参见上面的链接
详见:http://blog.csdn.net/sadfishsc/article/details/7242582
参见:http://drops.wooyun.org/papers/2466
简单地说,预防CRLF注入攻击的方法就是过滤掉请求参数中的 \r \n 字符
本文请求和响应报文规则中所采用的规则是与HTTP协议文档(RFC2616)一致的语法,即ABNF(扩展的巴科斯范式)
其中:
等于(=)表示“被定义为”
圆括号(())表示括起来的部分合起来是一个元素
星号(*)表示其后面紧接的元素会重复至少0次
竖线(|)表示或
方括号([])表示括起来的元素是可选项
双引号(“”)表示引起来的字符串作为值使用,且不区分大小写
CRLF表示回车换行,即\r\n
SP表示真实的空格
规则中的空格( )没有实际含义,只是为了增加可读性