【问题标题】:Convert CGI REMOTE_ADDR to network byte order for use with MySql INET_NTOA将 CGI REMOTE_ADDR 转换为网络字节顺序以用于 MySql INET_NTOA
【发布时间】:2011-09-29 17:47:04
【问题描述】:

我正在尝试记录对脚本的请求,并且我想将客户端的 IP 地址存储在 int(4) 列中,并使用 INET_NTOA() 在可读函数中返回它。

然而,在我的 Perl CGI 脚本中,$ENV{REMOTE_ADDR} 包含一个主机字节顺序的 IP,当使用 INET_ATON() 函数输入数据库时​​,它被错误地转换,所以当我把它拉回来时,我有一个完全不同的地址。

#!usr/bin/perl -wT

use strict; 
use CGI;
use DBI;

my $dbh = DBI->connect("DBI:mysql:$db:$server", "$user", "$password");
my $addr = $ENV{REMOTE_ADDR};

my $insert = $dbh->prepare(qq[insert into access_log (ipaddress) 
                                     values (INET_ATON('$addr'))]);  

$insert->execute or die "sql insert error";

my $retrieve = $dbh->prepare(qq[select INET_NTOA(ipaddress) as IP_Address 
                                from   access_log]);

$retrieve->execute or die "sql select error";
my $newIP = $retrieve->fetchrow_array;

理想情况下,此脚本应返回 $addr 的值,但我得到的却完全不同。如何在将$addr 放入数据库之前对其进行格式化?

感谢您的帮助。

【问题讨论】:

  • TRWTF 是 2011 年编写的纯 IPv4 代码。重新考虑您对 IP 地址数据存储的选择。

标签: mysql perl cgi environment-variables ip-address


【解决方案1】:

我发现不需要更改 $ENV{REMOTE_ADDR}。

通过对我的 ip_address 列使用 int(4) 无符号,inet_aton() 和 inet_ntoa() 可以正常工作。有符号整数,

“第一个八位字节大于 127 的 IP 地址对应的值无法正确存储”,因此数据在插入阶段会失真。

http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-ntoa

【讨论】:

    【解决方案2】:

    奇怪。 ENV var 应该是正常的点分四进制表示法,而不是原始整数。不应该是$ENV{'REMOTE_ADDR'}吗?

    请注意,您的 INT 列应该是无符号的。 inet_ntoa() 不喜欢负数,如果将其存储在有符号的 int 字段中,一半的 IP 地址空间将显示为负数。

    【讨论】:

    • 这是普通的点分四进制表示法,但 mysql 中的 INET_ATON() 函数将其转换为整数,这就是它的存储方式。至于您的其他问题,它可以在没有单引号的情况下使用。不知道这样做是否不好。
    • @WillReese:Barewords 可以用作哈希键。
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 2015-06-28
    • 2023-03-11
    相关资源
    最近更新 更多