【问题标题】:Can $_SERVER['REMOTE_ADDR'] be forged to an arbitrary string?$_SERVER['REMOTE_ADDR'] 可以伪造成任意字符串吗?
【发布时间】:2013-07-14 14:15:50
【问题描述】:

我多次阅读过,使用 $_SERVER['REMOTE_ADDR'] 从客户端获取 IP 是安全的,因为它不能由用户直接修改(只能通过使用代理等),但它总是返回一个 IP。 直到今天,我收到了一封来自我的网站的错误电子邮件,指出查询时发生了 mysql 错误,该错误会检查 IP 是否被禁止。

原始查询如下所示:

SELECT * FROM `bans` WHERE `ip`='{$ip}'

获取ip是使用

$ip = $_SERVER['REMOTE_ADDR']

我没有对 $ip 进行任何清理,因为我认为它不能被用户修改... 我收到一封电子邮件说此查询失败:

SELECT * FROM `bans` WHERE `ip`='1'"+order+by+1--+, 111.222.111.222'

注意:我放的是111.222.111.222而不是攻击者的实际IP)

我的电子邮件脚本还使用 $_SERVER['REMOTE_ADDR'] 获取 IP,所以我也得到了那个“假”IP:

IP: 1'"+order+by+1--+, 111.222.111.222

当你知道它可以修改时,它很容易消毒,但我想知道这怎么可能?

【问题讨论】:

  • 相关问题你查了吗?
  • 你能在服务器访问日志中跟踪这个请求吗?那里的IP地址是什么?
  • 可以,日志中IP正常 - 111.222.111.222 - - [14/Jul/2013:00:04:11 +0200] "POST /somefile.php HTTP/1.0" 200 561 "site.com/some_other_file.php" "Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101
  • 我检查了相关问题,很遗憾没有一个回答我的问题。
  • 所以 - 它不是伪造的。 Q.E.D.

标签: php security mysqli ip code-injection


【解决方案1】:

不,不可能伪造。

您的代码有两个错误。

  1. 清理事情,通过思考变量是否“安全”。虽然您应该格式化您的 SQL 文字,但将思考的负担留给 准备好的语句。
  2. 你有一些妥协的方式来获取 $ip。 $ip$_SERVER['REMOTE_ADDR'] 填充了不安全的方式。您可以在 SO 上找到很多答案来帮助您。

【讨论】:

  • 1.我知道如何清理变量和使用准备好的语句,这不是我的问题。该项目中没有准备好的报表是由于其他一些无关紧要的原因。 2. 如何获取 IP 被盗?查询上方的一行是 $ip=$_SERVER['REMOTE_ADDR'],它们之间没有任何一行可以使它们受到损害。
  • 哦,很遗憾,你没有。
猜你喜欢
  • 2011-08-15
  • 2012-07-08
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 2012-08-26
  • 2021-03-12
  • 2012-06-03
  • 2012-01-01
相关资源
最近更新 更多