如何在IPv4 PHP中处理IPv6地址

Ale*_*lan 3 php mysql ip ipv6

我是一名iphone开发者 - 网络开发者的新手,所以请耐心等待!
我目前正在使用MAMP进行本地测试.

我的网站上有一个高度安全的部分.除了需要用户/通行证 - 它还会检查用户的IP.如果以前未使用该IP帐户,则会将该IP以及唯一ID添加到保留表中,并向用户发送电子邮件,要求确认从该位置访问其帐户.

如果用户登录,并且他们的IP与我的"允许"表中与其用户ID关联的任何IP都不匹配,则执行上述任务,他们会收到一封电子邮件.

我用来生成他们点击的链接的URL的代码看起来有点像这样:

if (preg_match('/^127./',$ip)) {
    // accessed from this machine
    $val_url = "http://localhost:8888/mywebsite/admin/aproove_ip.php?email=$admin_email&val=$hash";
}
else if (preg_match('/^192\.168./',$ip)) {
    // accessed form a local networked computer
    $val_url = "http://super.local:8888/mywebsite/admin/aproove_ip.php?email=$admin_email&val=$hash";
    // note super.local is my machine's address, 8888 is MAMP port
}
else {
    // accessed from the WWW
    $val_url = "http://www.mywebsite.com/admin/aproove_ip.php?email=$admin_email&val=$hash";
}
Run Code Online (Sandbox Code Playgroud)

现在,这在我的计算机上进行测试时非常有效.

但是,我决定(不要问为什么)从我的iPod Touch和它发送给我的电子邮件(验证IP)进行测试,它给了我完整的在线地址,好像它是从WWW访问的(即两者都没有)对正则表达式的满意度).我查看了包含请求的保留表,并且请求的IP是:fe80::da30:62ff:fe18:6681.

我猜那是ipv6? - 我需要知道的是以下内容:

  • 我应该期望ipv6 addressess在我的网站上线时点击我的网站吗?
  • 如何判断它是否是本地请求(如我的正则表达式为192.168 ......和127 ......)

我非常感谢任何有关这方面的建议,因为我觉得它真的令人困惑

Ken*_*ins 7

如果要确保不发生IPv6连接,可以添加Listen 0.0.0.0:80到apache配置.但大多数web主机不支持IPv6,但无论如何(雅,我知道,我们是在2011年),因此它不太可能,人们甚至可以通过IPv6连接到你.你看到这个的唯一原因是因为bonjour(.local地址工作的原因)在IPv6上运行.

如果您想准备好IPv6代码,几乎不需要进行任何更改,因为大多数IP PHP功能都可以在IPv4和IPv6上运行.我记得的唯一变化是将MySQL表中的varchar数据类型增加到IPv6地址的最大长度(39).

我不知道该IPv6播放由同样的规则子网是IPv4的做法,但我希望这将是一个相当有点难以验证的IPv6地址是本地的.

编辑:

fe80::/10 看起来是本地链接地址,它可能就像检查前4位数一样简单.

  • 您不应该使用varchar来存储IP地址 - 无论是v4还是v6.它会阻止您使用位掩码有效地查询它们,并浪费大量存储空间.请使用INET_ATON()和INET_NTOA()在MySQL中存储和检索(分别)IP地址. (3认同)
  • 对于在一般应用程序中存储IP的大多数用途仅仅是跟踪用户,并且由于MySQL不能证明以可读方式存储IP的本地方式,因此我通常只是为了方便而使用varchar(特别是当它可能是IPv6或IPv4时) . (2认同)