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

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 |
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