2. HTTP协议安全面试题精讲

HTTP协议是Web安全的“地基”。面试官问HTTP,往往不是考你背状态码,而是借协议细节判断你是否理解攻击面在哪里。本章围绕请求方法、状态码、头部字段、Cookie与Session、同源策略、CORS、HTTPS握手与证书校验七条主线,逐条拆解常见追问与应答思路。

一、请求方法:安全方法与幂等性的安全含义

面试常问:“GET和POST在安全上有什么区别?”标准答案是:GET是安全方法(不改变服务端状态)、幂等;POST非安全、非幂等。但真正的考点在于——方法语义不等于服务端实现。很多框架允许用GET执行删除,例如/admin/delete?id=1,这就把“安全方法”变成了CSRF的天然入口:攻击者只需诱导受害者加载一个<img src="...">即可触发。

追问“PUT/DELETE/TRACE/OPTIONS有什么用”时,要答出:PUT用于幂等更新,若未鉴权可被任意覆盖文件;TRACE会回显请求,历史上用于XST(跨站追踪)窃取Cookie,现代浏览器已禁用;OPTIONS用于预检,也是探测服务端允许方法的入口。防御上应遵循最小方法原则,在Nginx中显式限制:

if ($request_method !~ ^(GET|POST)$) {
    return 405;
}

注意if在location中的使用限制,生产环境更推荐用limit_except或应用层路由白名单。

二、状态码:信息泄露与逻辑绕过的信号

状态码本身不直接构成漏洞,但它是判断逻辑的关键线索。面试高频追问包括:

  • 401与403的区别:401是“未认证”,应带WWW-Authenticate;403是“已认证但无权限”。若越权访问返回403而非404,说明资源存在,可被枚举。
  • 302跳转的开放重定向:登录后跳转参数?next=若未校验,可被用于钓鱼。判断依据是跳转目标是否落在白名单域名内。
  • 200掩盖错误:部分应用把异常统一返回200加错误JSON,导致WAF和监控失效,也便于攻击者盲测。

实战中,遇到500要关注是否回显堆栈;遇到405可尝试方法覆盖头X-HTTP-Method-Override: PUT绕过前端限制。这些都属于“状态码驱动的测试路径”。

三、头部字段:注入、伪造与信息泄露

头部是面试追问最密集的区域。几个必须掌握的点:

Host头攻击:当应用用Host拼接密码重置链接时,攻击者篡改Host即可让链接指向恶意域名。验证方式是发送Host: evil.com,观察返回的链接。防御是配置固定的server_name并校验Host白名单。

X-Forwarded-For伪造:若应用信任该头做IP限制,攻击者加X-Forwarded-For: 127.0.0.1即可绕过。判断依据是后端是否直接取该头而非取真实TCP源IP。

安全响应头:Content-Security-Policy限制脚本源,X-Content-Type-Options: nosniff阻止MIME嗅探,Strict-Transport-Security强制HTTPS。面试可让候选人写出一个基础CSP示例:

Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; object-src 'none'

四、Cookie与Session:从属性到固定攻击

Cookie的安全属性是必答项:HttpOnly防XSS读取,Secure仅HTTPS传输,SameSite=Lax/Strict缓解CSRF。追问“SameSite=Lax能否完全防CSRF”时,要指出Lax允许顶级导航的GET请求携带Cookie,因此GET型敏感操作仍可被利用。

Session机制的核心追问是Session固定攻击:攻击者先获取一个Session ID,诱导受害者用该ID登录,之后攻击者持同一ID即成为已认证用户。防御是在登录成功后调用session_regenerate_id(true)(PHP)或等价的重建会话操作。

另一个高频点是Session存储:内存存储重启丢失、多机不共享;文件存储需注意权限;Redis存储要设置过期与访问密码。判断Session是否安全的简易清单:ID是否足够随机(≥128位)、是否随登录轮换、是否绑定部分客户端特征、是否设置合理超时。

五、同源策略与CORS:浏览器边界与配置陷阱

同源策略定义“协议+域名+端口”三者一致。面试常问:“同源策略阻止了什么?”准确回答:阻止跨源读取响应内容,但不阻止请求发送(简单请求会发出),也不阻止<script>、<img>加载。

CORS是服务端主动放宽同源策略的机制。危险配置主要有两类:

  • 反射Origin:Access-Control-Allow-Origin直接回显请求的Origin,且Access-Control-Allow-Credentials: true,等于对全网站开放带凭证读取。
  • 信任null源:允许Origin: null,可被沙箱iframe或本地文件利用。

正确做法是维护Origin白名单,精确匹配后返回,并配合Vary: Origin避免缓存污染。面试中若候选人能说出“预检请求会先发OPTIONS,且预检不携带Cookie”,说明其理解到位。

六、HTTPS握手与证书校验:从流程到验证

HTTPS握手可简化为:客户端发ClientHello(含支持的TLS版本、密码套件、随机数)→服务端回ServerHello与证书 → 客户端校验证书链与域名 → 密钥交换 → 生成会话密钥 → 加密通信。TLS 1.3将密钥交换简化为1-RTT,并默认前向安全。

证书校验的关键点:证书链是否由受信CA签发、是否在有效期、域名是否匹配(SAN字段)、是否被吊销(CRL/OCSP)。面试追问“自签名证书为何危险”时,要答出:无法验证身份,易被中间人替换,除非客户端显式固定证书(Certificate Pinning)。

实操验证可用OpenSSL查看证书链与握手过程:

openssl s_client -connect example.com:443 -servername example.com -showcerts

观察输出中的Verify return code,若为0表示校验通过;非0则说明链或域名有问题。再配合openssl x509 -noout -dates -subject -ext subjectAltName检查有效期与SAN。

七、面试应答的通用框架

面对HTTP安全追问,建议按“协议定义→攻击面→验证方式→防御措施”四步作答。例如被问“Cookie如何防XSS”,先答HttpOnly的作用,再指出它不能防CSRF,最后给出“HttpOnly+Secure+SameSite+登录后轮换Session”的组合方案。这样既展示知识广度,也体现工程判断力。

最后提醒:面试官常通过“如果……会怎样”追问边界条件,例如“SameSite=None必须配Secure吗”“CORS预检缓存多久”。回答时明确前提、给出依据,比背诵结论更能体现安全工程师的思维方式。