2017-01-03 3 views
1

Einfache PHP-Form.Ist es möglich, die PHP-Formularübertragung auf eine Region/ein Land zu beschränken?

Kann die Formularübertragung auf eine bestimmte Region/ein bestimmtes Land beschränkt werden? Wenn ja, wie?

In diesem Fall die USA.

Ich kann nichts im Zusammenhang damit finden. Alles, was ich finde, ist das Beschränken von Double-Submit oder das Verwenden von Captchas.

Ja, ich habe ein CAPTCHA, aber Menschen kommen um es herum. Ich ziehe bereits die Benutzer IP, kann ich das gegen eine Datenbank irgendwo überprüfen? Oder ziehe mehr als nur die IP und laufe strpos() dagegen?

Ich möchte das Formular für jeden in den USA arbeiten, aber eine Meldung anzeigen, wenn der Benutzer nicht in den USA befindet. Oder möglicherweise ein stärkeres, nervigeres Captcha anzeigen.

Ich kann Domänen in in einigen Fällen überprüfen, aber Domänen allein sind nicht spezifisch genug.

+0

Dies ist nicht zuverlässig möglich. Es gibt einige Optionen, aber sie sind alle vage und liefern falsche positive und negative Ergebnisse. – arkascha

+0

Maxmind GeoIP bietet dies und hat eine kostenlose "Lite" -Version, aber sie wird niemals perfekt sein und ist natürlich mit einem Proxy-Dienst oder einem US-basierten VPN zu besiegen. https://www.maxmind.com/en/home –

+0

Ich realisiere * nichts * wäre perfekt, weil Proxies existieren. Aber auch ein kleiner Schritt wäre von Vorteil. – Scott

Antwort

2

Sie dies mit einem GeoIP API tun könnte wie freegeoip.net. Während die oben erwähnte API Ergebnisse in anderen Formaten liefern kann, bevorzuge ich JSON, da es in PHP einfacher zu handhaben ist.

freegeoip.net/json/{IP_or_hostname} 

Mit diesem können Sie

$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. 
} 

bearbeiten tun:

Wenn Sie wirklich schwer sperren wollte, dann könnte man auch ein Tool wie https://getipintel.net/#API verwenden für Proxies zu überprüfen. Aus meiner Erfahrung ist es ziemlich genau; Aber das wird VPNs in einem privaten ISP-Block nicht stoppen.

1

können Sie die geoip library verwenden, um Informationen über die IP des Benutzers zu erhalten, die Ihre Website besucht:

$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); 

Sie das GeoLite Bibliothek herunterladen müssen (das ist kostenlos) aus http://dev.maxmind.com/geoip/legacy/install/city/

MaxMind gab auch eine neuere Version der GeoIP-Lib des php heraus, die GeoIP2-php hieß und hier zu finden ist: http://maxmind.github.io/GeoIP2-php/ Die Datenbank für GeoIP2 kann hier heruntergeladen werden: http://dev.maxmind.com/geoip/geoip2/geolite2/

Die GeoIP2 lib ist objektorientiert:

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 
Verwandte Themen