这是提交表单时获取IP的正确方法吗?

Is this the right way to grab IP when form submitted?

我确实找到了一些关于保存 IP 的信息,我想出了下面的代码:

// IP GRAB
$http_client_ip = $_SERVER['HTTP_CLIENT_IP']; //MORE RELIABLE IP
$http_x_forwarded_for = $_SERVER['HTTP_X_FORWARDED_FOR']; //ALSO MORE RELIABLE
$remote_addr = $_SERVER['REMOTE_ADDR']; //NOT RELIABLE BCS IT MAY BE A SHARED NETWORK OR BEHIND A PROXY

if (!empty($http_client_ip)) {
    $ip_address = $http_client_ip;
} else if (!empty($http_x_forwarded_for)) {
    $ip_address = $http_x_forwarded_for;
} else {
    $ip_address = $remote_addr;
}

$ip = ip2long($ip_address);

我想在用户推送提交 button/sent 表单时获取用户的 IP 地址。我也想把这个IP保存到数据库上的table。所以我在 table 上创建了一个 IP 列作为 INT(11) UNSIGNED(这是推荐给其他人的。)

简而言之:我做对了吗?

您的代码可以扩展,可以使用以下函数获取客户端IP:

function get_client_ip() {

    $ipaddress = '';
    if ($_SERVER['HTTP_CLIENT_IP'])
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    else if ($_SERVER['HTTP_X_FORWARDED_FOR'])
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    else if ($_SERVER['HTTP_X_FORWARDED'])
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
    else if ($_SERVER['HTTP_FORWARDED_FOR'])
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
    else if ($_SERVER['HTTP_FORWARDED'])
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
    else if ($_SERVER['REMOTE_ADDR'])
        $ipaddress = $_SERVER['REMOTE_ADDR'];
    else
        $ipaddress = 'UNKNOWN';

    return $ipaddress;
}

也没有必要将您的 IP 更改为长 IP (ip2long),除非您有理由这样做。

我会将其保存为数据库中的字符串 (VARCHAR)。

这是我经过更多搜索后得出的结果:

我把INT(11)UNSIGNED改成了VARCHAR(45),我只是保存了IP,没有使用ip2long();,其余的和以前一样。现在,当我 post 测试时,它会将 ::1 添加到 table 的 IP 列。我认为它工作正常,我会在实际发布网站时检查它。

注意:当这个答案可用时,我会接受它。谢谢你的时间。