PHP if-Abfragen zusammenfassen? Bin am verzweifeln :(
Guten Abend allerseits,
ich bin seit Tagen wieder mit Erfolg an meinem Gästebuch. Ich bin endlich den lästigen Spam losgeworden, worum ich auch froh bin, doch ein Problem regt mich schon seit Stunden auf... . Ich probiere if-Abfragen zusammenzufassen, weiß jemand wie ich das hinbekomme? Ich möchte halt, dass bei folgenden "Keywords" nur EIN $err_text ausgegeben wird. Die Abfrage sieht folgendermaßen aus:
<?php
if(strpos($gb_text, "http://") !== false ||
ereg("(www.[a-zA-Z0-9_-]+)\.([a-zA-Z0-9.]+)",$gb_text)) {
$err_text .= "Bitte keine URLs posten!";
}
if(strpos($gb_text, "<url>") !== false) {
$err_text .= "<br>";
}
if(strpos($gb_text, "<a href=") !== false) {
$err_text .= "<br>";
}
?>
Antwort schreiben
Antwort 1 von son_quatsch vom 03.06.2021, 08:38 Options
<?php
if ( preg_match( '#(www\\.[a-z0-9_-]+\\.[a-z0-9]+|http://|<url>|<a\\s+href=)#i', $gb_text ) ) {
$err_text.= 'Bitte keine URLs posten!';
}
?>
Das schützt dich dennoch nicht vor HTML-Code usw. - es bleibt weiterhin ungeprüft.
Antwort 2 von maine14 vom 03.06.2021, 10:49 Options
Wow, vielen Dank, das erste Forum, indem ich mal einen nützlichen Post zu meiner Frage erhalte, anstatt immer nur abweichende Themen... . ;) Ich werde öfters hier her kommen^^
Ganz liebe Grüße,
Maine17 :)
Antwort 3 von Supermax vom 03.06.2021, 12:29 Options
Wenn ich in meinen Projekten mehrere Fehlerquellen abfange, dann mache ich es so, daß ich ein Array anlege, etwaige Fehlermeldung als eigene Elemente an das Array anhänge und dann die einzelnen Array-Elemente mit implode() zusammenhänge, also
$errors = array();
if (fehlerbedingung1) {
$errors[] = 'Fehler 1 ist aufgetreten';
}
if (fehlerbedingung2) {
$errors[] = 'Fehler 2 ist aufgetreten';
}
// usw.
if (count($errors)>0) {
echo implode('<br>',$errors);
} else {
// weitere Verarbeitung
}
Auf diese Weise kann ich nicht nur mehrere Fehler schön zusammenhängen, sondern habe in count($errors) auch gleich einen Indikator, ob und wie viele Fehler aufgetreten sind.
Antwort 4 von maine14 vom 03.06.2021, 12:33 Options
Vorhin kam schon wieder ein langen Spameintrag rein. Wie machen das die Spammer trotz alles Fallen? Ich habe ein unsichtbares Feld, ich filter die Einträge und frage ab, ob URLs enthalten sind, ich bin langsam wirklich am Verzweifeln! :(
Antwort 5 von son_quatsch vom 03.06.2021, 12:38 Options
Spameinträge sind meist automatisiert, sprich: Programmen ist es vollkommen egal, ob da etwas "unsichtbar" ist oder nicht.
Wie äußert sich denn der Spam? Generell ungewollt? Oder sind Texte reingekommen, die bösartig sind und die du zumindest gerne ungefährlich machen willst?
Antwort 6 von maine14 vom 03.06.2021, 12:42 Options
Na ja, ich würde es mal so sehen, für eine Webseite wie meine passen einfach keine Links von Pornoseiten...
Antwort 7 von Supermax vom 03.06.2021, 12:53 Options
Wie sieht denn dein verstecktes Feld aus?
Antwort 8 von maine14 vom 03.06.2021, 13:10 Options
Zitat:
Wie sieht denn dein verstecktes Feld aus?
Unsichtbares Feld:<input type="text" id="mail" name="mail" value="" class="p_send" />
CSS}
.p_send {
position: relative;
visibility: hidden;
}
PHP if-Abfrage: }
if ('' !== $_POST['mail']) {
$err_text .= "Da Dein Eintrag verdacht auf Spam enthält, wird diese nicht gespeichert!<br>";
} else {
// Daten verarbeiten
}
Antwort 9 von maine14 vom 03.06.2021, 13:12 Options
Wenn ich das Feld "mail" ausfülle, erscheint ja auch der angegeben $err_text, trotzdem schaffen es die Spammer irgendwie alles zu umgehen! :(
Antwort 10 von son_quatsch vom 03.06.2021, 15:00 Options
Oh ok - das ist gar nicht schlecht. Trotzdem lässt sich umgekehrt per JS/Dom genausogut auch rausfinden, ob ein INPUT sichtbar oder unsichtbar ist. Zu guter Letzt kann auch immernoch ein Mensch dahintersitzen.
Antwort 11 von Supermax vom 03.06.2021, 17:17 Options
Gegen menschliche Spammer hilft der Einsatz eines CAPTCHAs z.B.
reCAPTCHA. Gegen Bots verwende ich ein zufällig generiertes "Token", das sich bei jedem Seitenaufruf ändert; nur wenn vorher das Formular aufgerufen wurde, ist das Token beim POST gesetzt, andernfalls wurde das Script direkt aufgerufen, also vermutlich durch einen Bot.
Antwort 12 von maine14 vom 03.06.2021, 17:23 Options
Kannst du mir mal bitte so ein Token-Script posten? :) In anderen Gästebüchern, bei denen keine Captchas oder unsichtbare Inputs genutzt werden ist ja auch kein Spam... :(
Antwort 13 von son_quatsch vom 04.06.2021, 07:56 Options
egen Bots verwende ich ein zufällig generiertes "Token", das sich bei jedem Seitenaufruf ändert;
Du meinst hoffentlich,
welches sich für die jeweilige Benutzersitzung bei jedem Seitenaufruf ändert. Andernfalls ruft ein Besucher die Seite auf - und während der schreibt, ruft der nächste Gast die Seite auf und generiert damit wieder ein neues, welches nicht mehr zu dem des ersten Besuchers passt.
Antwort 14 von Supermax vom 04.06.2021, 08:10 Options
Ja natürlich, das Token wird in der Session gespeichert und beim POST das übergebene Token mit dem Session-Wert verglichen, also
<?php
$_SESSION['token'] = md5(microtime());
//...
?>
<form>....
<input type="hidden" name="t" value="<?php echo $_SESSION['token'] ?>">
</form>
In dem Script/Code, der die POST-Daten überprüft steht dann
if ( (strlen($_POST['t'])==0) || ($_POST['t'] != $_SESSION['token']) ) {
$error[] = 'Sicherheitscode ungültig';
}
Antwort 15 von maine14 vom 04.06.2021, 11:26 Options
Zitat:
In dem Script/Code, der die POST-Daten überprüft steht dann
if ( (strlen($_POST['t'])==0) || ($_POST['t'] != $_SESSION['token']) ) {
$error[] = 'Sicherheitscode ungültig';
}
Okay, habe es mal eingebaut, hoffe, dass es funktioniert... :D Kann ich das vielleicht so abändern, dass es in meinen $err_text miteingebunden wird?
Bsp.:
if ( (strlen($_POST['t'])==0) || ($_POST['t'] != $_SESSION['token']) ) {
$err_text .= "Sicherheitscode ungültig!";
}
Antwort 16 von maine14 vom 04.06.2021, 12:36 Options
Das hat nichts gebracht, es kam wieder Spam rein! :( Ich bin echt am verzweifeln, bin schon am überlegen ob ich's einfach überfluten lasse oder gleich lösche, hat ja dann auch keinen Sinn mehr! :(
Antwort 17 von son_quatsch vom 04.06.2021, 12:47 Options
Beendest du das Skript denn überhaupt, wenn du Meldungen ausgibst - oder trägt es dennoch alle Daten in *wo auch immer* ein? Zeig uns bitte das komplette Skript.
Antwort 18 von maine14 vom 04.06.2021, 13:17 Options
Antwort 19 von son_quatsch vom 04.06.2021, 13:40 Options
Zitat:
if ( (strlen($_POST['t'])==0) || ($_POST['t'] != $_SESSION['token']) ) {
$error[] = 'Sicherheitscode ungültig';
}
$CodeValid = 1;
Das Token ist wirkungslos - du musst natürlich den Text in
$err_text reinschieben, denn später prüfst du nicht, ob
$error Werte enthält. Und warum setzt du
$CodeValid auf 1??
Antwort 20 von maine14 vom 04.06.2021, 13:52 Options
Habe ich nicht, das stand da schon^^ Ich nutze ja ein Fertiggästebuch und habe es nur abgeändert! ;)
Also muss ich es dann so einsetzen:
if ( (strlen($_POST['t'])==0) || ($_POST['t'] != $_SESSION['token']) ) {
$err_text .= "Sicherheitscode ungültig!";
}
?