Category Archives: LEMP

Trik Block SQLi, XSS, dan RCE di Level Nginx Tanpa Merusak Kolom Pencarian Blog Koding

Halo sobat Melanjutkan cerita dari artikel sebelumnya, setelah WAF Nginx berhasil saya pasang di server klien, muncul kendala baru yang tidak terduga. Salah satu klien saya mengelola sebuah blog edukasi koding dan pemrograman. Dua hari setelah WAF terpasang, beliau menghubungi saya karena ada laporan dari pembaca websitenya.

Laporannya begini: pembaca tidak bisa menggunakan kolom pencarian di blog tersebut setiap kali mencari tutorial yang mengandung kata seperti INSERT, SELECT, atau sintaks koding lainnya. Begitu tombol cari diklik, halaman malah menampilkan error penolakan dari server.

Saya langsung sadar bahwa aturan WAF awal yang saya pasang ternyata terlalu “agresif” dan memicu *False Positive*. WAF menganggap pembaca yang sedang mencari tutorial koding sebagai hacker yang sedang mencoba melakukan SQL Injection atau XSS. Bagi sebuah blog edukasi koding, tentu ini sangat mengganggu kenyamanan pengunjung. » Read more

Solusi Ringan Mencegat Serangan Bot: Optimasi WAF Regex di Nginx Agar Server Tetap Stabil

Ada momen di mana seorang pemilik website mendadak diuji kesabarannya. Bayangkan, di saat transaksi atau aktivitas bisnis sedang ramai-ramainya di jam kerja, tiba-tiba website tidak bisa diakses sama sekali. Tampilan layar hanya menunjukkan pesan error “Error Establishing a Database Connection” (koneksi antara sistem website dan tempat penyimpanan data terputus). Kepanikan pun tak terhindarkan, apalagi kalau melihat laporan pengunjung harian sebenarnya terbilang wajar-wajar saja.

Kejadian seperti ini sempat dialami oleh salah satu klien yang datang kepada saya dengan kondisi cemas. Website milik beliau mendadak bertumbangan berulang kali. Setelah ditelusuri lewat log server (catatan riwayat aktivitas harian di dalam sistem server), ternyata server VPS (Virtual Private Server, komputasi server virtual bertipe khusus) kapasitas 1GB RAM (Random Access Memory, memori kerja sementara server) milik klien sedang dibombardir ribuan bot (program otomatis yang berkeliaran di internet) pemindai dari luar negeri yang sengaja mencari celah keamanan WordPress. » Read more

Fix Nginx Slowdown – Mengatasi Nginx Lemot: Trik Mencegah Server Menulis File Sementara ke Disk

Sobat, penurunan performa server (slowdown) kadang suka bikin bingung, apalagi waktu penggunaan CPU (otak pemrosesan server) dan RAM (memori kerja utama) terpantau masih tenang-tenang aja. Kejadian ini sempat dialami salah satu klien saya pas aktivitas Disk Write I/O (proses penulisan data ke dalam media penyimpanan) mendadak melonjak tajam. Usut punya usut, ternyata Nginx (aplikasi web server) sibuk bikin ribuan temporary file (file simpanan sementara) di dalam folder /var/lib/nginx/fastcgi/.

Saat menelusuri akar masalahnya, fokus saya langsung tertuju pada perbedaan kecepatan akses antar media penyimpanan. Proses baca-tulis data di RAM jauh lebih ngebut dibanding penulisan ke disk storage (piringan atau chip penyimpanan permanen). Ketika Nginx terbiasa menumpuk luapan data dari PHP ke dalam disk sebelum dikirim ke pengunjung, akumulasi jeda waktu pemrosesan inilah yang bikin respon website berasa agak ngadat. Penanganan presisi yang biasa saya terapkan untuk kasus seperti ini adalah mengalihkan seluruh alur data agar diproses murni di RAM, jadi pemilik bisnis nggak perlu pusing lagi mikirin performa situsnya yang melambat.

» Read more

Nginx FastCGI Buffer vs Memory: Berapa Ukuran RAM yang Benar-Benar Dikonsumsi Server?

Sobat, kekhawatiran terkait konsumsi RAM (memori kerja utama server) sering kali muncul saat kita hendak memperbesar alokasi buffer di Nginx (aplikasi web server). Seorang klien pernah dengan cemas menanyakan apakah setelan FastCGI buffer (alokasi RAM sementara untuk menampung data dari PHP) sebesar 16×64 KB (1 MB) akan menguras habis memori pada server berkapasitas 3 GB jika ada 200 request (permintaan akses pengunjung) yang masuk secara bersamaan.

Saat mendampingi klien tersebut, saya menjelaskan bagaimana alokasi memori Nginx sebenarnya bekerja. Pengalokasian FastCGI buffer di Nginx pada dasarnya bersifat dinamis (bekerja secara bertahap sesuai kebutuhan riil, bukan mengunci memori di awal). Nginx tidak langsung menyita RAM sebesar 1 MB untuk tiap pengunjung, melainkan hanya mengambil unit buffer 64 KB secara perlahan sesuai ukuran aktual halaman yang dimuat. Dengan pemahaman ini, pemilik bisnis bisa merasa tenang karena server tetap bekerja aman dan efisien tanpa harus khawatir mengenai lonjakan penggunaan memori. » Read more

Optimasi Buffer FastCGI Nginx: Solusi Bebas Bottleneck untuk Halaman Web Berukuran Besar

Sobat, memuat halaman web berukuran besar sering kali menimbulkan hambatan kecepatan (bottleneck) jika server belum dioptimalkan dengan baik. Hal ini dialami oleh seorang klien ketika halaman katalog dan laporan data berukuran sekitar 667 KB terasa kurang responsif saat diakses pengunjung.

Saat saya cek jalur pengiriman data dari backend ke Nginx, akar masalahnya langsung kelihatan. Ada dua hal yang bikin prosesnya tertahan: buffer standar Nginx belum muat menampung file 667 KB di memori RAM, dan data HTML/JSON-nya dikirim secara mentah (polosan) tanpa kompresi. Solusinya cukup simpel: naikkan nilai FastCGI buffer dan aktifkan kompresi Gzip di Nginx supaya ukuran transmisinya bisa dipangkas.
» Read more

Panduan Mengatasi Log “An Upstream Response Is Buffered to a Temporary File” di Nginx

Sobat, setelah memahami arti dari peringatan FastCGI buffer di Nginx, pertanyaan berikutnya yang sering muncul adalah bagaimana cara menghentikannya secara permanen. Klien saya pernah menanyakan hal ini karena ingin memastikan file log servernya tetap bersih dan penggunaan disk storage tidak terbuang untuk menulis temporary file.

Saat menganalisis kasus ini, langkah pertama yang saya lakukan adalah memeriksa file konfigurasi Nginx di /etc/nginx/nginx.conf (pusat pengaturan utama web server). Dari situ terlihat bahwa FastCGI buffer (alokasi memori RAM sementara untuk menampung data dari PHP) masih menggunakan nilai bawaan default 64 KB. Padahal, halaman dinamis pada website klien rata-rata berukuran di atas 200 KB. Penanganan presisi yang biasa saya terapkan untuk kendala seperti ini adalah menyesuaikan alokasi FastCGI buffer agar seluruh respon PHP bisa ditampung utuh di RAM, sehingga performa website kembali responsif tanpa membuat pemilik bisnis pusing memikirkan urusan teknis server.
» Read more

Cegah Fatal Error! Ini 42 Fungsi PHP Lama yang Wajib Sobat Ganti Sebelum Upgrade ke PHP 8.5

Halo sobat, kembali lagi bersama saya Riyanto. Sebagai orang yang sudah ngulik PHP dan WordPress lebih dari 20 tahun—sejak zaman PHP 4 dan WordPress versi awal—saya sudah menyaksikan berbagai gelombang evolusi bahasa pemograman ini. Kalau sobat sudah lama menggunakan PHP, mungkin sampai saat ini masih ada project, aplikasi backend PHP, atau website klien yang berjalan di PHP 7.4. Memang sampai sekarang aplikasi tersebut masih bisa digunakan dan keliatannya adem-adem saja, tetapi menurut saya sekarang adalah waktu yang sanggat tepat untuk mulai melakukan migrasi ke PHP 8.5.

Pengalaman saya menangani migrasi belasan server Linux skala enterprise dan ratusan site WordPress menunjukkan bahwa menunda upgrade PHP itu ibarat menyimpan bom waktu. PHP 7.4 sudah resmi mencapai end-of-life (EOL) sejak November 2022. Artinya, tidak ada lagi patch keamanan resmi dari core PHP team. Ketika sobat tetap bertahan di PHP 7, aplikasi sobat tidak hanya rentan terhadap celah keamanan, tetapi juga kehilangan lompatan performa yang luar biasa drastis dari JIT (Just-In-Time) compiler, pemakaian memori yang jauh lebih efisien, serta fitur-fitur sintaks modern di PHP 8.0 hingga PHP 8.5 seperti Match Expression, Enums, Readonly Properties, Asymmetric Visibility, hingga Property Hooks. » Read more

Membuat Kolom Read-Only di MySQL / MariaBD dan Contoh Tabel WordPress

Halo Sobat Pada kesempatan kali ini, saya akan membahas bagaimana cara membuat kolom read-only di MySQL dan memberikan contoh tabel pada WordPress. Topik ini sangat berguna bagi Anda yang ingin menjaga integritas data dalam database. Mari kita mulai!

Versi MySQL dan MariaDB yang Didukung

Metode yang kita bahas di sini kompatibel dengan versi berikut:

  • Trigger telah didukung sejak MySQL 5.0 dan MariaDB 5.3.
  • Hak akses kolom (granular privileges) tersedia sejak MySQL 5.6 dan MariaDB 10.0.
  • MariaDB 10.5 memperkenalkan perubahan izin dan fitur baru dalam mesin penyimpanan.
  • MariaDB 10.9 menambahkan fungsi JSON_OVERLAPS untuk operasi data JSON.

Pastikan Anda menggunakan versi yang kompatibel agar fitur ini dapat berjalan dengan baik.

» Read more

Panduan Lengkap Menggunakan Fungsi Matematika di MySQL

Halo sobat, pada kesempatan kali ini saya akan membahas tentang berbagai fungsi matematika yang tersedia di MySQL. Fungsi-fungsi ini sangat berguna untuk melakukan operasi matematika pada data yang tersimpan di database, mulai dari perhitungan dasar hingga fungsi yang lebih kompleks. Dengan memahami fungsi-fungsi ini, sobat bisa lebih leluasa memanipulasi dan mengolah data sesuai kebutuhan aplikasi. » Read more

Panduan Penggunaan Fungsi Enkripsi dan Dekripsi di MySQL untuk Keamanan Data

Halo sobat, pada kesempatan kali ini saya akan membahas berbagai fungsi enkripsi dan dekripsi di MySQL. Fungsi-fungsi ini digunakan untuk melindungi data sensitif yang tersimpan dalam database, sehingga data yang disimpan tetap aman dari akses yang tidak diinginkan. Tidak hanya itu, ada juga fungsi untuk encoding, kompresi, dan hashing yang dapat membantu mengelola data secara efisien.

Fungsi Enkripsi & Dekripsi

MySQL menyediakan beberapa fungsi untuk mengenkripsi dan mendekripsi data, di antaranya:

  • AES_ENCRYPT() dan AES_DECRYPT() – Fungsi ini digunakan untuk mengenkripsi dan mendekripsi data menggunakan algoritma AES. Contoh penggunaannya:
-- Enkripsi data
SELECT AES_ENCRYPT('s3ns1t1f', 'k3y') AS encrypted_data;

-- Dekripsi data
SELECT AES_DECRYPT(AES_ENCRYPT('s3ns1t1f', 'k3y'), 'k3y') AS decrypted_data;
  • DES_ENCRYPT() dan DES_DECRYPT() – Fungsi untuk enkripsi menggunakan standar DES.
  • ENCRYPT() – Fungsi enkripsi standar yang digunakan untuk membuat hash dari sebuah string.
  • PASSWORD() – Menghasilkan hash password MySQL dari string input, biasanya untuk keperluan autentikasi.

Fungsi Encoding & Decoding

Selain enkripsi, MySQL juga menyediakan fungsi untuk encoding dan decoding data. Contoh penggunaannya dengan fungsi ENCODE() dan DECODE() adalah sebagai berikut:

-- Encoding data
SELECT ENCODE('s3ns1t1f', 'k3y') AS encoded_data;

-- Decoding data
SELECT DECODE(ENCODE('s3ns1t1f', 'k3y'), 'k3y') AS decoded_data;

Fungsi Kompresi & Dekompresi

Untuk menghemat ruang penyimpanan, sobat juga dapat menggunakan fungsi COMPRESS() dan UNCOMPRESS() yang berguna untuk mengompresi dan mendekompresi data. Berikut contohnya:

-- Kompresi data
SELECT COMPRESS('Ini adalah teks yang akan dikompresi') AS compressed_data;

-- Dekompresi data
SELECT UNCOMPRESS(COMPRESS('Ini adalah teks yang akan dikompresi')) AS decompressed_data;

Selain itu, fungsi UNCOMPRESSED_LENGTH() dapat mengembalikan panjang data setelah didekompresi:

SELECT UNCOMPRESSED_LENGTH(COMPRESS('Ini adalah teks yang akan dikompresi')) AS decompressed_length;

Fungsi Hashing

MySQL juga menyediakan beberapa fungsi hashing untuk menghasilkan nilai hash dari data yang diberikan. Fungsi-fungsi ini sangat berguna untuk keamanan data dan verifikasi integritas data. Berikut adalah contohnya:

  • MD5() – Menghasilkan hash MD5 dari sebuah string.
SELECT MD5('Ini adalah teks yang akan di-hash') AS hashed_data;
  • SHA1() – Menghasilkan hash SHA1 dari sebuah string.
SELECT SHA1('Ini adalah teks yang akan di-hash') AS hashed_data;
  • SHA2() – Menghasilkan hash SHA2 dengan panjang bit yang ditentukan (misalnya 256 bit).
SELECT SHA2('Ini adalah teks yang akan di-hash', 256) AS hashed_data;
  • OLD_PASSWORD() – Menghasilkan hash password lama MySQL untuk string input. Fungsi ini masih ada untuk kompatibilitas, meskipun sebaiknya menggunakan metode hash yang lebih modern.
SELECT OLD_PASSWORD('s3cr3t') AS hashed_password;
Itulah sobat, rangkuman dari berbagai fungsi enkripsi, dekripsi, encoding, kompresi, dan hashing yang ada di MySQL. Dengan menggunakan fungsi-fungsi ini, kita bisa melindungi data sensitif dan mengelola penyimpanan data dengan lebih efisien. Jangan ragu untuk mencoba contoh kode di atas dan eksplorasi lebih lanjut sesuai kebutuhan proyek kalian.

Semoga artikel ini bermanfaat dan bisa membantu sobat dalam mengoptimalkan keamanan dan performa database MySQL. Selamat mencoba dan semoga sukses!