是否可以将PHP表单提交限制到某个地区/国家/地区?

时间:2017-01-03 18:19:07

标签: php forms

简单的PHP表单。

是否可以将表单提交限制在特定区域/国家/地区?如果是,如何?

在这种情况下是美国。

我无法找到与此相关的任何内容。我发现的所有内容都限制了双重提交或使用验证码。

是的,我有一个CAPTCHA,但人类绕过它。我已经拉动了用户IP,我可以在某个地方检查数据库吗?或者拉不仅仅是IP并对它运行strpos()

我希望该表单适用于美国境内的任何人,但如果用户不在美国,则会显示一条消息。或者可能会显示更强大,更烦人的验证码。

我可以检查某些情况中的域名,但仅域名不够具体。

2 个答案:

答案 0 :(得分:2)

您可以使用geoIP API(例如freegeoip.net)执行此操作。 虽然上面提到的API可以提供其他格式的结果,但我更喜欢使用JSON,因为它在PHP中处理起来更简单。

freegeoip.net/json/{IP_or_hostname}

有了这个,你可以做到

$geoipjson = json_decode(file_get_contents("http://www.freegeoip.net/json/" .$_SERVER["REMOTE_ADDR"]));
$country = $geoipjson->country_code;
if(!$country == "US") {
    die("Sorry, this form is not available for non-US users.");
}
else {
    // PHP handling goes here.
}

编辑:

如果你想真的很难锁定,那么你也可以使用像https://getipintel.net/#API这样的工具来检查代理。根据我的经验,这是非常准确的;但这不会阻止住宅ISP区块上的VPN。

答案 1 :(得分:1)

您可以使用geoip library获取有关访问您网站的用户的IP信息:

$gi = geoip_open("/usr/local/share/GeoIP/GeoIP.dat",GEOIP_STANDARD);

echo geoip_country_code_by_addr($gi, "24.24.24.24") . "\t" .
     geoip_country_name_by_addr($gi, "24.24.24.24") . "\n";

echo geoip_country_code_by_addr($gi, "80.24.24.24") . "\t" .
     geoip_country_name_by_addr($gi, "80.24.24.24") . "\n";

geoip_close($gi);

您需要从http://dev.maxmind.com/geoip/legacy/install/city/

下载GeoLite库(免费)

MaxMind还发布了一个更新版本的php的GeoIP lib,它名为GeoIP2-php,可以在这里找到:http://maxmind.github.io/GeoIP2-php/ GeoIP2的数据库可从此处下载:http://dev.maxmind.com/geoip/geoip2/geolite2/

GeoIP2 lib是面向对象的:

use GeoIp2\Database\Reader;

// This creates the Reader object, which should be reused across
// lookups.
$reader = new Reader('/usr/local/share/GeoIP/GeoIP2-City.mmdb');

// Replace "city" with the appropriate method for your database, e.g.,
// "country".
$record = $reader->city('128.101.101.101');

print($record->country->isoCode . "\n"); // 'US'
print($record->country->name . "\n"); // 'United States'
print($record->country->names['zh-CN'] . "\n"); // '美国'

print($record->mostSpecificSubdivision->name . "\n"); // 'Minnesota'
print($record->mostSpecificSubdivision->isoCode . "\n"); // 'MN'

print($record->city->name . "\n"); // 'Minneapolis'

print($record->postal->code . "\n"); // '55455'

print($record->location->latitude . "\n"); // 44.9733
print($record->location->longitude . "\n"); // -93.2323