$_SERVER[';REMOTE_ADDR';]是否可以伪造为任意字符串


Can $_SERVER['REMOTE_ADDR'] be forged to an arbitrary string?

我读过很多次,使用$_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.11.22,而不是攻击者的实际IP)

我的电子邮件脚本还使用$_SERVER['REMOTE_ADDR']获取了一个IP,所以我也在其中获得了"假"IP:

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

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

不,这是不可能伪造的。

你的代码有两个错误。

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