IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

由于 HTTP request 不规范导致的被防火墙拦截

Soulogic 灵魂逻辑 2010-12-30 22:52:20 累计浏览 3,410 次
本机暂存

这个问题其实是刘涛发现的,我只是整理一下

一段程序在本地调试正常后,放到网上却时断时续,最后确认问题如下

1. HTTP request 中的 Host: 段是 HTTP 1.1 规范,在 1.0 中没有这个

2. 但是目前通常环境中(我用的 Ubuntu,不过其他发行版应该也有这问题),PHP 中的一些函数如 file_get_contents 会发送错误的 request

例如只是这么简单的一行

  1. file_get_contents('http://www.163.com');

发送的头两行是

GET / HTTP/1.0
Host: www.163.com

3. 有些防火墙会把这些不规范的 HTTP 通信拦截掉:就算你用的机器没设置 iptable,通常机房本身都会有硬件防火墙的

昨天出现问题,是没料想到 PECL OAuth 也是如此

Update in 2010.12.31
王博对这个问题做了补充
1.在他的 CentOS 5.3 上,PECL OAuth 默认用的 HTTP 1.1
2.OAuth::setRequestEngine 方法可以提供 OAUTH_REQENGINE_STREAMS 和 OAUTH_REQENGINE_CURL 两种不同方式,后者就可以避免上述问题了。

解决方法有很多种,不过为了代码最大适应性(就像为什么现在大家都不用短标签 <? 一样),我觉得不要使用 file_get_contents 获取远程数据(在该函数的官方页评论里,你会看到各种各样的相同功能的封装、弃用 PECL OAuth 比较好,虽然随着时间的流逝这个问题最终会被修正

编译也可以解决,我在虚拟机了编译了份 ./configure --disable-all --with-curl --with-curlwrappers,确认发的是 HTTP 1.1 了,但 with-curlwrappers 参数的解释是 EXPERIMENTAL: Use cURL for url streams

第一次见如何用 tcpdump,在调试这个问题时,可以用

sudo tcpdump -A host www.163.com and 'tcp[20:4] = 0x47455420'

前者是监听的域名,“and”后面的大概可以理解为条件 substr($line, 20, 4) == pack('H*', '47455420')

同分类推荐文章

  1. 绿盟科技《APT组织研究年鉴》(2026 版)正式发布 (2026-06-16 20:21:10)
  2. 【已复现】Linux内核Fragnesia权限提升漏洞(CVE-2026-46300) (2026-06-15 10:53:58)
  3. 企业文档安全最佳实践(二):给文档上“身份证”——手动标密与智能自动标密 (2026-06-12 17:18:33)

查看更多 安全 文章 →

建议继续学习

  1. 使用gettext来支持PHP的多语言 (累计阅读 39,269)
  2. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,164)
  3. Paypal接口详细代码(PHP版,非API接口) (累计阅读 19,408)
  4. 浅析http协议、cookies和session机制、浏览器缓存 (累计阅读 17,446)
  5. 从输入 URL 到页面加载完成的过程中都发生了什么事情? (累计阅读 15,933)
  6. libcurl的使用总结(二) (累计阅读 15,083)
  7. 使用python爬虫抓站的一些技巧总结:进阶篇 (累计阅读 13,301)
  8. 我的PHP,Python和Ruby之路 (累计阅读 13,147)
  9. include(“./file.php”)和include(“file.php”)区别 (累计阅读 12,789)
  10. 15个最好的免费开源电子商务平台 (累计阅读 12,541)