PHP安全问题

时间:2014-11-26 18:07:38

标签: php security

我使用多种服务来接受虚拟货币之类的移动支付。

许多公司将在POST或GET回调中包含MD5签名,我可以计算该签名以验证请求是否真实,然后用购买的积分奖励用户。

这种方法非常安全,因为几乎不可能猜出签名。

其他公司不会提供签名,只需告诉我检查来电是否来自他们的服务器IP,如下面的代码:

<?php 

  if(!in_array($_SERVER['REMOTE_ADDR'],array('xxx.xx.x.xx'))) {
     header('HTTP/1.0 403 Forbidden');
     die('Error: Unknown IP');
  }

?>

这个IP检查是否足够安全?现在是不是很容易欺骗IP地址并使用该IP发出GET或POST请求?

2 个答案:

答案 0 :(得分:4)

其他答案不正确。所以我会写自己的。

exceedingly rare situations除外,REMOTE_ADDR 100%值得信任。它来自与服务器的TCP连接,因此实际上不可能在没有实际损害网络上的某些东西(如IP所属的路由器)或没有服务器配置错误的情况下进行伪造(严重的是,Apache甚至不会让您错误配置它那样的。)

所以,我可以看到两个问题:

信任REMOTE_ADDR

是否安全

如果PHP中的REMOTE_ADDR变量表明请求来自他们的服务器,那么它来自他们的服务器。

如果您使用的是远程代理,则X-HTTP-FORWARDED-FOR 不可信任。如果你不小心,那就是你可以遇到问题的地方。

请求的MD5()比REMOTE_ADDR验证更安全

否!!!

forge an MD5 signature比伪造IP地址(要求你破坏特定的网络硬件)要容易得多。如果攻击者破坏了网络硬件,那么游戏无论如何

什么是最佳解决方案?

最好的解决方案是三折:

  1. 将HTTPS与证书固定结合使用

    在您的应用上,存储其服务器的公钥。然后强制对等验证使用该证书。这意味着攻击者需要窃取远程服务器的证书才能连接。

  2. 验证IP地址

    使用REMOTE_ADDR

  3. 使用HMAC + SHA2签署请求

    将HMAC与SHA-256或SHA-512一起使用。

  4. 但是,仅凭IP检查是非常安全的。

    为了更深入,我们需要研究你正在进行哪种类型的攻击。<​​/ p>

答案 1 :(得分:1)

依赖服务器远程地址不是一种安全的方式,因为IP欺骗可能会破坏安全性。

但是,有些方法可以防止它像机器之间的密钥交换,但仍然无法保证。

最好不要依赖基于IP的安全性。