2025/07/21

Pain Poin  Melihat Log Error terdapat seperti ini: [18-Jul-2025 09:05:30 UTC] WordPress database error Illegal mix of collations (latin1_swe...

Membuat Plugin Untuk Melindungi Search Wordpress

Pain Poin 

Melihat Log Error terdapat seperti ini:

[18-Jul-2025 09:05:30 UTC] WordPress database error Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8mb4_unicode_520_ci,COERCIBLE) for operation 'like' for query SELECT SQL_CALC_FOUND_ROWS telu19_posts.ID FROM telu19_posts LEFT JOIN telu19_icl_translations wpml_translations ON telu19_posts.ID = wpml_translations.element_id AND wpml_translations.element_type = CONCAT('post_', telu19_posts.post_type) WHERE 1=1 AND (((telu19_posts.post_title LIKE '%slot pulsa ❤️K888VIP.io❤️ Daftar dan dapatkan bonus slot pulsa ⚡⚡⚡ slot pulsa ❤️K888VIP.com❤️ Daftar dan dapatkan bonus slot pulsa%') OR (telu19_posts.post_excerpt LIKE '%slot pulsa ❤️K888VIP.io❤️ Daftar dan dapatkan bonus slot pulsa ⚡⚡⚡ slot pulsa ❤️K888VIP.com❤️ Daftar dan dapatkan bonus slot pulsa%') OR (telu19_posts.post_content LIKE '%slot pulsa ❤️K888VIP.io❤️ Daftar dan dapatkan bonus slot pulsa ⚡⚡⚡ slot pulsa ❤️K888VIP.com❤️ Daftar dan dapatkan bonus slot pulsa%'))) AND (telu19_posts.post_password = '') AND ((telu19_posts.post_type = 'ac_event' AND (telu19_posts.post_status = 'publish')) OR (telu19_posts.post_type = 'ac_gallery' AND (telu19_posts.post_status = 'publish')) OR (telu19_posts.post_type = 'ac_research' AND (telu19_posts.post_status = 'publish')) OR (telu19_posts.post_type = 'ac_testimonial' AND (telu19_posts.post_status = 'publish')) OR (telu19_posts.post_type = 'attachment' AND (telu19_posts.post_status = 'publish')) OR (telu19_posts.post_type = 'lp_course' AND (telu19_posts.post_status = 'publish')) OR (telu19_posts.post_type = 'lp_instructor' AND (telu19_posts.post_status = 'publish')) OR (telu19_posts.post_type = 'page' AND (telu19_posts.post_status = 'publish')) OR (telu19_posts.post_type = 'post' AND (telu19_posts.post_status = 'publish')) OR (telu19_posts.post_type = 'wpzoom-shortcode' AND (telu19_posts.post_status = 'publish'))) AND ( ( ( wpml_translations.language_code = 'en' OR ( wpml_translations.language_code = 'id' AND telu19_posts.post_type IN ( 'post','elementor_library' ) AND ( ( ( SELECT COUNT(element_id) FROM telu19_icl_translations WHERE trid = wpml_translations.trid AND language_code = 'en' ) = 0 ) OR ( ( SELECT COUNT(element_id) FROM telu19_icl_translations t2 JOIN telu19_posts p ON p.id = t2.element_id WHERE t2.trid = wpml_translations.trid AND t2.language_code = 'en' AND ( p.post_status = 'publish' OR p.post_status = 'private' OR ( p.post_type='attachment' AND p.post_status = 'inherit' ) ) ) = 0 ) ) ) ) AND telu19_posts.post_type IN ('post','page','attachment','wp_block','wp_template','wp_template_part','wp_navigation','elementor_library','ac_research','ac_event','ac_testimonial','ac_gallery' ) ) OR telu19_posts.post_type NOT IN ('post','page','attachment','wp_block','wp_template','wp_template_part','wp_navigation','elementor_library','ac_research','ac_event','ac_testimonial','ac_gallery' ) ) ORDER BY (CASE WHEN telu19_posts.post_title LIKE '%slot pulsa ❤️K888VIP.io❤️ Daftar dan dapatkan bonus slot pulsa ⚡⚡⚡ slot pulsa ❤️K888VIP.com❤️ Daftar dan dapatkan bonus slot pulsa%' THEN 1 WHEN telu19_posts.post_title LIKE '%slot pulsa ❤️K888VIP.io❤️ Daftar dan dapatkan bonus slot pulsa ⚡⚡⚡ slot pulsa ❤️K888VIP.com❤️ Daftar dan dapatkan bonus slot pulsa%' THEN 2 WHEN telu19_posts.post_excerpt LIKE '%slot pulsa ❤️K888VIP.io❤️ Daftar dan dapatkan bonus slot pulsa ⚡⚡⚡ slot pulsa ❤️K888VIP.com❤️ Daftar dan dapatkan bonus slot pulsa%' THEN 4 WHEN telu19_posts.post_content LIKE '%slot pulsa ❤️K888VIP.io❤️ Daftar dan dapatkan bonus slot pulsa ⚡⚡⚡ slot pulsa ❤️K888VIP.com❤️ Daftar dan dapatkan bonus slot pulsa%' THEN 5 ELSE 6 END), telu19_posts.post_date DESC LIMIT 0, 10 made by require('wp-blog-header.php'), wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts

Membuat Plugin Untuk Melindungi Search Wordpress


Problem

log error yang kamu tampilkan menunjukkan adanya indikasi kuat percobaan spam atau injeksi konten "judi online", walaupun ini bukan SQL injection dalam arti teknis, tapi lebih ke spam search injection atau search poisoning.

πŸ“Œ Penjelasan Masalahnya

Error log tersebut menunjukkan query seperti ini:

... WHERE post_title LIKE '%slot pulsa ❤️K888VIP.io❤️ ...'

Artinya ada pihak eksternal yang mencoba melakukan pencarian di situsmu dengan keyword spam "slot pulsa", "bonus", dll, dengan tujuan:

Men-trigger konten serupa (kalau kamu pakai plugin Related Posts atau pencarian terbuka)

Menginfeksi hasil pencarian Google (SEO poisoning)

Melihat apakah situsmu bisa dipakai untuk menampung backlink otomatis melalui komentar, pencarian, atau hasil internal search

Memanfaatkan kelemahan collation database untuk crash atau membaca error detail (dalam kasusmu: mix antara latin1_swedish_ci dan utf8mb4_unicode_520_ci)

⚠️ Masalah "Illegal mix of collations"

Ini bukan dari serangan langsung, tapi karena:

Data di database kamu ada yang pakai collation latin1_swedish_ci

Query atau input yang masuk (kemungkinan dari spammer) memakai utf8mb4_unicode_520_ci (karakter ❤️, ⚡, dll)

Ketika SQL melakukan LIKE antar dua kolom atau string beda collation, MySQL tidak bisa membandingkan dan muncullah error.

Apa Ini Serangan?

Iya. Ini adalah jenis serangan/pengecekan kelemahan situs berbasis WordPress, dengan ciri:

Bot mengakses URL pencarian (?s=) secara massal

Mencari respons error, atau mencoba memicu query berat

Berharap:

Situs memberi respons detail (untuk fingerprinting)

Situs crash karena collation mismatch

Situs memiliki plugin pencarian terbuka (like WPML) yang bisa dieksploitasi

πŸ”₯ Dampak

Server error log jadi penuh

Beban server meningkat karena query berat dengan LIKE %...% + banyak OR

Jika terlalu sering bisa menyebabkan DoS ringan

Bisa berujung index Google menampilkan spam jika tidak ditangani


πŸ’£ Kesimpulan: Ini bukan SQL Injection, tapi...

Ini bukan SQL Injection (yang mengubah query), karena query-nya aman dan tetap dibatasi LIKE

Tapi ini adalah bentuk spam attack, yaitu:

Search Injection

SEO Spam Probe

Potential DoS (karena memicu error terus-menerus)

Exploit test terhadap WPML atau custom post types kamu

✅ Cara Mengamankan Situs Kamu

1. Blokir Query Spam
Pasang plugin firewall seperti:

Wordfence Security

iThemes Security

Lalu aktifkan fitur Rate Limiting dan Query String Filtering

2. Batasi Akses Pencarian
3. Perbaiki Collation di Database
4. Periksa Plugin WPML
Karena query menunjukkan join ke wpml_translations, pastikan:
WPML-mu up to date

πŸ“Š Cek Log & Aktivitas Mencurigakan

Gunakan plugin seperti:

Activity Log atau WP Security Audit Log

Cek siapa saja yang trigger pencarian aneh seperti ini

🚨 Pertimbangan Tambahan

Jika website kamu publik dan punya traffic tinggi, pertimbangkan:

Captcha pada pencarian (atau minimal throttle)

Cloudflare (aktifkan Bot Fight Mode)

Gunakan WAF (Web Application Firewall) tingkat server jika pakai hosting VPS/dedicated

✅ Solusi Praktis dan Lanjutan

1. Blokir Pencarian dengan Karakter Non-ASCII (Multi-byte seperti Δ‘, Ε©, dll)
preg_match('/[^\x20-\x7E]/', $search) akan memblokir semua karakter di luar ASCII standar, seperti huruf beraksen (Γ©, Δ‘, Ε©) dan emoji.

2. Perbaiki Collation Database
Kamu tetap perlu menyamakan collation agar error tidak terjadi di masa depan.

ALTER TABLE telu19_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
ALTER TABLE telu19_icl_translations CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;

Jalankan lewat phpMyAdmin atau WP-CLI. Backup dulu sebelum eksekusi ya.

3. Pantau & Blokir IP Spammer
Gunakan plugin seperti:

πŸ”Ή Wordfence → lihat live traffic → blokir IP langsung

πŸ”Ή Defender Pro (yang kamu pakai) → lihat Audit Log / IP Lockout → aktifkan automatic lockout untuk query tertentu

4. Gunakan Cloudflare WAF / Bot Protection (Jika Pakai)
Jika situs kamu pakai Cloudflare:

Aktifkan Bot Fight Mode

Buat WAF Rule:

Match: URI Path contains / AND Query String contains s= AND contains %TiαΊΏn%

Action: Challenge (Captcha) atau Block

Error LIKE


[Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8mb4_unicode_520_ci,COERCIBLE) for operation 'like']
artinya ada bentrok antar collation di database MySQL Anda, khususnya saat LIKE '%⋆%' (atau karakter emoji/unicode) digunakan dalam pencarian. Secara spesifik, ini menunjukkan:

Kolom seperti post_title, post_excerpt, post_content disimpan dengan collation latin1_swedish_ci

Sedangkan pencarian karakter seperti ❤ atau ⋆ dikodekan dalam utf8mb4_unicode_520_ci

πŸ”§ Penyebab Utama

WordPress lama atau instalasi MySQL bawaan (terutama dari shared hosting) kadang masih menggunakan latin1_swedish_ci sebagai default collation. Namun emoji dan karakter simbol memerlukan dukungan penuh dari utf8mb4.

✅ Solusi Pasti: Ubah Collation ke utf8mb4_unicode_ci

Anda perlu mengganti collation database dan tabel WordPress Anda, terutama wp_posts, ke format yang kompatibel dengan karakter Unicode/Emoji.

Langkah-langkah:

Backup database dulu!
Gunakan phpMyAdmin atau plugin seperti WP Migrate Lite / UpdraftPlus.

Jalankan SQL di phpMyAdmin:


ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Ulangi juga untuk tabel-tabel penting lain:

ALTER TABLE wp_postmeta CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_terms CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_options CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Catatan: Ganti wp_ sesuai prefix Anda (telu19_ kalau pakai yang itu).

Pastikan juga collation default database-nya sama:
Jalankan:

ALTER DATABASE nama_database CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

πŸ”„ Alternatif Sementara (Tidak direkomendasikan)

Jika Anda tidak bisa ubah database, alternatif sementara:

Filter karakter pencarian dan buang karakter Unicode sebelum masuk ke query.

Tapi ini tidak menyelesaikan masalah utama (akan tetap error jika ada query yang bawa emoji).

Tes Hasil

Setelah Anda ubah collation:

Coba cari ❤, ⋆, atau emoji lain → pastikan hasil muncul atau minimal tidak error.

Cek kembali bahwa posting dan pencarian tidak rusak formatnya.

πŸ’¬ Kesimpulan Solusi Praktis

Ya, ini bot spam/pengecekan kelemahan.

Tujuannya untuk probing error atau mencoba injeksi.

Dengan script PHP filter + Defender Pro + (opsional) Cloudflare WAF, kamu sudah sangat terlindungi.

Contoh Kode Snippet Untuk Di Function.php pada wordpress, dengan bantuan plugin insert snippet wordpress

✅ Solusi Cepat dan Aman: Blokir Simbol/Emoji Sebelum Masuk ke Query

Kita perlu memastikan karakter seperti ★ tidak pernah masuk ke sistem query MySQL agar error tidak muncul.

Gunakan regex yang lebih ketat untuk memfilter hanya karakter ASCII dan huruf biasa saja:
***


// Prevent search queries yang biasa di pakai slot gacor (by hilfan).
add_action( 'pre_get_posts', 'custom_block_bad_search_queries' );
function custom_block_bad_search_queries( $query ) {
    if ( is_admin() || !$query->is_main_query() || !$query->is_search() ) {
        return;
    }

    $search = $query->get('s');

    // Daftar kata pencarian yang diblok
    $blacklist = ['slot pulsa', 'k888vip', 'judi', 'bonus', 'deposit'];
    foreach ( $blacklist as $blocked ) {
        if ( stripos( $search, $blocked ) !== false ) {
            wp_die('Pencarian ini tidak diperbolehkan.');
        }
    }

// Batasi panjang pencarian
    if ( strlen( $search ) > 100 ) {
        wp_die('Pencarian terlalu panjang.');
    }

// Blokir karakter non-ASCII (yang bisa timbulkan error collation)
// Ini hanya mengizinkan huruf, angka, spasi, dan simbol umum
    if ( preg_match('/[^\x20-\x7E]/', $search) ) {
        wp_die('Pencarian mengandung karakter tidak valid.');
    }
}


***

Penjelasan Regex /[^\x09\x0A\x0D\x20-\x7E]/:

Memastikan hanya karakter:

Spasi (0x20)

Karakter tab/newline

Huruf dan angka standar (A-Z, a-z, 0–9)

Simbol biasa: .,!?()[]{}-_"'

Dengan regex ini, semua karakter aneh (termasuk emoji, karakter ★, simbol Jepang/Arab, dsb) akan dicegah sebelum masuk query.

✅ Rekomendasi Final

Gunakan kode versi regex di atas agar simbol seperti ★, ⚡, ❤️, dll tidak masuk query

Tidak perlu konversi database jika kamu tidak memerlukan pencarian simbol/emoji

Contoh yang Diblokir:

Query Diblokir? Alasan
slot pulsa gacor ✅ Ya Termasuk dalam blacklist
k888vip id login ✅ Ya Termasuk dalam blacklist
🎯 ✅ Ya Emoji, bukan ASCII
lorem ipsum ★ ✅ Ya Simbol ★, bukan ASCII
apa itu bola? ❌ Tidak Aman

Solusi Di Plugin Wordpress

πŸ”’ Plugin Rekomendasi untuk Lindungi Fitur Pencarian
1. WP Armour – Honeypot Anti Spam
πŸ”Ή Melindungi form pencarian, komentar, dan kontak dari spam bot

πŸ”Ή Menggunakan teknik honeypot, tidak mengganggu user manusia

πŸ”Ή Bisa bantu cegah bot mengirim query spam ke search box

πŸ“₯ Download WP Armour

2. Search Exclude
πŸ”Ή Bisa menyembunyikan post tertentu dari hasil pencarian internal

πŸ”Ή Tidak langsung menyaring query spam, tapi berguna untuk cegah konten tertentu muncul

Cocok dikombinasikan dengan plugin firewall atau anti-spam

πŸ“₯ Download Search Exclude

3. Block Bad Queries (BBQ) Firewall
πŸ”₯ Melindungi dari query string aneh (seperti spam yang kamu tunjukkan)

πŸ”₯ Sangat ringan dan otomatis bekerja

πŸ”₯ Tidak perlu konfigurasi rumit

πŸ’‘ Mendeteksi query yang mengandung karakter non-ASCII mencurigakan, seperti emoji dan simbol ❤️⚡

πŸ“₯ Download BBQ Firewall

4. Wordfence Security
πŸ›‘️ Salah satu plugin keamanan paling populer

πŸ” Bisa membatasi query pencarian dan melakukan Rate Limiting berdasarkan parameter

πŸ”₯ Bisa memblokir IP yang terlalu sering menembak endpoint ?s=

πŸ“₯ Download Wordfence

πŸ“Œ Tips: Setelah instal, masuk ke menu Wordfence > Firewall > Rate Limiting, dan atur batas maksimum query pencarian per menit.

5. Search Meter (Opsional, untuk monitoring)
πŸ” Mencatat semua kata kunci pencarian internal di websitemu

🧠 Berguna untuk melihat kata apa saja yang dicari (dan menyaring jika ada spam berulang)

πŸ“₯ Download Search Meter

🚫 Plugin Tambahan Jika Pakai Elementor atau Ajax Search
Jika kamu pakai:

Elementor dengan search widget

Ajax Search Lite/Pro

Pastikan plugin pencarian tersebut juga:

Memiliki filter karakter / blacklist keyword

Bisa dikaitkan dengan WAF atau plugin seperti Wordfence


Secondary Problem

Plugin dari wordpress berat, karena kumplit fiturnya
Tidak ada captcha pada search form
Tidak ada block tanpa harus masuk ke database
Tidak ada blokir kata kunci tertentu
Tidak ada blokir karakter/simbol/icon
Kalaupun ada fitur diatas, maka terdapat di beberapa plugin yang berbeda

Contoh πŸ” Kombinasi:

Wordfence → untuk throttle dan blokir IP

WP Armour → untuk invisible honeypot

BBQ Firewall → untuk blokir query aneh

Search Meter → untuk lihat keyword yang sering diserang

(Opsional) Advanced Google reCAPTCHA → jika benar-benar ingin CAPTCHA visual

Kebutuhan

Dibutuhkan plugin dengan fitur:
Plugin ringan
Ada captcha pada search form
Ada block pencarian tanpa harus masuk ke database
Ada blokir kata kunci tertentu
Ada blokir karakter/simbol/icon
Semua fitur dalam 1 plugin ringan

Solusi

Membuat Plugin Untuk Melindungi Search Wordpress
Membuat Plugin Untuk Melindungi Search Wordpress




Search Protection for WordPress Plugin WordPress yang sederhana namun kuat untuk melindungi form pencarian Anda dari kata kunci yang tidak diinginkan, spam, dan bot jahat menggunakan daftar hitam (blacklist) dan integrasi Google reCAPTCHA v3.

Deskripsi Form pencarian sering menjadi target serangan spam dan upaya pencarian berbahaya. Plugin Search Protection menyediakan dua lapis pertahanan:

Daftar Hitam (Blacklist): Memblokir pencarian yang mengandung kata-kata spesifik atau pola karakter (regex) yang Anda tentukan.

Google reCAPTCHA v3: Secara transparan memverifikasi apakah pengunjung adalah manusia atau bot, dan memblokir permintaan yang mencurigakan tanpa mengganggu pengguna asli.

Plugin ini dirancang agar mudah dikonfigurasi dan bekerja secara otomatis di latar belakang untuk menjaga situs Anda tetap aman.

Fitur Utama Pemblokiran Kata Kunci: Blokir pencarian berdasarkan daftar kata-kata yang tidak diinginkan (misalnya: spam, judi).

Pemblokiran Regex: Gunakan Ekspresi Reguler (Regular Expressions) untuk memblokir pola pencarian yang lebih kompleks (misalnya, karakter non-ASCII, URL, dll).

Integrasi Google reCAPTCHA v3: Menambahkan lapisan keamanan tak terlihat untuk mendeteksi dan memblokir lalu lintas bot.

Pesan Blokir Kustom: Atur pesan yang akan ditampilkan kepada pengguna saat pencarian mereka diblokir.

Pengalihan Halaman Blokir: Alihkan pengguna ke halaman tertentu saat pencarian mereka diblokir.

Logging (Pencatatan): Mencatat semua upaya pencarian yang diblokir untuk dianalisis lebih lanjut. Log dibersihkan secara otomatis setiap 24 jam.

Antarmuka Pengaturan yang Mudah: Semua opsi terintegrasi dengan baik di dalam dasbor WordPress.

Instalasi Unduh file .zip dari repositori ini.

Buka Dasbor WordPress Anda, navigasi ke Plugins > Add New.

Klik Upload Plugin dan pilih file .zip yang baru saja Anda unduh.

Aktifkan plugin setelah instalasi selesai.

Selesai!

Konfigurasi Setelah aktivasi, buka Pengaturan > Search Protection di dasbor WordPress Anda.

Pengaturan reCAPTCHA v3:

Centang Aktifkan reCAPTCHA untuk menggunakannya.

Daftarkan domain Anda di Google reCAPTCHA Admin untuk mendapatkan Site Key dan Secret Key.

Masukkan kedua kunci tersebut ke kolom yang sesuai.

Pengaturan Pemblokiran Kata:

Di kolom Daftar Kata/Pola Terlarang, masukkan kata atau pola yang ingin Anda blokir, pisahkan dengan koma.

Untuk kata biasa: spam, judi, test

Untuk regex: Apit pola dengan garis miring, contoh: /[^\x20-\x7E]/ untuk memblokir semua karakter non-ASCII.

Pengaturan Pesan & Pengalihan:

Sesuaikan pesan yang akan ditampilkan untuk setiap jenis pemblokiran.

Jika Anda ingin mengalihkan pengguna ke halaman lain saat diblokir, masukkan URL lengkap di kolom URL Halaman Blokir Kustom.

Klik Save Changes.

Changelog 1.1.1 (20 Juli 2025) Rilis awal plugin.

Fitur pemblokiran kata kunci dan regex.

Integrasi Google reCAPTCHA v3.

Halaman pengaturan yang lengkap.

Sistem logging dan pembersihan log otomatis via Cron Job.

Lisensi Plugin ini dirilis di bawah lisensi GPLv2. Lihat file LICENSE untuk detailnya. Dan dengan dukungan Telkom University

No comments:

Post a Comment

Accept Payment

Accept Payment