我多次读过,使用 $_SERVER['REMOTE_ADDR'] 从客户端获取 IP 是安全的,因为它不能由用户直接修改(只能通过使用代理等),但它总是返回一个 IP。直到今天,我收到了一封来自我的站点的错误电子邮件,指出查询时发生了 mysql 错误,该错误会检查 IP 是否被禁止。
原始查询看起来像这样:
SELECT * FROM `bans` WHERE `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
当您知道可以对其进行修改时,它很容易消毒,但我想知道这怎么可能?