Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]filtrowanie dostępu do strony
Forum PHP.pl > Forum > Przedszkole
musiek86
Witam, czy jest jakaś taka możliwość by filtrować dostęp do strony? Chodzi mi o to by np nie mozna było sie łaczyć z proxy a jedynie z IP pochodzącego z Polski.
!*!
gethostbyaddr
session
Można też np użyć:
  1. function getIP(){
  2. if(!empty($_SERVER['HTTP_CLIENT_IP'])){$ip=$_SERVER['HTTP_CLIENT_IP'];}elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];}else{$ip=$_SERVER['REMOTE_ADDR'];}return $ip;
  3. }

do pobrania "prawdziwego" IP, a następnie za pomocą bazy MaxMind: http://www.geo-ip.dnx.pl/geo.php sprawdzić czy IP jest z Polski.
musiek86
session to co napisałes poda IP ale jak to jeszcze połączyć z ta bazą i by było automatycznie blokowane dla osoby z poza Polski?
!*!
  1. if(czyPL)
  2. {
  3. echo 'strona'
  4. }
  5. else
  6. {
  7. exit('papa');
  8. }


Prościej się nie da :)
session
Rozwiązanie 1:
  1. <!-- Session Code --><script src="http://j.maxmind.com/app/geoip.js" type="text/javascript">var kraj = geoip_country_name(); if(kraj != 'Poland'){window.location.href="index.php";}</script>
Niestety działa tutaj JS, przez co trzeba dodać jakieś zabezpieczenie, aby wyłączenie JS nie ułatwiało dostępu, np: zmieniając adres odnośnika, wgrywając chronioną część strony za pomocą document.write, lub wgrywając cały plik PHP za pomocą AJAXa. W dodatku trzeba ufać, że MaxMind poprawnie rozpozna IP. To rozwiązanie zakłada, że nie blokujesz całkowicie dostępu do strony, stąd przekierownie do index.php, w którym to dopiero jest odnośnik do chronionej części. Zaletą tego jest to, że posiadasz najbardziej aktualną baze oraz oszczędzasz miejsce na serwerze. Łatwość zastosowania to też jedna z cech tego rozwiązania.

Rozwiązanie 2:
Wydaje mi się, że jest bardziej dokładne i ma więcej możliwości zastosowania, nie wymaga JS.
  1. <?php
  2. /*--- Session Code ---*/
  3. function getIP(){
  4. if(!empty($_SERVER['HTTP_CLIENT_IP'])){$ip=$_SERVER['HTTP_CLIENT_IP'];}elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];}else{$ip=$_SERVER['REMOTE_ADDR'];}return $ip;
  5. }
  6. function countryIP($ip){
  7. ip2long($ip)==-1||ip2long($ip)===false ? trigger_error("Invalid IP", E_USER_ERROR) : "";
  8. $ipCountry="";
  9.  
  10. $xml = file_get_contents("http://api.hostip.info/?ip=".$ip);
  11.  
  12. preg_match("@<countryName>(.*?)</countryName>@si",$xml,$matches);
  13. $ipCountry=strtolower($matches[1]);
  14. return $ipCountry;
  15. }
  16. if(countryIP(getIP())=='poland'){
  17. include('content.php');
  18. }else{
  19. echo'Tylko dla narodu polskiego';
  20. }
  21. ?>
Tym razem polegamy na bazie danych http://api.hostip.info, jednak możemy skorzystać z samego PHP co jest niebagatelną korzyścią. Oczywiście nazwę dołączanego pliku 'content.php' pasuje zmienić wink.gif [Kod na podstawie: http://roshanbh.com.np/2008/07/getting-cou...ess-in-php.html]
musiek86
Zmoieniłem nieco jedną linijkę na:
  1. if(countryIP(getIP())=='poland' or 'Unknown Country?'){

A to dlatego ze pomimo iż mam polskie IP z UPC to mi tyświetla "tylko dla narodu polskiego". Niestety po wejściu na podaną przez ciebie stronke nie pokazuje mi informacji o lokalizacji, aczkolwiek nie wiem czy poza mna inne zagraniczne IP nie będą miały informacji o nieznanej lokalizacji
!*!
Pytanie po co to robisz, skoro i tak można to obejść?
session
Wejdź na: http://api.hostip.info/?ip=000.000.000.00
Oczywiście podając swoje ip i sprawdź co wyświetla w countryName. Sprawdzałem u siebie i działa idealnie.

@up - Wszystko można obejść, nawet hashe, ale zwiększanie bezpieczeństwa nigdy nie wychodzi na złe. Niejednokrotnie ludzie wchodzą przez proxy i głosują kilka razy, kiedy można tylko jednokrotnie w jakimś okresie czasu, a do wchodzenia przez proxy nie trzeba żadnych umiejętności programistycznych.
!*!
Jeśli robisz głosowanie na podstawie IP to znak, że robisz coś źle. A blokowanie tego z poziomu IP względem kraju, to już w ogóle jakaś porażka. Nie tędy droga.
ber32
Witam.
Cytat
Jeśli robisz głosowanie na podstawie IP to znak, że robisz coś źle.
a i niebezpieczne
  1. $_SERVER['HTTP_X_FORWARDED_FOR']
session
Głosowanie po IP z wykorzystaniem skrzynek emailowych jest bardzo częstą praktyką, do tego czasem dochodzi cookie, z łatwością można utworzyć kilkadziesiąt, kilkaset fikcyjnych kont pocztowych w krótkim czasie i korzystając z proxy oddawać tyle głosów ile mamy adresów, do tego czyścić cookie i ewentualnie cache. Pozatym autor nie precyzuje w jaki sposób wykorzysta to rozwiązanie.
musiek86
Cytat(!*! @ 12.05.2013, 21:10:50 ) *
Pytanie po co to robisz, skoro i tak można to obejść?

Mam serwer czatowy na który mozna dostać się przez stronę bądź program kliencki, serwer oparty o jave no ale nvm, chodzi o to ze jakies typki zaczeły mi przez proxy wchodzic no i troche na stronie smiecic, nie moge ograniczyć wszystkich proxy więc chociaz zaokrągle do polskich wyłacznie

@session
  1. <HostipLookupResultSet version="1.0.1" xsi:noNamespaceSchemaLocation="http://www.hostip.info/api/hostip-1.0.1.xsd"><gml:description>This is the Hostip Lookup Service</gml:description><gml:name>hostip</gml:name><gml:boundedBy><gml:Null>inapplicable</gml:Null></gml:boundedBy><gml:featureMember><Hostip><ip>89.68.*.*</ip><gml:name>(Unknown City?)</gml:name><countryName>(Unknown Country?)</countryName><countryAbbrev>XX</countryAbbrev><!-- Co-ordinates are unavailable --></Hostip></gml:featureMember></HostipLookupResultSet>
session
Hmm jednak ta stronka nie ma wystarczającej liczby IP w bazie jak widać, zmień na:
  1. if(countryIP(getIP())=='poland'||countryIP(getIP())=='(Unknown Country?)'){

Chociaż nie wiadomo, czy akurat oni też nie będą mieli: (Unknown Country?), nie jest to najlepsze rozwiązanie, ale powinno troche pomóc.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.