需要有关在PHP中获取NAT后面的IP地址的建议

时间:2014-04-30 07:38:26

标签: php ajax json jsonp ip-address

我在这里尝试实现的是获取连接到具有公共IP地址的计算机的计算机的本地IP地址。

我们有带有公共IP地址的服务器(让我们说X)。我们办公室还有15台计算机,带有本地IP地址(192.168.20 ....)。我想知道哪台电脑在我们的系统上有所改变。我们都在公共IP Y上网。我们都知道$_SERVER['REMOTE_ADDR']我只能获得地址Y,但无法获得本地IP地址(192.168.20.N)。

所以我已在其中一台本地计算机上安装了网络服务器,然后我将ajax(jsonp)请求发送到该本地计算机,我获得了计算机的本地IP地址而不是发送每个请求中公共服务器的IP地址。一切正常,我可以获得本地和公共IP地址。 但我想知道是否有更好的方法可以做到这一点?

这是我的 test.js 脚本

$(document).ready(function(){
    var _ip = '';
    $.ajax({
        url: 'http://192.168.20.24/getIP.php', //local machine
        dataType: 'jsonp',
        success: function(response){
            _ip = response;
            $.ajax({
                url: 'getIP.php', //public address
                type: 'POST',
                dataType: 'json',
                data: {
                    ip: _ip
                },
                dataType: 'json',
                success: function(response){
                    $('#local').html(response.local);
                    $('#public').html(response.public);
                }
            })
        }
    });

});

本地getIP.php

header('content-type: application/json; charset=utf-8');
echo $_GET['callback'] . '('.json_encode($_SERVER['REMOTE_ADDR']).')';

public getIP.php

echo json_encode(array('local' => $_POST['ip'], 'public' => $_SERVER['REMOTE_ADDR']));

提前致谢

注意: 代码仅用于测试目的。

2 个答案:

答案 0 :(得分:3)

IP地址信息绝不能用于身份验证。这是不安全的。点。

如果要对人员甚至计算机进行身份验证,请使用身份验证系统。基于用户名/密码,或基于公钥/私钥的身份验证系统,请记住..

答案 1 :(得分:1)

Javascript在HTTP级别运行,因此在Javascript世界中没有IP地址这样的东西。

您设计的is widely used解决方法,我认为,它是获取客户私人地址的唯一途径。 As hek2mgl advises,这个解决方案确实是不安全的,尽管在您的情况下,关注点不太重要,因为您似乎完全控制了客户端,服务器和网络之间的连接。

要获得真正安全的解决方案,请使用client certificates。我知道你并不真正关心客户端的IP地址本身,但只想将它们用作身份验证的平均值(或者仅仅是识别?:D)。


配置并非微不足道,但也不是火箭科学。这是a nice tutorial(Apache)。它假定使用由公共证​​书颁发机构颁发的证书,但您可以生成并使用自己的自签名证书(tutorial 1tutorial 2