我想在我的数据库中存储IP地址,但我还需要在整个应用程序中使用它们.我读到了使用INET_ATON()
和INET_NTOA()
在我的MySQL查询中从IP地址中获取32位无符号整数,这正是我想要的,因为它将比使用char(15)更快地搜索数据库.
问题是,我找不到一个在PHP中做同样事情的函数.我遇到的唯一一件事是:
http://php.net/manual/en/function.ip2long.php
所以我测试了它:
$ip = $_SERVER['REMOTE_ADDR'];
echo ip2long($ip);
Run Code Online (Sandbox Code Playgroud)
它什么也没输出.在他们给它的例子似乎工作,但再次我不确定是否ip2long()
做同样的事情INET_ATON()
.
有人知道这样做的PHP函数吗?甚至是在数据库中存储IP地址的全新解决方案?
谢谢.
在Rails 3中,是否有内置的方法来查看字符串是否是有效的IP地址?
如果没有,最简单的验证方法是什么?
我开发了一个PHP Web服务.我想记录使用此Web服务的WS客户端的所有传入连接.如何获取客户端的IP地址?的价值
$_SERVER['HTTP_CLIENT_IP']
Run Code Online (Sandbox Code Playgroud)
好像总是空着的. 我想知道这是否是匹配以私有IP地址(Perl风格的Regex)开头的字符串的最佳方式:
(^127\.0\.0\.1)|(^192\.168)|(^10\.)|(^172\.1[6-9])|(^172\.2[0-9])|(^172\.3[0-1])
Run Code Online (Sandbox Code Playgroud)
非常感谢!
有没有人知道我可以调用任何开放的RESTful API来将用户的IP地理编码为纬度和经度?
理想情况下,它将类似于:http://google.com/geocode_api/? IP = 1.2.3.4,它将返回纬度和经度.
我注意到有几个Web服务(即Steam,Facebook,Google等)能够检测到新的浏览器/新位置,在某些情况下,要求我使用电子邮件代码对其进行验证.
他们是怎么做到的?他们使用饼干吗?还有其他方法吗?这有多可靠?
如何检测用户是否从"正常"环境登录,无论是同一浏览器,同一台计算机,相同的大致位置?
在Heroku Cedar上,我想获得客户端的IP.第一次尝试:
ENV['REMOTE_ADDR']
Run Code Online (Sandbox Code Playgroud)
当然,这不起作用,因为所有请求都通过代理传递.所以替代方案是使用:
ENV['HTTP_X_FORWARDED_FOR']
Run Code Online (Sandbox Code Playgroud)
但这不太安全,是吗?
如果它只包含一个值,我就拿这个.如果它包含多个值(以逗号分隔),我可以选择第一个值.
但是,如果有人操纵这个价值呢?我不能相信ENV['HTTP_X_FORWARDED_FOR']
,我可以用ENV['REMOTE_ADDR']
.并且我也没有可以使用的可信代理列表.
但总是必须有一些方法来可靠地获取客户端的IP地址.你知道吗?
在他们的文档中,Heroku描述了X-Forwarded-For
"连接到Heroku路由器的客户端的原始IP地址".
听起来好像Heroku可能会X-Forwarded-For
用原始的远程IP 覆盖它.这样可以防止欺骗,对吧?有人可以验证吗?
我最近将我的路由器更改为谷歌为Google Fiber提供的路由器(是的!)现在我注意到当我在本地服务器上开发时检查request.connection.remoteAddress时所看到的内容发生了变化.之前,我曾经看过这个:
request.connection.remoteAddress; // 192.168.1.10
Run Code Online (Sandbox Code Playgroud)
现在我看到了这个:
request.connection.remoteAddress; // ::ffff:192.168.1.10
Run Code Online (Sandbox Code Playgroud)
::ffff:192.168.1.10
实际上是一个IPv6地址或者是IPv4地址?::
?INET_ATON
将它们变成大整数.我是否应该放弃这个并将所有远程地址存储为长度为45个字符的字符串(IPv6地址字符串的最大长度)当我想知道我登录的Solaris机器的IP地址时,我想发出什么命令?
我目前正在寻找一种获取本地IP地址的便携方式.因为我正在使用Boost,我认为使用Boost.Asio来完成这项任务是个好主意.
网上有几个例子可以解决问题.例子:
我只是略微修改了两个代码.Boost.Doc上的代码更改为不解析"www.boost.org",而是"localhost"或我的主机名.为了获取主机名,我使用boost :: asio :: ip :: host_name()或直接键入它作为字符串.
另外,我编写了自己的代码,它是上述示例和我从Boost文档和其他示例中收集的(小)知识的合并.
所有的资源都有效,但他们只返回了以下IP:
127.0.1.1(这不是拼写错误,最后是.1.1)
我运行并使用GCC 4.4.1在Ubuntu 9.10上编译代码
一位同事在他的机器上尝试了相同的代码,得到了
127.0.0.2(也不是一个错字......)
他用GCC 4.4.1编译并运行在Suse 11.0上(我不是100%肯定)
我不知道是否可以更改localhost(127.0.0.1),但我知道我或我的同事都没有这样做.ifconfig表示loopback使用127.0.0.1.ifconfig还找到我要搜索的公共IP(在我的情况下是141.200.182.30,子网是255.255.0.0)
这是一个Linux问题,代码不像我想象的那么便携吗?我是否需要更改其他内容或Boost.Asio根本不能解决我的问题?
我知道在Stackoverflow和其他页面上有很多关于类似主题的问题,但我找不到在我的情况下有用的信息.如果你有了有用的链接,那么如果你能指出我就很好.
PS:这是我在Boost.Doc中使用的修改代码:
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
boost::asio::io_service io_service;
tcp::resolver resolver(io_service);
tcp::resolver::query query(boost::asio::ip::host_name(), "");
tcp::resolver::iterator iter = resolver.resolve(query);
tcp::resolver::iterator end; // End marker.
while (iter != end)
{
tcp::endpoint ep = *iter++;
std::cout << ep << std::endl;
}
Run Code Online (Sandbox Code Playgroud) ip-address ×10
networking ×2
php ×2
regex ×2
boost-asio ×1
c++ ×1
database ×1
geocoding ×1
geolocation ×1
heroku ×1
http ×1
ip ×1
javascript ×1
logging ×1
mysql ×1
node.js ×1
private ×1
solaris ×1
sql ×1
unix ×1
validation ×1
web-services ×1