【问题标题】:If IP addresses can be spoofed so如果IP地址可以被欺骗,那么
【发布时间】:2012-02-22 19:31:30
【问题描述】:

如果 IP 地址可以通过创建虚假或操纵的 http 标头来进行欺骗,因此不应依赖它来验证我们 PHP/ASP 页面中的传入请求,那么服务器为什么会接受并依赖它呢?例如,拒绝 IP 或允许 IP 都是基于 IP 的。

除了说 PHP/ASP 通过服务器变量获取 IP 信息之外,服务器是否以其他方式(并且更可靠)获取 IP 信息?

【问题讨论】:

标签: security ip server-variables


【解决方案1】:

服务器通常愿意依赖连接的 IP 地址来处理低风险流量,因为设置 TCP 会话需要 three-way handshake。只有在数据包中的 IP 地址是可路由的并且某些机器准备好处理连接时,此握手才能成功。流氓路由器可以伪造 IP 地址,但一般来说,路由器离任一端点越远,伪造连接就越困难,因此大多数人都准备依赖它进行低风险用途。 (例如,DNS 欺骗更有可能歪曲连接端点。)

高风险用户必须使用类似于TLSIPsecCIPSO(很少见)的东西来验证连接端点,或者在较低层上构建用户身份验证来验证特定连接 (@987654325 @)。

但 TCP 会话的实际内容可以是任何东西——服务器不应依赖 TCP 会话的内容(例如 HTTP 标头)来忠实地报告 IP 地址或其他重要的东西。

【讨论】:

  • 那么,当一个http请求进来时,你是说服务器有不同的方法来检查IP是什么?我认为当时服务器获得的所有内容都是 http 标头 - 我们知道这很容易被欺骗。请澄清...
  • 等一下...等一下...我才意识到我把referer和ip混在一起了...我过去看到的代码示例/sn-ps全部使用 PHP 修改了标头。 (mustap.com/phpzone_post_62_how-to-bypass-the-referer-se)。由于我还读到 IP 也可能不可靠,我认为 IP 可以通过修改 PHP 中的标头以相同的方式进行欺骗。我才意识到这是不可能的。感谢康拉德,明确表示无法做到让我大开眼界。因此,仍然可以伪造 IP,但不像 PHP 那样容易。
  • 服务器会调用getpeername()函数直接从TCP/IP栈中获取连接的IP地址。 PHP 选择通过$_SERVER["REMOTE_ADDR"] 接口将此地址导出到脚本。
【解决方案2】:

IP 地址不能被欺骗。服务器发送回复需要该地址。

PHP 从服务器获取其 $_SERVER 全局的 IP 地址(因此是变量名!),它从协议栈的较低层确定地址。

编辑:

sarnold 提出了一个很好的观点,即原则上可能会破坏路由表以误导流量。 (事实上​​,我相信几年前在亚洲的一级路由器中发生过这样的事件。)所以我应该澄清一下,我的评论“不能欺骗 IP 地址”是为了指出服务器变量将始终如实反映目的地IP。在服务器边界之外发生的事情完全是另一回事。

【讨论】:

  • 顺便说一句,accept 箭头上方的“向上”和“向下”箭头是什么?
  • 它们是允许其他人支持/反对响应的按钮。原始问题同上。
猜你喜欢
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
  • 2017-10-09
  • 2010-11-13
  • 2012-10-09
相关资源
最近更新 更多