Kaputte Länder-Erkennung in Antispam Bee

Antispam Bee hatte schon vor Jahren eine Länder-Erkennung. Leider wurde die Google-API dahinter irgendwann kostenpflichtig und so hatte Sergej die Funktion schweren Herzens wieder entfernt. Später baute er selbst ip2country.info, um genau dieses Feature als Pull Request wieder Antispam Bee anzubieten. Der Vorteil dieser Lösung ist, dass kein API-Key erforderlich ist. Die Anfrage enthält eine IP-Adresse und zurück kommt ein Ländercode. So einfach wie genial. Aber ein Server kostet Geld und irgendwann hat Sergej das Projekt weiter gegeben. Doch die neue Firma baut um und so beginnen die Probleme …

Das Ganze fiel leider nur zufällig auf, als ich die Website aufrief und folgende Nachricht sah:

IP2country is joining ipapi.com to offer an even more advanced IP API, now offering IP address geolocation & reverse IP lookups in real-time at an unparalleled level of accuracy. To keep using our API, switch to ipapi.com and get your free API key.

Eine Rückfrage bei Sergej bestätigt, dass dies schon vor längerer Zeit wegen der Kosten passiert ist. Der neue Inhaber hatte noch eine Zeit lang durchgehalten, aber irgendwann ging es da auch weiter. Er gab uns allerdings noch einen Tipp zu einem anderen Dienst, iplocate.io, der zumindest 1000 Requests pro Tag kostenfrei und ohne API-Key anbietet.

In unseren wöchentlichem Antispam Bee Meeting diskutierten wir dann mögliche Vorgehensweisen. Die Entscheidung fiel auf einen Umbau zum dem neuen Tipp von Sergej. Matthias Pfefferle baute schon mal den Pull Request. Damit Power User oder Menschen mit massiven Kommentaren und/oder großen Shared Hostern, die eine IP teilen, keine Probleme bekommen, bauten wir noch zusätzlich Möglichkeiten ein eine komplett eigene API einzubinden und/oder iplocate.io mit einem API-Key zu betreiben.

Doch dabei fiel uns etwas auf. Und zwar nichts Gutes …

Eigentlich kommt bei einer Anfrage an die ip2country-API ein JSON-kodiertes Ergebnis zurück. Ich erwartete also, dass in Antispam Bee ebenfalls dieses JSON-Ergebnis ausgewertet wird. Doch das wird es gar nicht.

Es wird nur der Head abgefragt:

$response = wp_safe_remote_head(
			esc_url_raw(
				sprintf(
					'https://api.ip2country.info/ip?%s',
					self::_anonymize_ip( $ip )
				),
				'https'
			)
		);

Und dann nach einer bestimmten Headerzeile geschaut:

$country = (string) wp_remote_retrieve_header( $response, 'x-country-code' );

Doch leider existiert diese Headerzeile inzwischen gar nicht mehr. Vielleicht weil der neue Inhaber inzwischen Cloudflare nutzt. Nun ist es jedoch so, dass einfach gar nichts passiert, wenn dieser Header nicht existiert:

if ( empty( $country ) || strlen( $country ) !== 2 ) {
			return false;
		}

Wir springen aus der Funktion und nichts wird als Spam markiert. Die Funktion ist also aktuell komplett wirkungslos. Als ob sie gar nicht aktiviert wäre.

Dieser Bug wird natürlich in der nächsten Version gefixt und hoffentlich reichen die 1000 Requests pro Tag von iplocate.io für diejenigen aus, die das Feature aktiviert haben. Aber es lehrt uns vor allem eins: Funktionen, insbesondere externe, müssen immer getestet werden, ob sie immer noch das tun, was sie sollen.

Falls jemand Ahnung von Behat hat und eine Idee hat, wie das bei Antispam Bee getestet werden kann, wir freuen uns immer über Mithilfe und Pull Requests!

3 Antworten auf Kaputte Länder-Erkennung in Antispam Bee

  1. Reichen bei solch einfachen PHP Funktionen nicht einfache PHPUnit Tests? Die kann man schön einfach mit Github Actions automatisiert einbauen.

    • Wenn ich das richtig verstanden habe, dann ist das Problem, dass der WP-Kontext nicht vorhanden ist, wenn die Unit-Tests laufen. Du kannst gerne in Slack oder auf Github mitmachen. Wir freuen uns über Input und/oder PRs!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.