0

我多次读过,使用 $_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

当您知道可以对其进行修改时,它很容易消毒,但我想知道这怎么可能?

4

1 回答 1

0

不,这是不可能伪造的。

您的代码有两个错误。

  1. 您确实通过思考变量是否“安全”来对事物进行消毒。虽然您应该格式化您的 SQL 文字,但将思考的负担留在准备好的语句上。
  2. 你有一些妥协的方式来获得 $ip。要么填写不安全的方式$ip$_SERVER['REMOTE_ADDR']您可以在 SO 上找到很多答案来帮助您。
于 2013-07-14T14:31:17.800 回答