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

Ergebnis in txt Datei schreiben

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
Synonym
PostRank 10
PostRank 10
Beiträge: 3708
Registriert: 09.08.2008, 02:55

Beitrag von Synonym » 23.04.2011, 08:25

Also eigentlich ist es kein Hexenwerk....

Mal so auf die Schnelle zusammengefasst

1. Prüfen ob $_SERVER['HTTP_REFERER'] überhaupt einen gültigen Wert hat.
2. Wenn ja, dann alles andere weitermachen
3. Wenn nein, dann alles andere ignorieren, da ja nichts zum prüfen da ist.
4. Ist der Referer vorhanden, dann kannst Du ihn mit parse_url() zerlegen.
5. Im Ergebnisarray kannst Du dann im Index HOST prüfen, ob es eine Seite von Dir ist.
6. Wenn ja, eben wieder alles andere ignorieren
7. Wenn nein, dann weiter Prüfen.
8. Index QUERY prüfen ob vorhanden und nicht leer
9. Wenn nicht leer, dann steht darin der Querystring
10. diesen Querystring könntest Du dann durch parse_str() jagen


Wie gesagt, nur auf die Schnelle :D

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

S0l0ng
PostRank 5
PostRank 5
Beiträge: 258
Registriert: 06.11.2008, 08:55

Beitrag von S0l0ng » 23.04.2011, 08:31

Naja ich kanns in etwa lesen und weiß was ein code macht aber mit dem schreiben haperts bei mir
Contaxe, die Alternative zum Geldverdienen mit Foren!

Synonym
PostRank 10
PostRank 10
Beiträge: 3708
Registriert: 09.08.2008, 02:55

Beitrag von Synonym » 23.04.2011, 08:47

Also dann mal so als Ansatz. Ungetestet, nicht ganz optimal und ein nur 2.Minuten-Entwurf ;-)

Code: Alles auswählen

// Prüfen, ob HTTP_REFERER vorhanden
if(isset($_SERVER['HTTP_REFERER']) AND !empty($_SERVER['HTTP_REFERER']))
{
	// Referer zerlegen
	$referer = parse_url($_SERVER['HTTP_REFERER']);

	// Eigene Domain und Existenz von Query prüfen
	if($referer['host'] != 'deine-domain.de' AND isset($referer['query']))
	{
		// q braucht es hier nicht, da q = q bleibt
		$refeins = array("query=","su=","p=");
		$refzwei = array("q=","q=","q=");
		$refdrei = str_replace($refeins,$refzwei,$referer['query']);

		// Query-String zerlegen
		parse_str($refdrei, $params);

		if(!isset($params['q']) OR empty($params['q']))
		{
			$auswahl = 'beliebiger Begriff';
		}
		else
		{
			$auswahl = $params['q'];

			$datei = "datei.txt";
			$eintrag = $params['q']."\n";

			$handle = fopen($datei,"a");
			fputs($handle,$eintrag);
			fclose($handle);
		}

	}
	else
	{
		$auswahl = 'beliebiger Begriff';
	}

	echo "<a href=\"http&#58;//www.crawl-it.de/crawlit/registration/search.it?p_userid=000000&p_search=" .htmlentities&#40;$auswahl, ENT_QUOTES&#41;. "\" target=\"self\" style=\"text-decoration&#58; none\">Deine Suchergebnisse zu " .htmlentities&#40;$auswahl, ENT_QUOTES&#41;. "</a> | ";
&#125;

Anzeige von ABAKUS

von Anzeige von ABAKUS »

SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Melegrian
PostRank 10
PostRank 10
Beiträge: 3170
Registriert: 30.01.2005, 12:36

Beitrag von Melegrian » 23.04.2011, 18:41

Synonym hat geschrieben:

Code: Alles auswählen

		// q braucht es hier nicht, da q = q bleibt
		$refeins = array&#40;"query=","su=","p="&#41;;
		$refzwei = array&#40;"q=","q=","q="&#41;;
Ich hatte bei meinen Scripts die Erfahrung gemacht, dass q nicht erkannt wird, wenn sich vor dem q kein & befindet. Deshalb schrieb ich das so bei "?q=".

Code: Alles auswählen

  $refeins = array&#40;"?q=","query=","su=","p="&#41;;
  $refzwei = array&#40;"?x&q=","q=","q=","q="&#41;;
Das q nicht gefunden wurde, wenn sich vor dem q kein & befand, lag daran, dass ich parse_str() auf die ganze URL anwendete und nicht nur auf den Query-String. So wie das Script jetzt aussieht, sollte es wohl auch funktionieren und q in jedem Fall erkannt werden. Werde das auch noch einmal testen.

Synonym
PostRank 10
PostRank 10
Beiträge: 3708
Registriert: 09.08.2008, 02:55

Beitrag von Synonym » 24.04.2011, 10:15

Ich hatte bei meinen Scripts die Erfahrung gemacht, dass q nicht erkannt wird,
Ich weiß... Eben aber darum, weil Du parse_str() auf eine komplette URL anwendest und nicht auf den gedachten Query-String. Ein Query-String beginnt immer ohne ? oder & bzw, beginnt er genau genommen nach dem ? ...

Oh, zu langsam gelesen, Du hast das Problem ja selbst erkannt :-)

Nachtrag:
Wenn Du bei Deinem Script mal die Vars debugst, dann siehst Du, dass da eine mit der Bezeichnung "?x" angelegt werden soll, eben weil das im String der erste Parameter wäre ;-)

Melegrian
PostRank 10
PostRank 10
Beiträge: 3170
Registriert: 30.01.2005, 12:36

Beitrag von Melegrian » 24.04.2011, 12:43

Mein Irrweg kam daher, dass ich ein ähnliches Script nur für Statistiken benötige, per JavaScript wie ein Counterscript zulade, mit escape(document.referrer) übergebe und mit $_SERVER["QUERY_STRING"] dann auslese und abspeichere, plus Datum und $_SERVER["HTTP_REFERER"], wobei dann in HTTP_REFERER die eigene Einstiegsseite enthalten ist. Der Speicherstring, der dann etwa so aussieht,

Code: Alles auswählen

$woher = urldecode&#40;$_SERVER&#91;"QUERY_STRING"&#93;&#41;;
$einstieg = $_SERVER&#91;"HTTP_REFERER"&#93;;

$speicherstrg = "wann=".$wann."&woher=".$woher."&einstieg=".$einstieg."\n";
hatte ich bisher bei der Ausgabe nur mit parse_str zerlegt. Da aber in $woher die komplette URL enthalten ist, hatte ich das gestern noch mit parse_url als Zwischenschritt probiert. Mit parse_url könnte ich einige der Scriptseiten noch etwas aufräumen, weil ja x& und ähnliche Gebilde entfallen könnten.

Fehlermeldungen kommen dabei nur am Monatsbeginn bei der Ausgabe auf den einzelnen Statistikseiten, wenn nach 0.00 Uhr noch kein Eintrag vorhanden ist. Und da ich diese Fehlermitteilungen am Monatsbeginn nicht als "echte" Fehler, sondern nur als unschön ansehe, habe ich einige Fehler bisher nur mit @ unterdrückt.

S0l0ng
PostRank 5
PostRank 5
Beiträge: 258
Registriert: 06.11.2008, 08:55

Beitrag von S0l0ng » 03.05.2011, 17:26

Eurer regen Diskussion konnte ich nur stellenweise folgen :o

Für mich stellt sich jetzt da noch eine Frage. Ich habe da nun die besagte datei.txt mit den Suchanfragen. Würde ich die nun per

Code: Alles auswählen

<?php
readfile&#40;"datei.txt"&#41;;
?>
ausgeben lassen, so hätte ich eine ellenlange (und unübersichtliche) Textliste. Lässt es sich grundsätzlich per PHP realisieren, dass der Inhalt der Text Datei auf Dublikate überprüft wird und jeweils die gleiche Suchphrase nur einmal ausgegeben wird?

Also in der Datei steht beispielsweise:

Blumenkohl
Wie Blumenkohl zubereiten
Blumenkohlsorten
Wie Blumenkohl zubereiten
Blumenkohlarten auf der Welt
Wie Blumenkohl zubereiten

und jetzt soll die dreifache Suchphrase "Wie Blumenkohl zubereiten" zur einmal ausgegeben werden (da ja Duplikat)

??
Contaxe, die Alternative zum Geldverdienen mit Foren!

Synonym
PostRank 10
PostRank 10
Beiträge: 3708
Registriert: 09.08.2008, 02:55

Beitrag von Synonym » 03.05.2011, 17:39

Also warum machst Du das eigentlich nicht mit einer Datenbank?

Aber so geht es auch...

readfile() kannst Du da aber vergessen, da der ja normalerweise alles komplett in den Ausgabepuffer schreibt.

Also eben manuell. Öffnen, zeilenweise lesen, jede Zeile in ein Array packen, Datei schließen. Array bereinigen. Werte anzeigen.

oder eben wieder auf die Schnelle:

Code: Alles auswählen

<?php
// Datei zeilenweise in Array übernehmen
$lines = file&#40;'test-file-1.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES&#41;;

echo '<pre>';
print_r&#40;$lines&#41;;
echo '</pre>';

/*
Array
&#40;
    &#91;0&#93; => Blumenkohl
    &#91;1&#93; => Wie Blumenkohl zubereiten
    &#91;2&#93; => Blumenkohlsorten
    &#91;3&#93; => Wie Blumenkohl zubereiten
    &#91;4&#93; => Blumenkohlarten auf der Welt
    &#91;5&#93; => Wie Blumenkohl zubereiten
&#41;
*/

// Array bereinigen
$lines = array_unique&#40;$lines&#41;;

echo '<pre>';
print_r&#40;$lines&#41;;
echo '</pre>';
/*
Array
&#40;
    &#91;0&#93; => Blumenkohl
    &#91;1&#93; => Wie Blumenkohl zubereiten
    &#91;2&#93; => Blumenkohlsorten
    &#91;4&#93; => Blumenkohlarten auf der Welt
&#41;
*/
?>

S0l0ng
PostRank 5
PostRank 5
Beiträge: 258
Registriert: 06.11.2008, 08:55

Beitrag von S0l0ng » 03.05.2011, 20:01

Ja Datenbank ginge auch aber solche "Spielereien" will ich lieber auslagern und die Datenbank nur mit meinen Foren und Blogs belasten

Bei deinem Beispiel müsste ich aber alle Phrasen in der datei.txt kennen. Das ist aber nicht der Fall da mich die Besucher immer wieder mit ihren Suchbegriffen "überraschen". Um bei meinem Blumenkohlbeispiel zu bleiben: Da stehen dann so sachen wie "Helmut Kohl in Afghanistan" in meiner Textfile. Und diese Phrasen kenne ich ja vorher nicht

Weisst du was ich meine
Contaxe, die Alternative zum Geldverdienen mit Foren!

Synonym
PostRank 10
PostRank 10
Beiträge: 3708
Registriert: 09.08.2008, 02:55

Beitrag von Synonym » 03.05.2011, 20:53

Nee, weiß ich ehrlich gesagt nicht. Ich habe ja nur die Zeilen genommen, die Du oben genannt hattest zum Testen.

Das in meinem Beispiel zwischen den jeweiligen /* */ (das sind Kommentare wie <!-- --> im HTML) sind nur Ausgaben am Bildschirm, die das print_r() liefern würden. Das print_r selbst ist auch nur da, um schnelle eine Übersicht der Inhalte zu bekommen.

Es ist ja egal was in der Datei drinnen steht. Das erste /* */ zeigt ja nur, was bei mir drinnen war. Das zweite /* */, was nach der Bereinigung noch da ist. Also das Script hat eigentlich nur 2 Zeilen Code:

Code: Alles auswählen

<?php
$lines = file&#40;'test-file-1.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES&#41;; 
$lines = array_unique&#40;$lines&#41;; 
?>
$lines ist am Ende ein Array mit allen Werten aus der Datei, jeweils von Doppelten bereinigt.

Ausgabe könnte dann etwa so sein:

Code: Alles auswählen

foreach&#40;$lines AS $line&#41;
&#123;
	echo $line.'<br />';
&#125;

Melegrian
PostRank 10
PostRank 10
Beiträge: 3170
Registriert: 30.01.2005, 12:36

Beitrag von Melegrian » 06.05.2011, 22:46

Also, ich würde da entweder für Besucher die letzten 10 bis 20 Einträge ausgeben oder zur eigenen Übersicht die häufigsten Einträge auflisten.

Code: Alles auswählen

<?php

$lines = file&#40;"datei.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES&#41;;
$alle  = count&#40;$lines&#41;;


// Ausgabe der letzten 20 Einträge

krsort&#40;$lines&#41;;

$zeige_an = 20;

if&#40;$alle > $zeige_an&#41;&#123;$zeige = $zeige_an;
       &#125;
  else &#123;$zeige = $alle;
       &#125;

for &#40;$start = 0; $start < $zeige; $start++&#41;&#123;

   echo htmlentities&#40;$lines&#91;$start&#93;, ENT_QUOTES&#41;."<br />\n";
&#125;

echo "<hr />\n";


// Ausgabe der 20 häufigsten Einträge

if &#40;$alle > 0&#41;&#123;

$line = array_count_values&#40;$lines&#41;;
arsort&#40;$line&#41;;

$starte = 0;

foreach &#40;$line as $worte => $anzahl&#41; &#123;$starte++;
    
	echo htmlentities&#40;$anzahl." x ".$worte, ENT_QUOTES&#41;."<br />\n";
	
	if&#40;$starte > &#40;20 -1&#41;&#41; &#123;break;&#125;
&#125;&#125;
?>

mgutt
PostRank 10
PostRank 10
Beiträge: 3206
Registriert: 08.03.2005, 13:13

Beitrag von mgutt » 15.05.2011, 13:50

Das mit dem file() und dann das Array kann ich nicht empfehlen. Die Datei wird explosionsartig anwachsen und bei jedem Ref größer und entsprechend wird der RAM voller und voller.

Der Ansatz von Melegrian macht da schon mehr Sinn, wobei er das Array nicht auf 20 Zeilen reduziert, sondern einfach nur 20 Zeilen ausliest und dann abbricht. Wenn das Array aber 100.000 Zeilen enthalten hatte, lagen die bereits im RAM.

Wie man es normalerweise macht:
- alle Daten in eine Datenbanktabelle schreiben
- zu einem bestimmten Zeitpunkt z.B. 1x am Tag die Daten durcharbeiten lassen und das gewünschte Ergebnis in einen Cache legen
- bei der Ausgabe nur auf den Cache zugreifen

Mit Dateien lässt sich das nur schwer halbwegs performant nachbauen. In dem Fall würde ich pro Artikel einen Ordner machen und für jede Phrase eine Datei deren Inhalt nur der Counter ist. Zusätzlich wird eine Art Indexdatei geschrieben wo die Dateien und Counter der Phrasen mit den häufigsten Zugriffen gespeichert wird.

Wie man sieht ist das auf Dateienbasis eher unpraktisch. ;)

Mit 20 Phrasen pro Artikel in eine Datei wird übrigens nicht gehen, weil sobald 20 Phrasen drin sind, kommt keine neue hinzu, egal wie häufig sie noch gesucht werden (sind also 20 unwichtige drin, werden keine wichtigen mehr ergänzt).

Eine Notlösung gäbe es aber trotzdem, wenn es denn unbedingt eine Datei sein soll. In dem Fall speichert man einfach 1.000 Phrasen pro Artikel und liest immer nur 20 aus. Durch die Begrenzung wäre dann gewährleistet, dass der RAM nicht vollläuft und 1.000 Phrasen sollten reichen, damit wirklich wichtige nicht verloren gehen.

D.h. "$phrasen[$phrase] = $counter;" wäre die Grundstruktur der Daten. Das ganze wird dann per serialize() oder json_encode() in einer Datei gespeichert, so dass Du nur per file_get_contents() und unserialize/json_decode() wieder die Daten in nutzbarer Form zurück erhälst.

Bevor Du die neuen Phrasen speicherst machst Du dann nur das:

Code: Alles auswählen

asort&#40;$phrasen&#41;; // sortieren nach meisten zugriffe zuerst
$phrasen = array_slice&#40;$phrasen, 0, 1000&#41;; // auf 1000 phrasen reduzieren
Neue Wörter wären dann so:

Code: Alles auswählen

// $phrase hast du mit dem q aus der url gefüllt
// und $filename ist mit dem Namen gefüllt, der sich pro Artikel ändert. Dann weiter&#58;
//
// datei vorhanden? wenn ja auslesen, wenn nein leeres array setzen
$phrasen = file_exists&#40;$filename&#41; ? json_decode&#40;file_get_contents&#40;$filename&#41;&#41; &#58; array&#40;&#41;;
if &#40;$phrasen !== null&#41; &#123;
  if &#40;!isset&#40;$phrasen&#91;$phrase&#93;&#41;&#41; &#123;
    $phrasen&#91;$phrase&#93; = 1; // neue phrase hinzufügen
  &#125;
  else &#123;
    $phrasen&#91;$phrase&#93;++; // counter der bestehenden phrase um eins erhöhen
  &#125;
  // daten neu in datei schreiben, hier eine funktion von mir&#58;
  function mkfile&#40;$filename, $data='', $chmod=0644&#41; &#123;
	$h = @fopen&#40;$filename, 'w'&#41;;
	@fwrite&#40;$h, $data&#41;;
	@fclose&#40;$h&#41;;
	@umask&#40;0000&#41;;
	@chmod&#40;$filename, $chmod&#41;;
  &#125;
  // sortieren und reduzieren
  asort&#40;$phrasen&#41;;
  $phrasen = array_slice&#40;$phrasen, 0, 1000&#41;;
  // und so dann neu schreiben&#58;
  mkfile&#40;$filename, json_encode&#40;$phrasen&#41;&#41;;
&#125;
Die Abfrage !== null ist übrigens sehr wichtig. Wenn man nämlich Daten einliest kann es sein, dass parallel ein anderer Besucher einen Schreibvorgang ausgelöst hat. In dem Fall ist die Datei nicht vollständig geschrieben und json_decode() wird null resultieren, weil der eingelesene String ungültig ist. json_decode() verifziert also gleichzeitig die Gültikeit der Daten. Das erspart uns die Prüfung ob die Datei gelocked ist oder nicht (versucht es erst gar nicht mit LOCK, selbst das ist nicht 100% verbindlich, json_decode() bzw. unserialize() kann das viel besser).

Bei der Ausgabe kannst Du dann so vorgehen und nur die ersten 20 Elemente ausgeben. Also:

Code: Alles auswählen

if &#40;$phrasen&#41; &#123;
  $i = 0;
  foreach &#40;$phrasen as $phrase => $counter&#41; &#123;
    $i++;
    echo $i . '. ' . $phrase . '<br />';
    if &#40;$i > 19&#41; &#123;
      break;
    &#125;
  &#125;
&#125;
Zusätzlich wird es übrigens nötig sein die $phrase auf utf8 zu prüfen. Entsprechende Funktionen findest Du im Netz. Ist es nicht utf8 solltest Du es in utf8 wandeln.

Auch solltest Du Dir überlegen ob Du die Zugriffe zumindest pro IP begrenzt, damit jemand mit F5 nicht Deine Statistik zerschießt.

Zuletzt solltest Du sicherstellen, dass kein XSS resultiert. Du solltest also auf $phrase, bevor Du es in das Array packst auch noch mal per htmlspecialchars() behandeln. Ansonsten rufe ich Deine Seite nämlich einfach auf mit einem Ref der q=<script>alert('xss')</script> enthält (oder einen lustigen Backlink ^^) und schon habe ich Dich :P

Zusätzlich könntest Du darüber nachdenken $phrase in seiner Länge zu begrenzen z.B. mit substr($phrase, 0, 255) oder besser alles über strlen($phrase) > 255 ablehnen. Sonst könnte jemand q= mit unendlich vielen Daten füllen, die Du wiederrum in Deiner Datei ablegst und ständig in den RAM lädst. Bei einer Datenbank gibt es dieses Problem normalerweise nicht, weil das entsprechende Feld meist VARCHAR(255) ist.

Und was mir auch noch einfällt: Jemand könnte sich einen Scherz erlauben und böse Wörter in den q= setzen. Das ginge sogar über Google, wenn man weiß wie man Deine Seite verbindlich findet. Ein Schimpfwortfilter wäre also auch zu überlegen.

Wie man sieht heißt PHP auch über die Sicherheit nachdenken.

Die Sache mit den undefinierten Variablen ist übrigens eine fehlerhafte Einstellung Deines Servers. Es ist natürlich richtig, dass diese Meldung erscheint, aber diese sollte nur für Programmierer angezeigt werden, weil es sich um keine kritische Fehlermeldung handelt.
Ich kaufe Dein Forum!
Kontaktdaten

Melegrian
PostRank 10
PostRank 10
Beiträge: 3170
Registriert: 30.01.2005, 12:36

Beitrag von Melegrian » 15.05.2011, 16:31

Es kommt ja auf den Einsatzzweck an. Als Statistiktool für eine ganze Website ist es nicht brauchbar. Doch um die Zugriffe von einzelnen Unterseiten zu erfassen und anzuzeigen, dafür eignen sich die Codeschnipsel. Gegen ein unkontrolliertes Wachstum würde es schon reichen, wenn die Textdateien monatlich neu angelegt werden. In diesem Fall brauchten nur wenige Zeilen bei den weiter oben befindlichen Beispielen geändert werden. Zusätzlich ließe sich dabei noch etwas für die Sicherheit tun. Den Teil mit den Umlauten habe ich jetzt nicht getestet.

Code: Alles auswählen

// Sollte eines der ersten Zeilen sein	
 
if &#40;function_exists&#40;"date_default_timezone_set"&#41;&#41;&#123;date_default_timezone_set&#40;"Europe/Berlin"&#41;;&#125;	


// Geänderte Zeilen bei der Speicherung

	$datei = "datei-".date&#40;"m"&#41;."-".date&#40;"Y"&#41;.".txt";
	$eintrag = $params&#91;'q'&#93;."\n";

	$eing = array&#40;"%C3%84","%C3%A4","%C3%96","%C3%B6","%C3%9C","%C3%BC","%C3%9F"&#41;;
	$ausg = array&#40;"Ä","ä","Ö","ö","Ü","ü","ß"&#41;;
	$eintrag = str_replace&#40;$eing,$ausg,$eintrag&#41;;

	$eintrag = preg_replace&#40;"/&#91;^a-zA-ZäöüÄÖÜß0-9\s&#93;/", " ", $eintrag&#41;;

	$handle = fopen&#40;$datei,"a"&#41;;
	fputs&#40;$handle,$eintrag&#41;;
	fclose&#40;$handle&#41;;	 
		 
// Geänderte Zeile bei der Ausgabe

if &#40;file_exists&#40;$datei&#41;&#41; &#123;$lines = file&#40;$datei, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES&#41;;&#125;		 

    else &#123;echo "Noch keine Daten vorhanden!";&#125;		 
Überdenkenswert wäre ein Schimpfwortfilter sicherlich, doch wenn ich da an die Variationsmöglichkeiten denke, so wäre der Aufwand erheblich.

mgutt
PostRank 10
PostRank 10
Beiträge: 3206
Registriert: 08.03.2005, 13:13

Beitrag von mgutt » 15.05.2011, 17:43

Wenn ich Dir als q eine 100.000 Zeichen lange Phrase übergebe wars das mit der Erreichbarkeit der Seite. Da hilft 1x im Monat löschen herzlich wenig. Das gleiche gilt für 100.000 Phrasen in ein paar Tagen. Irgendwann erreicht man das memory_limit und dann steht da nur noch eine lustige Fehlermeldung auf der Seite.

Klar wenn keiner weiß was Du gebastelt hast, kannst Du das machen, aber mir wäre das zu heiß. Es gibt zu viele Leute, die einfach mal herumspielen und wenn die merken, dass Angriffspotential vorhanden ist, nutzen sie das auch aus.

Zum Schimpfwortfilter kann ich übrigens sagen, dass ich genau wg. einer solchen Funktion Kontakt mit dem Landeskriminalamt hatte, weil sich jemand den "Witz" erlaubt hat und KiPo-Begriffe auf die Seite gebracht hat. Ich will Dich mal sehen, wenn Dich die Leute vom LKA anrufen.

Ich bekomme übrigens auch regelmäßig Beschwerden von Personen, die sich selbst gesucht haben und ihr Persönlichkeitsrecht verletzt sehen. Ich hatte da einen Fall, wo ein Autor einen Namen hatte und im Text noch ein Wort stand, so dass sich aus den beiden Begriffen ein Name ergab, der erst auf der Seite komplett erschien, als die suchende Person auf meine Seite klickte. Dagegen kann man allerdings nichts machen außer manuell eingreifen.

Wie man sieht habe ich die eine oder andere Erfahrung damit gemacht :lol:
Ich kaufe Dein Forum!
Kontaktdaten

Melegrian
PostRank 10
PostRank 10
Beiträge: 3170
Registriert: 30.01.2005, 12:36

Beitrag von Melegrian » 15.05.2011, 18:35

Du hast ja Recht, hatte auch schon einige Angriffe, wobei es nur um 10.000 Aufrufe pro Stunde ging. Die versuchten es über PROPFIND und seit dem ich diese Methode über die htaccess ausgeschlossen habe, ist eigentlich Ruhe eingekehrt. Zweimal waren dadurch meine Statistiken hin, doch die sind ja nicht im Index und beeinträchtigen nicht die Ladezeiten meiner Seiten.

Die andere Seite ist, ich habe nur eine Unterseite, wo ich die letzten Eingaben von der internen Suche anzeige, alle anderen Statistiken behalte ich lieber für mich und zeige die nicht an. Bei der internen Suche ist die Eingabe vom Formular und bei GET der Suchbegriff im Refferer auf 60 Zeichen begrenzt und zusätzlich das Script auf 60 Sucheingaben pro Stunde pro IP. Beim Refferer könnte man bei diesem Script hier noch die Länge überwachen, das stimmt.

Code: Alles auswählen

// Geänderte Zeile bei der Speicherung
	
	$eintrag = preg_replace&#40;"/&#91;^a-zA-ZäöüÄÖÜß0-9\s&#93;/", " ", $eintrag&#41;;
	$eintrag = substr&#40;$eintrag, 0, 120&#41;;

Wie stellst Du Dir so eine Schimpfwortliste vor? Da gibt es doch kaum kontrollierbare Phrasen, könnte ich mir zumindest vorstellen.

Alles im Zusammenhang noch einmal, zwar ohne Begrenzung der Zugriffe von einer IP, dafür mit einer Begrenzung der Anzahl der max. Einträge pro Monat und Begrenzung der Anzahl an Zeichen.

Code: Alles auswählen

<?php
if &#40;function_exists&#40;"date_default_timezone_set"&#41;&#41;&#123;date_default_timezone_set&#40;"Europe/Berlin"&#41;;&#125;
   
   $datei = "datei-".date&#40;"m"&#41;."-".date&#40;"Y"&#41;.".txt";
   
// Prüfen, ob HTTP_REFERER vorhanden
if&#40;isset&#40;$_SERVER&#91;'HTTP_REFERER'&#93;&#41; AND !empty&#40;$_SERVER&#91;'HTTP_REFERER'&#93;&#41;&#41;
&#123;
   // Referer zerlegen
   $referer = parse_url&#40;$_SERVER&#91;'HTTP_REFERER'&#93;&#41;;

   // Eigene Domain und Existenz von Query prüfen
   if&#40;$referer&#91;'host'&#93; != 'deine-domain.de' AND isset&#40;$referer&#91;'query'&#93;&#41;&#41;
   &#123;
      // q braucht es hier nicht, da q = q bleibt
      $refeins = array&#40;"query=","su=","p="&#41;;
      $refzwei = array&#40;"q=","q=","q="&#41;;
      $refdrei = str_replace&#40;$refeins,$refzwei,$referer&#91;'query'&#93;&#41;;

      // Query-String zerlegen
      parse_str&#40;$refdrei, $params&#41;;

      if&#40;!isset&#40;$params&#91;'q'&#93;&#41; OR empty&#40;$params&#91;'q'&#93;&#41;&#41;
      &#123;
         $auswahl = 'beliebiger Begriff';
      &#125;
      else
      &#123;
         $auswahl = $params&#91;'q'&#93;;
         $auswahl = substr&#40;$auswahl, 0, 120&#41;;      
         $eintrag = utf8_decode&#40;$params&#91;'q'&#93;&#41;."\n";

    // Alles außer Zahlen und Buchstaben rauswerfen und überlange Anfragen auf 120 Zeichen kürzen
       $eintrag = preg_replace&#40;"/&#91;^a-zA-ZäöüÄÖÜß0-9\s&#93;/", " ", $eintrag&#41;;
       $eintrag = substr&#40;$eintrag, 0, 120&#41;;

		 
   // Anzahl von Einträgen in Datei auf max. 10.000 pro Monat begrenzt   
   if &#40;file_exists&#40;$datei&#41;&#41; &#123;
      
       if &#40;count&#40;file&#40;$datei&#41;&#41; < 10000&#41;&#123;
 
       $handle = fopen&#40;$datei,"a"&#41;;
       fputs&#40;$handle,$eintrag&#41;;
       fclose&#40;$handle&#41;;   
      &#125;&#125;
     else &#123;file_put_contents&#40;$datei, $eintrag&#41;;&#125;
       &#125;
   &#125;
   else
   &#123;
      $auswahl = 'beliebiger Begriff';
   &#125;

   echo "<a href=\"http&#58;//www.crawl-it.de/crawlit/registration/search.it?p_userid=000000&p_search=" .htmlentities&#40;$auswahl, ENT_QUOTES&#41;. "\" target=\"self\" style=\"text-decoration&#58; none\">Deine Suchergebnisse zu " .htmlentities&#40;$auswahl, ENT_QUOTES&#41;. "</a> | ";
&#125;

?> 
Ausgabe

Code: Alles auswählen

<?php
if &#40;function_exists&#40;"date_default_timezone_set"&#41;&#41;&#123;date_default_timezone_set&#40;"Europe/Berlin"&#41;;&#125; 
   
   $datei = "datei-".date&#40;"m"&#41;."-".date&#40;"Y"&#41;.".txt";


if &#40;file_exists&#40;$datei&#41;&#41; &#123;$lines = file&#40;$datei, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES&#41;;&#125;      

    else &#123;echo "Noch keine Daten vorhanden!";&#125; 
	
    $alle  = count&#40;$lines&#41;;

        // Ausgabe der letzten 20 Einträge
		if &#40;$alle > 0&#41;&#123;
		
		krsort&#40;$lines&#41;;

		$zeige_an = 20;

		if&#40;$alle > $zeige_an&#41;&#123;$zeige = $zeige_an;
			   &#125;
		  else &#123;$zeige = $alle;
			   &#125;

		for &#40;$start = 0; $start < $zeige; $start++&#41;&#123;

		   echo htmlentities&#40;$lines&#91;$start&#93;, ENT_QUOTES&#41;."<br />\n";
		&#125;&#125;

echo "<hr />\n";


        // Ausgabe der 20 häufigsten Einträge
		if &#40;$alle > 0&#41;&#123;

		$line = array_count_values&#40;$lines&#41;;
		arsort&#40;$line&#41;;

		$starte = 0;

		foreach &#40;$line as $worte => $anzahl&#41; &#123;$starte++;
		   
		   echo htmlentities&#40;$anzahl." x ".$worte, ENT_QUOTES&#41;."<br />\n";
		   
		   if&#40;$starte > &#40;20 -1&#41;&#41; &#123;break;&#125;
		&#125;&#125; 
?>

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag