Avatar

SPAM Einträge ohne tid bzw. id != tid (Bugs)

by Micha ⌂, Thursday, July 02, 2020, 21:14 (1387 days ago)

Hallo zusammen,

ich habe in meinem Forum bemerkt, dass ich eine Menge SPAM postings habe, bei denen die tid = 0 ist.

[image]

Wenn ich jetzt die Funktion delete_posting_recursive() verwende, löscht die diese SPAM-Nachrichten nicht, da

$ids_result = mysqli_query($connid, "SELECT id FROM " . $db_settings['forum_table'] . " WHERE tid = " . intval($id));

nicht funktioniert (da tid != id).

Den SQL leicht anzupassen, ist sicher möglich, d.h.,

$ids_result = mysqli_query($connid, "SELECT id FROM `" . $db_settings['forum_table'] . " WHERE tid = " . intval($id)) . " OR id = " . intval($id));

würde dieses Problem direkt lösen (sowie ein paar Zeilen weiter unten beim DELETE).

Die geänderten SQLs würde ich mal hochladen. Das OR ist ansonsten unkritisch.

Was mich aber eher wundert ist die Tatsache, dass diese Einträge überhaupt erstellt werden können (also die Ursache). Hier im Forum hatten wir schon ab und zu mal Anfragen, dass Threads nicht gelöscht werden können (und keinen Titel besitzen):

[image]

Wir haben den Leuten dann immer empfohlen via PHPMyAdmin das Löschen vorzunehmen. Möglicherweise gibt es hier einen Zusammenhang.

Eine von Euch das auch schon mal gehabt?

Viele Grüße
Micha

--
applied-geodesy.org - OpenSource Least-Squares Adjustment Software for Geodetic Sciences

Avatar

SPAM Einträge ohne tid bzw. id != tid

by Micha ⌂, Friday, July 03, 2020, 08:21 (1387 days ago) @ Micha

Hallo,

ich habe ein wenig weiter gesucht nach der Ursache. Ich meine, das Problem liegt an den (geänderten) daily_actions:

Dort wird SPAM derzeit(automatisch) mit einem SQL entfernt:

@mysqli_query($connid, "DELETE FROM `". $db_settings['forum_table'] ."` WHERE `time` < (NOW() - INTERVAL ". intval($settings['auto_delete_spam']) ." HOUR) AND 
         `id` IN (SELECT `". $db_settings['akismet_rating_table'] ."`.`eid` 
         FROM `". $db_settings['akismet_rating_table'] ."` 
         JOIN `". $db_settings['b8_rating_table'] ."` ON `". $db_settings['akismet_rating_table'] ."`.`eid` = `". $db_settings['b8_rating_table'] ."`.`eid` 
         WHERE `". $db_settings['akismet_rating_table'] ."`.`spam` = 1 OR `". $db_settings['b8_rating_table'] ."`.`spam` = 1); ");

Das funktioniert auch zuverlässig. ABER: die ids des jeweiligen Postings stehen noch in anderen Tabellen drin, siehe die Liste an abhängigen Tabellen
in delete_posting_recursive.

Wenn aber nur die Postings entfernt werden, dann bleiben die ids in den anderen Tabellen enthalten. Ein neuer Eintrag führt dann u.U. zu einer Kollision, wodurch das Script abgebrochen ist, bevor die tid gesetzt wurde.

Ich habe zwei Lösungsvorschläge für die daily_actions:

Wir lösen es via SQL, indem wir die abhängigen Tabellen auch bereinigen:

   @mysqli_query($connid, "DELETE FROM `". $db_settings['forum_table'] ."` WHERE `time` < (NOW() - INTERVAL ". intval($settings['auto_delete_spam']) ." HOUR) AND 
         `id` IN (SELECT `". $db_settings['akismet_rating_table'] ."`.`eid` 
         FROM `". $db_settings['akismet_rating_table'] ."` 
         JOIN `". $db_settings['b8_rating_table'] ."` ON `". $db_settings['akismet_rating_table'] ."`.`eid` = `". $db_settings['b8_rating_table'] ."`.`eid` 
         WHERE `". $db_settings['akismet_rating_table'] ."`.`spam` = 1 OR `". $db_settings['b8_rating_table'] ."`.`spam` = 1); ");
 
   // DELETE dependent entries - see delete_posting_recursive
   @mysqli_query($connid, "DELETE FROM `". $db_settings['entry_cache_table'] ."`    WHERE `cache_id`   NOT IN (SELECT `id` FROM `". $db_settings['forum_table'] ."`); ");         
   @mysqli_query($connid, "DELETE FROM `". $db_settings['bookmark_table'] ."`       WHERE `posting_id` NOT IN (SELECT `id` FROM `". $db_settings['forum_table'] ."`); ");
   @mysqli_query($connid, "DELETE FROM `". $db_settings['read_status_table'] ."`    WHERE `posting_id` NOT IN (SELECT `id` FROM `". $db_settings['forum_table'] ."`); ");
   @mysqli_query($connid, "DELETE FROM `". $db_settings['entry_tags_table'] ."`     WHERE `bid`        NOT IN (SELECT `id` FROM `". $db_settings['forum_table'] ."`); ");
   @mysqli_query($connid, "DELETE FROM `". $db_settings['subscriptions_table'] ."`  WHERE `eid`        NOT IN (SELECT `id` FROM `". $db_settings['forum_table'] ."`); ");
   @mysqli_query($connid, "DELETE FROM `". $db_settings['akismet_rating_table'] ."` WHERE `eid`        NOT IN (SELECT `id` FROM `". $db_settings['forum_table'] ."`); ");
   @mysqli_query($connid, "DELETE FROM `". $db_settings['b8_rating_table'] ."`      WHERE `eid`        NOT IN (SELECT `id` FROM `". $db_settings['forum_table'] ."`); ");


Die Lösung hat das Problem, dass wir nun an zwei Stellen das Löschen beachten müssen. Daher die Alternative, bei der die delete_posting_recursive direkt aufgerufen wird.

$spam_ids_result = mysqli_query($connid, "SELECT `id` FROM `" . $db_settings['forum_table'] ."` WHERE `time` < (NOW() - INTERVAL ". intval($settings['auto_delete_spam']) ." HOUR) AND 
         `id` IN (SELECT `". $db_settings['akismet_rating_table'] ."`.`eid` 
         FROM `". $db_settings['akismet_rating_table'] ."` 
         JOIN `". $db_settings['b8_rating_table'] ."` ON `". $db_settings['akismet_rating_table'] ."`.`eid` = `". $db_settings['b8_rating_table'] ."`.`eid` 
         WHERE `". $db_settings['akismet_rating_table'] ."`.`spam` = 1 OR `". $db_settings['b8_rating_table'] ."`.`spam` = 1); ");
 
   while ($spam_ids_data = mysqli_fetch_array($spam_ids_result)) {
    delete_posting_recursive(intval($spam_ids_data['id']));
   }

Was denkt Ihr?

/Micha

--
applied-geodesy.org - OpenSource Least-Squares Adjustment Software for Geodetic Sciences

Avatar

SPAM Einträge ohne tid bzw. id != tid

by Micha ⌂, Saturday, July 04, 2020, 14:23 (1386 days ago) @ Micha

Hallo,

ich habe es eingepflegt.

Viele Grüße
Micha

--
applied-geodesy.org - OpenSource Least-Squares Adjustment Software for Geodetic Sciences

RSS Feed of thread