Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

Rumaenische Scraper auf dem Vormarsch..

Alles zum Thema: Robots, Spider, Logfile-Auswertung und Reports
Kristian
PostRank 9
PostRank 9
Beiträge: 1484
Registriert: 20.07.2005, 16:30

Beitrag von Kristian » 17.02.2008, 19:08

Hallo

Bei näherer Betrachtung sehe ich bei diesen Lösungen 2 Schwachstellen.
1.) Wenn man via iptables die Zugriffe checkt wird es krumm, wenn normale User die vielen kleinen Images laden, die z.B. Buttons zur Navigation sind, der Bot des Scrapers aber nur den HTML-Code will und die Bilder auslässt.
2.) Die Scripte arbeiten alle mit dem Dateisystem um ein Logfile/Memory zu haben, das bremst.

Es sieht so aus als müsste man mal selbst was schreiben ;-)
Ich mach's dann mal für Perl.

Gruss
Kristian

Anzeige von ABAKUS

von Anzeige von ABAKUS »


Hochwertiger Linkaufbau bei ABAKUS:
  • Google-konformer Linkaufbau
  • nachhaltiges Ranking
  • Linkbuilding Angebote zu fairen Preisen
  • internationale Backlinks
Wir bieten Beratung und Umsetzung.
Jetzt anfragen: 0511 / 300325-0

Airport1
PostRank 10
PostRank 10
Beiträge: 4489
Registriert: 16.08.2004, 18:50
Wohnort: Backnang / bei Stuttgart

Beitrag von Airport1 » 17.02.2008, 20:10

ddos.sh ist im grunde ein shell-script, fraegt netstat ab und fuettert dann gleich mit den erkenntnissen iptables bzw. apf. selbst wenn du ein script in perl schreibst braucht das wahrscheinlich mehr cpu power, memory und sonstwas als dieses kleine putzige shell script ;)
Linktauschanfragen zwecklos
https://www.bot-trap.de/ Spamschutz fuer Webmaster - zentrale Meldestelle fuer Web Spam
https://www.airport1.de/blog/ Lombagruschd Blog mid Gardadierle
https://www.ranking-hits.de/ Counter & PR Service

Kristian
PostRank 9
PostRank 9
Beiträge: 1484
Registriert: 20.07.2005, 16:30

Beitrag von Kristian » 17.02.2008, 20:45

Hallo

Es bleibt auf jeden Fall die Problematik des Zugriffs durch User auf viele Dateien und des Scrapers nur auf das Script.

Ob ich in Perl mehr CPU-Power brauche als ein Shell-Script, ich will es anzweifeln.
Mehr Ram brauche ich auf jeden Fall, da ich ja nicht über eine Datei gehen will, sondern den Ram stattdessen nutze. ;-)
Allerdings erwarte ich den Vergleich Dateisystem <=> RAM etwa wie 1:50.

Meine Lösung ist als Erweiterung für bestehende Perl-Anwendungen gedacht.
Ich gehe davon aus, das die Abfrage deutlich unter 1/100 Sekunde dauern wird.
(Der erste Hack ist fertig, ich werde es mal benchmarken)

Gruss
Kristian

Anzeige von ABAKUS

von Anzeige von ABAKUS »

Content Erstellung von ABAKUS Internet Marketing
Ihre Vorteile:
  • einzigartige Texte
  • suchmaschinenoptimierte Inhalte
  • eine sinnvolle Content-Strategie
  • Beratung und Umsetzung
Jetzt anfragen: 0511 / 300325-0

3DCG
PostRank 7
PostRank 7
Beiträge: 550
Registriert: 22.01.2006, 20:11
Wohnort: FFM

Beitrag von 3DCG » 17.02.2008, 20:50

Sind die Scraper nicht schlau genug Proxy's zu verwenden? Nur mal so gefragt?


.

Kristian
PostRank 9
PostRank 9
Beiträge: 1484
Registriert: 20.07.2005, 16:30

Beitrag von Kristian » 17.02.2008, 23:06

Hallo

Nein, noch nicht.
Es muss ja erstmal die Technologie geben die zuverlässig auf die zu hohe Zugriffszahl reagiert, dann muss diese im Umlauf sein.
Erst wenn die Scraper merken, dass man sie an den Eiern hat werden sie versuchen eine Lösung zu finden.
Dann sind wir wieder drann mit dem "NextStep", ist halt ganz normales Wettrüsten.

Gruss
Kristian

Kristian
PostRank 9
PostRank 9
Beiträge: 1484
Registriert: 20.07.2005, 16:30

Beitrag von Kristian » 17.02.2008, 23:28

Sodele

Modul ist gebenchmarkt, es liegt wie erwartet unter 1/100 Sekunde, ich muss allerdings dazusagen, dass die Ergebnisse je nach Menge der auflaufenden IP's und dem daraus resultierenden Ramverbrauch (40 - 150 KB im Test) stark schwanken.

An der oberen Grenze klappt es mit der Zeitangabe so gerade noch, im unteren Bereich ist es fast so schnell wie ich es mir gedacht habe, sprich 300-500 / Sekunde.
(das sollte IMHO reichen aber optimiert ist noch nix, ev. geht da noch was)

Das Ganze kommt für die Perlschiene in den nächsten Tagen (GPL), ich bin mal gespannt, wer die PHP-Version schreibt.

Gruss
Kristian

PS: Falls einer heiss drauf ist, hier der Hack des Nachmittags, wobei da kann selbst der Name des Moduls noch wechseln, falls ichs auf CPAN einstellen will und die Leute dort mir einen anderen Namen vorgeben (das wird so sein da es den NameSpace KFSW nicht gibt und wohl auch nicht geben wird)

Code: Alles auswählen

package KFSW&#58;&#58;AccessControl;

use strict;
use warnings;
use IPC&#58;&#58;ShareLite;
use Fcntl qw&#40;&#58;flock&#41;;
use Storable qw&#40;freeze thaw&#41;;

our $VERSION = '0.01';

sub new&#123;
    my $pkg   = shift;
    my %param = @_;
    my $self  = &#123;&#125;;
    bless $self,ref $pkg || $pkg;
    my $params = &#123;&#125;;
    %&#123;$params&#125; = &#40;'ctrl_time' => 60,
		  'max_hits'  => 60,
		  'cache_key' => 'KFSWAccessControl',
		  'clean'     => 1000 &#41;;
    $self->&#123;'params'&#125; = $params;
    _parse_params&#40;\%param&#41;;
    return $self;
&#125;

sub _init&#123;
    my $self   = shift;
    $self->&#123;'_share'&#125; = new IPC&#58;&#58;ShareLite&#40; -key     => $self->&#123;'params'&#125;->&#123;'cache_key'&#125;,
					    -create  => 'yes',
					    -destroy => 'no' &#41; or die $!;
    return unless defined wantarray;
    return $self->&#123;'_share'&#125;;    
&#125;

sub _parse_params&#123;
    my $self   = shift;
    my $params = shift;
    my &#40;$opt_key,$opt_val,$opt&#41;;
    while&#40;&#40;$opt_key,$opt_val&#41; = each %&#123;$params&#125;&#41;&#123;
	unless&#40;$opt_val&#41;&#123;
	   die&#40;'KFSW&#58;&#58;AccessControl->new&#40;&#41; called with odd number of option parameters' . 
	       ' - should be of the form option => value'&#41;;	    
	&#125;
	$opt = lc&#40;$opt_key&#41;;
	$opt =~ s/^-|_//g;
	if&#40;exists $self->&#123;'params'&#125;->&#123;$opt&#125;&#41;&#123;
	    $self->&#123;'params'&#125;->&#123;$opt&#125; = $opt_val
	&#125;
    &#125;
    return unless defined wantarray;
    return 1;
&#125;

sub request_allowed&#123;
    my $self = shift;
    my $ip   = shift || '';
    return undef unless&#40;length&#40;$ip&#41;&#41;;
    my $nr = $self->request_nr&#40;$ip&#41;;
    return unless defined wantarray;
    return &#40;$nr < $self->&#123;'params'&#125;->&#123;'max_hits'&#125;&#41;? 1 &#58; 0;    
&#125;

sub request_nr&#123;
    my $self = shift;
    my $ip   = shift || '';
    return undef unless&#40;length&#40;$ip&#41;&#41;;

    my $share = $self->&#123;'_share'&#125; || $self->_init&#40;&#41;;
    $share->lock&#40;LOCK_EX&#41;;

    my $is_time  = time&#40;&#41;;
    my $off_time = time&#40;&#41; + $self->&#123;'params'&#125;->&#123;'ctrl_time'&#125;;
    my $del_time = time&#40;&#41; - $self->&#123;'params'&#125;->&#123;'ctrl_time'&#125;;

    my $share_data;
    my $data = $share->fetch&#40;&#41; || '';
    if&#40;length&#40;$data&#41;&#41;&#123;
	$share_data = thaw&#40;$data&#41;;
    &#125;else&#123;
	$share_data = &#123;&#125;;
    &#125;

    $share_data->&#123;'hits'&#125;++;
    $share_data->&#123;$ip&#125; = &#123;&#125; unless&#40;exists $share_data->&#123;$ip&#125;&#41;;
    $share_data->&#123;$ip&#125;->&#123;'last_request'&#125; = $is_time;
    $share_data->&#123;$ip&#125;->&#123;'requests'&#125;     = &#91;&#93; unless&#40;exists $share_data->&#123;$ip&#125;->&#123;'requests'&#125;&#41;;

    if&#40;scalar&#40;@&#123;$share_data->&#123;$ip&#125;->&#123;'requests'&#125;&#125;&#41;&#41;&#123;
	@&#123;$share_data->&#123;$ip&#125;->&#123;'requests'&#125;&#125; = grep &#123; $is_time <= $_ &#125; @&#123;$share_data->&#123;$ip&#125;->&#123;'requests'&#125;&#125;;
    &#125;

    push&#40;@&#123;$share_data->&#123;$ip&#125;->&#123;'requests'&#125;&#125;, $off_time&#41;;

    unless&#40;$share_data->&#123;'hits'&#125; % $self->&#123;'params'&#125;->&#123;'clean'&#125;&#41;&#123; # clean memory each 1000 requests
	foreach my $key&#40;keys %&#123;$share_data&#125;&#41;&#123;
	    next if&#40;$key eq 'hits'&#41;;
	    if&#40;defined&#40;$share_data->&#123;$key&#125;->&#123;'last_request'&#125;&#41; && &#40;$share_data->&#123;$key&#125;->&#123;'last_request'&#125; < $del_time&#41;&#41;&#123;
		$share_data->&#123;$key&#125; = undef;
		delete $share_data->&#123;$key&#125;;
	    &#125;
	&#125;
    &#125;

    $share->store&#40;freeze&#40;$share_data&#41;&#41;;
    $share->unlock&#40;&#41;;
    return unless defined wantarray;
    return scalar&#40;@&#123;$share_data->&#123;$ip&#125;->&#123;'requests'&#125;&#125;&#41;;
&#125;

# Preloaded methods go here.

1;
__END__
# Below is stub documentation for your module. You'd better edit it!

=head1 NAME

KFSW&#58;&#58;AccessControl - Perl extension for controling access to perlscripts runing as CGI, FCGI or under mod_perl.

=head1 SYNOPSIS


  use KFSW&#58;&#58;AccessControl;
  my $control     = new KFSW&#58;&#58;AccessControl&#40;'-ctrl_time' => 60,
                                            '-max_hits'  => 60&#41;;

  my $ip_addr     = $ENV&#123;'REMOTE_ADDR'&#125; or '';

  my $req_in_time = $control->request_nr&#40;$ip_addr&#41; if&#40;length&#40;$ip_addr&#41;&#41;; 
  my $req_allowed = $control->request_allowed&#40;$ip_addr&#41; if&#40;length&#40;$ip_addr&#41;&#41;; 

=head1 DESCRIPTION

ToDo...

=head2 EXPORT

None.

=head1 SEE ALSO

ToDo...

=head1 AUTHOR

Kristian Fischer, E<lt>me@kfsw.deE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright &#40;C&#41; 2008 by Kristian Fischer

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.5 or,
at your option, any later version of Perl 5 you may have available.


=cut

Airport1
PostRank 10
PostRank 10
Beiträge: 4489
Registriert: 16.08.2004, 18:50
Wohnort: Backnang / bei Stuttgart

Beitrag von Airport1 » 17.02.2008, 23:40

hm, du zaehlst die requests je ip selbst, oder? koennte es nicht schneller sein diese eigentlich bereits vorhandene information einfach von "netstat" abzuholen, dort muesste man nur ein bisserle rumregexpen und haette die anzahl der conns pro ip. nur ne anregung, ein nachteil koennt sein dass man dann ja staendig netstat abfragen muesste.. vielleicht gibts ja noch ne tiefere ebene an die man noch effizienter kaeme, denn auch das abfragen von netstat kostet ja zeit.. ps: danke fuer use strict und sprechende bezeichner. einige perlies wuerden beides nicht ingredienzen ,)
Linktauschanfragen zwecklos
https://www.bot-trap.de/ Spamschutz fuer Webmaster - zentrale Meldestelle fuer Web Spam
https://www.airport1.de/blog/ Lombagruschd Blog mid Gardadierle
https://www.ranking-hits.de/ Counter & PR Service

Kristian
PostRank 9
PostRank 9
Beiträge: 1484
Registriert: 20.07.2005, 16:30

Beitrag von Kristian » 18.02.2008, 00:07

Hallo

Du missachtest Punkt 1.
Netstat / iptables etc zeigen alle Requests des Users.
User laden die ganze Seite mit alle Bildern etc. Das macht pro Seite schonmal 20 Requests.
Scraper laden nur den HTML-Teil das macht einen Request.
Wo willst du MaxRequestPerTime ansetzen, wenn die User drinn bleiben sollen die seltsamen Bots aber raus müssen?
Das passt nicht!

> dort muesste man nur ein bisserle rumregexpen
Hmmm, ich fürchte das kippt, da die Datenmenge die durch die regex läuft ja die Laufzeit ausmacht und die Datenmenge ist für den Zeitraum X nicht ganz bescheiden.
Ich komme ja bei nur Script mit 500 IP's und 60 Sekunden Zeitraum auf etwa 56KB.
Wenn ich mir dann vorstelle, dass die Anzahl der Datensätze im Faktor ~ 15 höher ist, wenn normale User die Bilder etc. mitladen, aua, das wird CPU-tötend.

use strict;? Kein Script / Modul ohne!
Sprechende Bezeichner? Wenn ich die nicht hätte müsste ich ja ne Doku schreiben, nööö das wäre mir zu blöd, da schreib ich doch lieber lesbaren Code, der keine Doku braucht. ;-)
Beides ist aber in Perlkreisen (zumindest die, die ich kenne) absolut normal.

Gruss
Kristian

RW
PostRank 6
PostRank 6
Beiträge: 436
Registriert: 23.07.2003, 08:54

Beitrag von RW » 18.02.2008, 10:08

HI, Kristian

Ich kenne mich mit zwar mit Perl nicht so gut aus.
Das Problem bleibt nachwievor zur Istzeit mit minimalen Ressourcen Ergebnisse zu liefern.

Ich hatte damals aus Performance-Gründen mit RewriteMap's gearbeitet.
siehe: https://www.abakus-internet-marketing.d ... highlight=

RW

Kristian
PostRank 9
PostRank 9
Beiträge: 1484
Registriert: 20.07.2005, 16:30

Beitrag von Kristian » 18.02.2008, 12:25

Hallo

Die Situation ist hier anders. Es geht um Leute die über eine dynamische Einwahl-Ip kommen und einen "normalen" Uers-agent vortäuschen.
Auffällig werden die, da sie nur zwei Limits kennen, das ist a die Leistungsgrenze des Servers und b der maximale Durchsatz der eigenen Leitung.
Es geht also darum den Serverbetrieb aufrecht zu erhalten indem man die Anzahl der Anfragen pro User in einem Zeitraum x auf eine Anzahl y beschränkt.
Wenn einer das Limit überschreitet ist es kein normaler Besucher, die lesen selten mehr als y Seiten in x Sekunden.

Gruss
Kristian

PS: bei deinem RewriteCond fällt mir auf dass die nicht wirklich perfekt sind.
Guckst du: https://www.teergrubing.de/werkzeuge.html das senkt den Verbrauch an Aspirin ungemein. ;-)

RW
PostRank 6
PostRank 6
Beiträge: 436
Registriert: 23.07.2003, 08:54

Beitrag von RW » 18.02.2008, 13:17

HI, Kristian

Ich habe zur Zeit wieder arge Probleme mit der Spieglung meiner Seiten.
Darum habe ich wieder angefangen mein Blocker weiterzuentwickeln.
Meinen Server habe ich ersteinmal 2G mehr Ram gegeben. Ist natürlich auch nur eine Tropfen auf dem glühenden Stein.

Die Techniken der Spamer werden immer feiner .......
Einer hat letzten Monat mit Blöcken von jeweils 50 Anfragen (mit wechselner IP) mein conten gesaugt. Abuse von t-online kann man vergessen.

Noch mal zurück zu Deinen Code was spricht eigentlich gegen ein Cookie Tracking?

PS: bei deinem RewriteCond fällt mir auf dass die nicht wirklich perfekt sind.
Ja, das ist korrekt.
Abgesehen davon kann der 'User-Agent' leicht gefälscht werden.

Vielleicht sollte man den Flaschenhals richtig eng machen.
Praktisch eine Kombination zwischen Cookie Tracking User und whois Abfrage bei Bots.

RW

everflux
PostRank 8
PostRank 8
Beiträge: 939
Registriert: 01.05.2006, 17:15

Beitrag von everflux » 18.02.2008, 13:50

Mal so eine ganz blöde Frage:
a) Was saugen die Bots denn genau bei euch? Bei mir ist es quasi nur html content, keine Bilder
b) kann mir jemand nen tcpdump oder auch die Request-Header von einer Botsitzung zukommen lassen?

Ich versuche derzeit eine Heuristik zu finden, die Bots besser und schneller erkennt ohne alles loggen zu müssen.
https://everflux.de/ blogging about life, programming, seo and the net

RW
PostRank 6
PostRank 6
Beiträge: 436
Registriert: 23.07.2003, 08:54

Beitrag von RW » 18.02.2008, 14:35

HI everflux

Versuche mal mit z.B https://www.httrack.com eine Deiner Seiten zu spiegeln.
Und dann schau in die Logs :D

RW

sean
PostRank 10
PostRank 10
Beiträge: 3396
Registriert: 05.01.2004, 20:26
Wohnort: Leipzig/Karlsruhe

Beitrag von sean » 18.02.2008, 16:10

bei mir würde schon reichen, nach mehr als 3 Aufrufen (html, php Seiten) die Requestzeit zu verlangsamen. Sagen wir mal Zugriff 1 - 3 Servermaximum, dananach 1 Sekunde wartezeit je Anfrage, danach 2 Sekunden, danach 4 Sekunden usw. Googlebot würd eich über eine Whitelist ausnehmen. Ich hab das mal vor xmonaten in PHP umgesetzt - lol - leider viel zu lahm :-)

Gruß

sean

Kristian
PostRank 9
PostRank 9
Beiträge: 1484
Registriert: 20.07.2005, 16:30

Beitrag von Kristian » 18.02.2008, 16:26

Hallo

Erstmal, wir müssen differenzieren.
1. Es gibt die Familie(n) der "NPH-Proxies"
2. Es gibt Scraper, Zielsetzung: Veröffentlichung fremden Contents
3. DDos, hier geht es einfach darum einen Server so zu überlasten, dass er quasi aus ist
4. Die Sammler von Mailadressen
5. "Pseudosuchmaschinen", ich habe selbst eine, man mag mir die " verzeihen
(es gibt mit Sicherheit auch 6. 7. 8.... aber die sind so selten, man kann sie übersehen)

Es gibt IMHO keine Lösung die das alles in einem Abwasch erledigen könnte,
https://www.bot-trap.de wird mir ev. widersprechen, es ist dort wohl auch die Zielsetzung alles zu handeln.

Zu 1: Hier hilft es die IP's zu kennen und zu sperren. IMHO handelt es sich bei diesen IP's nicht um "persönliche" Daten, die via Datenschutz unantastbar sind.
Zu 2: Ganz schwer, wenn es händisch via Browser erfolgt, FF ist sehr geeignet, keine Chance der Gegenwehr.
Zu3: Darauf zielt die Lösung die ich in diesem Thread angedacht habe, was die Jungs wirklich wollen ist mir relativ schnuppe, für mich ist es DDos.
Zu 4: Die verhalten sich meist wie die Kandidaten unter 3 => gleiches Szenario
Zu 5: Hier gilt es abzuwägen ob man die nun lässt oder nicht, wenn die robots.txt beachtet wird ist es schonmal ein gutes Zeichen, wenn der Content in Suchergebnissen endet und daraus resultierend entweder User kommen oder Backlinks entstehen, hmmm das muss jeder selber wissen, wen er lässt und wen nicht. Entweder es geht per robots.txt oder bei merkbefreiten Kandidaten via .htaccess

So, toller Vortrag bislang....

Cookies waren ein Thema. Ja ich glaube damit könnte man im Moment arbeiten, die meisten Tools / Scripte etc. blockieren Cookies oder wissen gar nicht was das ist.
Cookie-Tracking? Aua, das geht wieder so in Richtung User kennzeichnen und kollidiert mit den Vorstellungen des Gesetzgebers.
Ich denke aber dass es nicht verboten sein kann einen Cookie zu senden und bei Rücksendung auf weitere Aktionen zu verzichten. Das wird solange funktionieren bis die Leute hinter 1-5 das geschnallt haben.

@everflux
> ich versuche derzeit eine Heuristik zu finden, die Bots besser und schneller erkennt

Schwierig, ich habe es für die diversen Arten unter 1 mal versucht, es gibt Hinweise und Anzeichen aber die sind je nach Konfiguration der jeweiligen Programme unterschiedlich, das Ganze war am Ende so wachsartig, dass es für mich keinen Sinn mehr ergab.
Somit gilt für diese Kandidaten wohl das was unter zu 1 steht.

Ein möglicher Ansatz wäre immer zu prüfen, ob auch Bilder geladen werden, wenn nicht ist es ein Bot oder ein Browser der text-only arbeitet (z.B. lynx) es könnte aber auch der Screenreader eines Blinden sein. Wenn man es hart durchziehen würde müsste man die IP mit einer White-List abgleichen und dann entscheiden ob er darf oder nicht. Wirklich treffen könnte man damit 4 und 5 aber es ist auch nur ein Teil des Puzzle.

Soweit meine 50 Cent.

Gruss
Kristian

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag