简单的PHP表单。
是否可以将表单提交限制在特定区域/国家/地区?如果是,如何?
在这种情况下是美国。
我无法找到与此相关的任何内容。我发现的所有内容都限制了双重提交或使用验证码。
是的,我有一个CAPTCHA,但人类绕过它。我已经拉动了用户IP,我可以在某个地方检查数据库吗?或者拉不仅仅是IP并对它运行strpos()
?
我希望该表单适用于美国境内的任何人,但如果用户不在美国,则会显示一条消息。或者可能会显示更强大,更烦人的验证码。
我可以检查某些情况中的域名,但仅域名不够具体。
答案 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