Zur Navigation

Maßnahmen gegen Plagiate, Spambots etc. [2]

11 Ranma (Gast)

Falls man Arbeit einsparen (also nicht beim programmieren, sondern danach beim Betrieb) könnte, dann sollte sich das schon lohnen. Es geht nämlich das Gerücht um, daß Moderatoren, die für ein privates Forum ihre Freizeit opfern, schwer zu finden wären.
Ranma

19.04.2015 04:37

12 Jörg Kruse

Zitat von Jörg
Ich denke nicht, dass sich so etwas auf einfache Weise automatisieren lässt

Das "auf einfache Weise" hätte ich besser weglassen sollen, weil missverständlich. Firmen wie Google arbeiten daran, semantische Relationen über Algorithmen zu erfassen. Das ist nichts, was man eben programmiert, sondern setzt eine Entwicklung und Forschung von vielen Jahren voraus, sowie ein größeres Team von Spezialisten. Als PHP-Programmierer spielt man da in einer anderen Liga :)

19.04.2015 20:03 | geändert: 19.04.2015 20:04

13 Ranma (Gast)

Dabei würde ich mich noch nichtmal als PHP-Programmierer bezeichnen, sondern nur als jemand, der mit den Defiziten der frei verfügbaren Skripte nicht zurechtkommt und darum sich selbst daran gemacht hat, eine Lösung zu finden. Beim Versuch programmieren zu lernen, habe ich schon ein paarmal versagt. PHP finde ich um einiges einfacher als vollwertigere Programmiersprachen. Aber schon bei JavaScript habe ich mir das angesehen und befunden, daß es sehr kompliziert ist und nur eingeschränkt verwendbar und keinesfalls den Aufwand lohnt.
Ranma

20.04.2015 05:10

14 Ranma (Gast)

Jetzt aber wieder zurück zum eigentlichen Thema. Ich wollte (unter anderem) Plagiate und Zitate als solche kennzeichnen. Das macht folgende Zeile Code:

$Kopie=preg_replace('#(?<=^)('.$Original.')(?=$)#umiU','<p class="Zitat">\1</p>',$Kopie);

Dazu braucht es natürlich noch eine Zeile dazu passendes CSS. Mit span statt p hat es nicht funktioniert, also ist ein Abstand noch lange kein Absatz und einen Absatz kann man wohl mittels CSS nicht erzeugen. Macht aber nichts, weil es mit p funktioniert.

Das Problem ist nun folgendes. $Original könnte Zeichen enthalten, die in einem RegEx eine besondere Bedeutung haben. Wie verhindere ich, daß die Zeichen innerhalb der Variable als Metazeichen interpretiert werden?

Mein Test verlief problemlos, aber mein Text war kurz und ohne mögliche Metazeichen. Außerdem sollte \. auf . passen, also ist das nicht so leicht festzustellen. Aber steht in einem Text mal ein Emoticon-Ersatz wie *lol*, dann sollte sich das katastrophal auswirken?
Ranma

20.04.2015 05:19

15 Jörg Kruse

Das Problem ist nun folgendes. $Original könnte Zeichen enthalten, die in einem RegEx eine besondere Bedeutung haben. Wie verhindere ich, daß die Zeichen innerhalb der Variable als Metazeichen interpretiert werden?

Das sollte mit der Funktion preg_quote() gehen.

20.04.2015 21:19

16 Ranma (Gast)

Ja, Erklärungen zu preg_quote() hatte ich früher nicht verstanden, weil mir irgendwie die passende Fragestellung dazu fehlte. Aber paßt sie jetzt?

preg_quote() entschärft tatsächlich erfolgreich alles, was in einem RegEx als Metazeichen in Frage kommt. Aber wenn ich $Original durch preg_quote($Original) ersetze, dann wird im Vergleich zu vorher der Treffer nicht mehr als solcher erkannt. Die ganze Zeile Code verliert dadurch ihre Funktion.

Nun könnte man sagen, ist ja logisch, die gleichen entschärfenden Backslashes muß man halt für den Vergleich noch in $Kopie einfügen. Sinnvollerweise wohl da, wo die Variable innerhalb von preg_replace steht, weil am Anfang der Zeile nur noch das Ergebnis in die Variable gepackt wird. Der Vergleich von preg_quote($Original) mit preg_quote($Kopie) führt dazu, daß gleich alle Formatierungen (die schon klickbar gemachten URI) gesprengt werden und der gesamte Text mit vielen Backslashes verunstaltet wird.

Eigentlich wäre es doch sinnvoll, wenn preg_quote() den Inhalt der Variable nicht veränderte, sondern lediglich für die Dauer der Suche die möglichen Metazeichen entschärfte? Mit der kleinen Veränderung kann ich kaum einen Fehler eingebaut haben?
Ranma

22.04.2015 08:07

17 Jörg Kruse

Aber wenn ich $Original durch preg_quote($Original) ersetze, dann wird im Vergleich zu vorher der Treffer nicht mehr als solcher erkannt.

Kannst du mal Beispiel-Strings für $Kopie und $Original posten, anhand derer man das Problem nachvollziehen kann?

22.04.2015 16:33

18 Ranma (Gast)

Der Effekt des Veröffentlichens hat wieder zuverlässig weitergeholfen. Mit preg_quote() funktioniert es tatsächlich genauso wie man es erwarten würde, vorausgesetzt die Zeilenumbrüche (nach denen der RegEx in den lookarounds schaut) im String werden durch "\n" erzeugt. Man kann seltsamerweise noch nl2br() darauf anwenden, ohne daß das stört, aber <br/> ist einfach kein Treffer.

Dann muß ich wohl noch sicherstellen, daß alle Zeilenumbrüche aus \n bestehen, aber wie?

Übrigens, verwendet man strip_tags() noch oder ist das durch das sowieso wichtigere htmlentities() überflüssig?
Ranma

24.04.2015 00:25

19 Jörg Kruse

Man kann seltsamerweise noch nl2br() darauf anwenden, ohne daß das stört, aber <br/> ist einfach kein Treffer.

nl2br() fügt "<br />" mit einem Leerzeichen vor dem "/" ein

Die "<br/>" könntest du einfach mit str_replace() entfernen

Übrigens, verwendet man strip_tags() noch oder ist das durch das sowieso wichtigere htmlentities() überflüssig?

Ein Einsatzszenario für strip_tags():

Eine Überschrift, welche Tags wie z.B. <strong> enthalten kann, soll sowohl im <h1> als auch im <title> verwendet werden. Für letztere sollte die Überschrift noch mit strip_tags() behandelt werden, da ein Title-Tag keine weiteren HTML-Elemente enthalten kann. Man möchte ja nicht, dass im Title die HTML-Tags als solche angezeigt werden, so dass ein Einsatz von htmlemtities() hier nicht in Frage kommt.

24.04.2015 10:39 | geändert: 24.04.2015 10:41

20 Ranma (Gast)

Das wäre dann aber keine Anwendung aus Sicherheitsgründen, weil das title-tag selbst schon so etwas wie <script> entschärfen würde?

Mich hatte an strip_tags() gestört, daß es keine Erfolgsmeldung mitliefert, so daß man nicht sicher sein könnte auch < <script <script> > script> entschärft zu haben. Aber dafür habe ich inzwischen eine Lösung gefunden. Eine Lösung, für die mir jetzt wohl die Anwendung fehlt.
Ranma

26.04.2015 03:35