我使用多种服务来接受虚拟货币之类的移动支付。
许多公司将在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请求?
答案 0 :(得分:4)
其他答案不正确。所以我会写自己的。
exceedingly rare situations除外,REMOTE_ADDR
100%值得信任。它来自与服务器的TCP连接,因此实际上不可能在没有实际损害网络上的某些东西(如IP所属的路由器)或没有服务器配置错误的情况下进行伪造(严重的是,Apache甚至不会让您错误配置它那样的。)
所以,我可以看到两个问题:
是
如果PHP中的REMOTE_ADDR
变量表明请求来自他们的服务器,那么它来自他们的服务器。
如果您使用的是远程代理,则X-HTTP-FORWARDED-FOR
不可信任。如果你不小心,那就是你可以遇到问题的地方。
否!!! 强>
forge an MD5 signature比伪造IP地址(要求你破坏特定的网络硬件)要容易得多。如果攻击者破坏了网络硬件,那么游戏无论如何。
最好的解决方案是三折:
将HTTPS与证书固定结合使用
在您的应用上,存储其服务器的公钥。然后强制对等验证使用该证书。这意味着攻击者需要窃取远程服务器的证书才能连接。
验证IP地址
使用REMOTE_ADDR
使用HMAC + SHA2签署请求
将HMAC与SHA-256或SHA-512一起使用。
但是,仅凭IP检查是非常安全的。
为了更深入,我们需要研究你正在进行哪种类型的攻击。</ p>
答案 1 :(得分:1)
依赖服务器远程地址不是一种安全的方式,因为IP欺骗可能会破坏安全性。
但是,有些方法可以防止它像机器之间的密钥交换,但仍然无法保证。
最好不要依赖基于IP的安全性。