Avatar billede akyhne Nybegynder
04. marts 2008 - 17:29 Der er 34 kommentarer og
2 løsninger

Check IP pr sekund.

Hej derude.

Jeg mangler en funktion til at checke om besøgende har mere end f.eks 5 sidevisninger pr. sekund.
I så fald bannes IP adressen og tilføjes en liste.
Besøgende fra denne liste smides på en eller anden måde af, eller redirigeres.
Avatar billede akyhne Nybegynder
04. marts 2008 - 17:33 #1
Mit problem relaterer i øvrigt til dette problem: http://www.seo-blackhat.com/article/someone-is-scraping-me.html
Avatar billede jakobdo Ekspert
04. marts 2008 - 19:09 #2
Du skal vel lave noget i stil med:

Første besøg:
if(!isset($_SESSION['ip'])){
$_SESSION['ip'] = $_SERVER['remote_addr'];
$_SESSION['visit'] = 1;
$_SESSION['time'] = time();
}

andet forsøg:

if(isset($_SESSION['time']){
$_SESSION['visit']++;
if(time() - $_SESSION['time']) < 5 && $_SESSION['visit'] > 5){
echo 'Farvel';
exit();
}
}

Utestet og skal nok tilpasses! :o)
Avatar billede showsource Seniormester
04. marts 2008 - 20:09 #3
Jeg ville nok bruge DB, da en idiot sikkert ikke vil tillade cookies.
Og selvf. sikrer hver eneste formular med spam posts.

Men det er nok umuligt at "total stoppe" adgangen for idioter.
Avatar billede akyhne Nybegynder
04. marts 2008 - 22:36 #4
showsource: Kan du uddybe? Hvad siger I til denne: Redelegere vedkommende til en side hos mig selv der indeholder 1000 includes eller lignende med vedkommendes egen IP? Vil det genere ham?
Avatar billede olebole Juniormester
05. marts 2008 - 00:26 #5
<ole>

Hvormange sider besøger GoogleBotten på hvor kort tid? Måske, man skulle passe lidt på(?)  :)

/mvh
</bole>
Avatar billede akyhne Nybegynder
05. marts 2008 - 17:23 #6
Jeg er nok klar over at "lovlige" robotter kan blive ramt, men jeg har IP områderne for de vigtige.
Avatar billede showsource Seniormester
05. marts 2008 - 19:25 #7
Uddybe ->
I stedet for at bruge sessions, ville jeg gemme i DB.

Og ellers, hvis der èn bestemt ip som fucker, så er det jo ikke noget problem.
Men at "lukke ude" er ret svært, hvis det ikke skal gå ud over uskyldige.
Og om det er en søgerobot, der kan man jo "gå videre" i scriptet, hvis man ellers kan identificere en søgerobot.
Avatar billede showsource Seniormester
05. marts 2008 - 19:36 #8
O.b.t.w. hvis din side ligger på en Apache og du kan bruge .htaccess, kan du lave en fil  hvor "bad" ip'er er defineret, og på den måde lukke af for bestemte ip-adresser.
Avatar billede akyhne Nybegynder
05. marts 2008 - 22:05 #9
showsource: Det kunne være en midlertidig løsning. Hvordan skrives det i .htaccess? Hvad sker der for brugere som er bannede?
Avatar billede showsource Seniormester
06. marts 2008 - 05:42 #10
Well, nu kan jeg selvf. ikke finde ex. med ip'er i en fil, som apache vil kikke efter ved request.
Og man kan jo også spørge sig selv om det er en løsning, at gemme ip'er i en fil.
Anyway, i en .htaccess kan du putte flg.

ErrorDocument 403 /403.php
Deny from 127.0.0.1 83.221.136.33 192.0

ErrorDocument fortæller hvilken fil som vises ved Forbidden ( 403 )
Sørg blot for at den har en vis størrelse i bytes, for at IE vil vise den.

Deny from ......
er forskellige ip'er, adskilt af et mellemrum, som IKKE må se indhold.
Det er ikke nødvendigt at skriveden fulde ip adresse, dele aF den er nok.
( 192.0 alle med en ip der starter med 192.0 nægtes adgang )
Avatar billede showsource Seniormester
06. marts 2008 - 06:22 #11
Ehh, det med at bruge en fil med ip-adresser, var selvf. sammen med noget mod_rewrite !!!

http://httpd.apache.org/docs/2.2/misc/rewriteguide.html#access
Avatar billede akyhne Nybegynder
06. marts 2008 - 07:49 #12
Se, det der er mit problem er følgende: Jeg lavede i sin tid en tæller på siden. Jeg ønskede ikke at min egen IP, samt søgerobotters besøg blev talt med. Det lavede jeg en funktion til hvor jeg efterhånden har en del

AND substr($_SERVER["REMOTE_ADDR"],0,7) <> "66.249."
og..
AND $_SERVER["REMOTE_ADDR"] <> "xxx.xxx.xxx.xxx"

Det er ved at være lidt uhensigtsmæssigt med alle de AND led. Hvis jeg får falsk returneret, tælles siderne ikke med.

Samtidig lavede jeg en funktion hvor jeg redelegerer folk til min egen 404 side, hvis variablerne efter ? ikke henviser til en eksisterende side (findes efter databaseværdier). I den sender jeg samtidig en mail til en af mine mailadresser med værdierne for de forskellige variabler. Det har jeg lavet for at kunne se hvad der går galt. Det viser sig så at ID=http.//enellerandenadresse.com/nogleværdier, som så siger mig at han prøver at lave noget fusk.
Derfor får jeg 5-20 gange om ugen 10-50 mails inden for få sekunder fra 1-3 af ip adresserne i mit link 04/03-2008 17:33:42
Avatar billede jakobdo Ekspert
06. marts 2008 - 08:09 #13
Det bør du lave en database til.

ip_start:
ip_slut:

Og så skal du bruge INET_ATON og INET_NTOA
Så kan du nøjes med en WHERE inet_aton('.$_SERVER['remote_addr'].') between ip_start AND ip_slut
Avatar billede akyhne Nybegynder
06. marts 2008 - 21:14 #14
jakobdo: Kan du ikke skære det lidt mere ud for mig?
Avatar billede jakobdo Ekspert
06. marts 2008 - 21:22 #15
Du kunne lave en tabel til at håndtere disse ip'er!
En ip som f.eks. 127.0.0.1 ville så være:

ip_start 127.0.0.1 og ip_slut 127.0.0.1

Og for ikke at gemme 127.0.0.1, kan du bruge inet_aton('127.0.0.1') som giver en INT værdi tilbage.
Den fylder mindre når den gemmes i databasen og er nemmere at lave beregninger på.
Avatar billede akyhne Nybegynder
18. marts 2008 - 17:22 #16
jakobdo og showsource: Smid et svar. Indtil videre bruger jeg bare en .htaccess fil.
Avatar billede jakobdo Ekspert
18. marts 2008 - 20:50 #17
Svar!
Avatar billede showsource Seniormester
18. marts 2008 - 22:30 #18
Ok
Avatar billede olebole Juniormester
19. marts 2008 - 01:28 #19
<ole>

Du kunne også inkludere et dokument med et hash-table, som giver en lynhurtig søgning og ikke belaster databasen:

<?php
$banned = array(
    "127.0.0.1" => 1,
    "127.0.0.3" => 1,
    "127.0.0.5" => 1,
    "127.0.0.8" => 1
);

if ($banned[$_SERVER["REMOTE_ADDR"]]) {
    header("HTTP/1.1 403 Forbidden");
    exit;
}
?>

/mvh
</bole>
Avatar billede smitten1 Nybegynder
19. marts 2008 - 01:46 #20
ole, du kan bare ikke lide den der isset ?
Avatar billede akyhne Nybegynder
19. marts 2008 - 09:30 #21
Jeg kan så absolut godt lide ideen med at jeg ikke skal være afhængig af en database, men kan nøjes med et array.
Avatar billede nielle Nybegynder
19. marts 2008 - 09:39 #22
Så synes jeg til gængæld at det er lidt mere stilrent at skrive:

banned = array(
    "127.0.0.1" => true,
    "127.0.0.3" => true,
    "127.0.0.5" => true,
    "127.0.0.8" => true
);

- men det kommer ultimativt ud på det samme :^)
Avatar billede olebole Juniormester
19. marts 2008 - 21:36 #23
nielle >> Nuvel, det kan være et tal, true, en streng, et array, et object, eller hvad somhelst andet end null, false eller 0 - men jeg forstår godt, hvad du mener  ;o)

smitten1 >> Jamen, jeg æææææælsger da isset! Jeg kan bare ikke se, hvad jeg skulle bruge den til lige her. Er $_SERVER["REMOTE_ADDR"] ikke sat, opfyldes betingelsen ikke - og hvad skulle jeg ellers bruge isset til?  :)
Avatar billede smitten1 Nybegynder
19. marts 2008 - 21:43 #24
Du risikerer bare at få en "undefined index" smidt i hovedet, hvis ipen ikke findes i arrayet - afhængigt af hvordan php er konfigureret
Avatar billede olebole Juniormester
19. marts 2008 - 22:37 #25
Bevares, hvis du bruger E_ALL, skal der testes først  ;o)

if (isset($_SERVER["REMOTE_ADDR"]) && $banned[$_SERVER["REMOTE_ADDR"]]) {
Avatar billede smitten1 Nybegynder
19. marts 2008 - 22:39 #26
nej, ikke sådan. Det vil jo stadig give fejl

if (isset($banned[$_SERVER["REMOTE_ADDR"]])) {

"bevares" ... er det ikke dig, som altid er fortaler for god kode, som virker i alle situationer? :)
Avatar billede showsource Seniormester
20. marts 2008 - 09:48 #27
Jaaaa, man bør nu bruge isset() :O)

"Indtil videre bruger jeg bare en .htaccess fil", ( akyhne, 18/03-2008 17:22:36 )
Det er vel stadig nemmere, end at bruge PHP ?
Avatar billede akyhne Nybegynder
21. marts 2008 - 23:45 #28
Ikke forstået..
Avatar billede jakobdo Ekspert
22. marts 2008 - 09:53 #29
smitten1: Hvad er der galt med olebole's kode:
if (isset($_SERVER["REMOTE_ADDR"]) && $banned[$_SERVER["REMOTE_ADDR"]]) {

Den tester fra venstre mod højre, så hvis isset fejler, så går den ikke videre, så det er da helt korrekt.
Din kode derimod: if (isset($banned[$_SERVER["REMOTE_ADDR"]])) { vil da ikke virke.
Avatar billede jakobdo Ekspert
22. marts 2008 - 09:53 #30
smitten1: Sorry, du har ret! :o) Skal bare læse og forstå det, det er åbenbart ikke nok at læse det.
Avatar billede akyhne Nybegynder
22. marts 2008 - 10:37 #31
Jeg forstår ikke lige hvordan $banned[$_SERVER["REMOTE_ADDR"]] kan virke. Det er jo et array! Skal man ikke løbe det igennem med en løkke for at checke for alle værdier i det?
Avatar billede nielle Nybegynder
22. marts 2008 - 19:49 #32
Ja,

$banned[...]

er et array.

Og hvis du putter et IP:

$_SERVER["REMOTE_ADDR"]

ind i det, så får du værdien 1 (eller true) ud hvis IP'et er banned.
Avatar billede akyhne Nybegynder
22. marts 2008 - 22:28 #33
Ok, men hvad skal (isset($_SERVER["REMOTE_ADDR"]) så gøre godt for? En fjerncomputer har da altid en IP adresse, så hvorfor checke for den?
Avatar billede showsource Seniormester
22. marts 2008 - 22:47 #34
"Bevares, hvis du bruger E_ALL, skal der testes først  ;o)"

isset() tjekker om ip er sat som "key" i arrayet $banned
Avatar billede showsource Seniormester
22. marts 2008 - 22:51 #35
$what = array();

$what["now"] = time();
$what["so_now"] = (time()+600);
Avatar billede showsource Seniormester
22. marts 2008 - 22:53 #36
if(isset($what[time()])) {
echo"OK";
}
if(isset($what["now"])) {
echo"OK";
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester