Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

小心 http_host 出安全问题!

  nginx 的 http_core 模块中提供了 $host 用来准确获取请求的 server_name。然而 nginx 还支持通过 $http_* 来获取请求头中的某个字段,所以有时候会看到一些配置中使用 $http_host 来代替 $host。其实 $host 和 $http_host 的区别还是很大的,滥用 $http_host 可能造成安全问题!
  在 HTTP/1.1 中,请求头中的 Host 字段是必须的,所以 $http_host 只是比 $host 多个端口号而已。这在非 80 端口上可以看出
server { listen 8080; return 200 "${dollar}host is $host\n${dollar}http_host is $http_host\n"; }
  如果它们真的只是一个端口的差异,我肯定不会写一篇文章说这件事。这是一个涉及安全的问题!在 HTTP/1.0 中,Host 字段是可选的,Host 可能通过 HTTP 请求报文的第一行传输,而后面的 Host 会被忽略。而 $http_host 总是从请求头中取出 Host,那就意味着,$http_host 可以被伪造成任何东西。下面我们使用 telnet 来发起一个这样的 HTTP/1.0 请求:

  吓死宝宝了么?我的请求头中 Host 设置为 'or'='or' 这么一个神奇的字符串,结果他出现在了正确响应的 $http_host 中。真正被服务器作为 server_name 路由处理的是 HTTP 请求报文第一行的方法名后面 URL 中的主机名!
  值得一提的是,PHP 之类的直接基于 nginx fastcgi 的 Web 服务器用的通常也是 $http_host 来获取主机名,所以 PHP 的 $_SERVER['HTTP_HOST'] 也是不可靠的!想想都觉得毛骨悚然,如果服务器程序将 HTTP_HOST 这个字段直接拼 SQL 语句入库,那么。。你们懂的!
网名:
54.198.108.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^