Episode ini membahas keamanan aplikasi Groovy: safe execution of dynamic scripts, input validation, sandboxing, dan pencegahan code injection. Kalian juga akan belajar secure dependency management dan supply chain awareness untuk melindungi aplikasi dari awal.

Groovy sangat kuat — dan kekuatan itu berbahaya bila disalahgunakan. Mengeksekusi script dinamis dari sumber tidak terpercaya bisa membuka pintu ke kompromi total sistem. Episode 20 membahas cara memakai kekuatan Groovy dengan aman.
Kalian akan belajar safe execution of dynamic scripts, input validation, sandboxing, pencegahan code injection, serta secure dependency management dan supply chain awareness.
Script Groovy bisa memanggil API Java apa pun — termasuk akses file, network, dan system properties. Jika kalian mengeksekusi script dari input pengguna tanpa pembatasan, penyerang bisa:
Aturan utamanya: jangan pernah mengeksekusi script dari sumber yang tidak kalian percayai sepenuhnya, kecuali di dalam sandbox.
Groovy menyediakan CompilerConfiguration dengan SecureASTCustomizer untuk membatasi konstruksi bahasa yang diizinkan:
import org.codehaus.groovy.control.customizers.SecureASTCustomizer
import org.codehaus.groovy.control.CompilerConfiguration
def secure = new SecureASTCustomizer()
secure.disallowedTokens = [":", "%"]
def config = new CompilerConfiguration()
config.addCompilationCustomizers(secure)secure.disallowedTokens = [":", "%"] melarang token berbahaya, dan config.addCompilationCustomizers(secure) menerapkannya. new SecureASTCustomizer() membuat filter AST yang memblokir konstruksi sebelum kompilasi — lapisan pertama pertahanan sandbox.
Batasi import ke whitelist:
secure.allowedImports = ["java.math.BigDecimal"]
secure.allowedStarImports = ["java.lang"]
def shell = new GroovyShell(ClassLoader.systemClassLoader, new Binding(), config)
def hasil = shell.evaluate("2 + 2")
println hasilsecure.allowedImports = ["java.math.BigDecimal"] hanya mengizinkan import tertentu, dan allowedStarImports membatasi wildcard import. new GroovyShell(...config) menciptakan shell dengan konfigurasi aman — script hanya bisa memakai kelas yang diizinkan.
Untuk aplikasi lama yang memakai Java 8-17, SecurityManager bisa membatasi akses sistem:
java -Djava.security.manager -Djava.security.policy=app.policy -jar app.jarjava -Djava.security.manager -Djava.security.policy=app.policy -jar app.jar mengaktifkan security manager dengan policy file. Catatan: SecurityManager telah deprecated di JDK 17+ dan dihapus di JDK 24, jadi untuk JDK baru gunakan SecureASTCustomizer dan sandboxing di level OS atau container.
Validasi input adalah pertahanan pertama terhadap injection. Untuk script yang menerima parameter, gunakan whitelist:
def namaValid = { String nama ->
nama ==~ /[a-zA-Z ]+/
}
def proses(String nama) {
if (!namaValid(nama)) {
throw new IllegalArgumentException("Nama tidak valid")
}
"Halo, ${nama}"
}
println proses("Arman")nama ==~ /[a-zA-Z ]+/ memverifikasi input hanya berisi huruf dan spasi. throw new IllegalArgumentException("Nama tidak valid") menghentikan pemrosesan saat input mencurigakan — pola mencegah injection sebelum terjadi.
Hindari menggabungkan input pengguna ke dalam script yang dieksekusi. Jika parameter harus masuk ke script, gunakan binding, bukan interpolasi string:
def binding = new Binding([nama: "Arman"])
def shell = new GroovyShell(binding)
println shell.evaluate("println nama")new Binding([nama: "Arman"]) memasukkan nilai sebagai variabel, bukan menyisipkan teks ke kode. shell.evaluate("println nama") mengeksekusi script yang memakai variabel binding. new Binding([nama: "Arman"]) menghindari celah injection yang muncul saat nilai diinterpolasi langsung ke string script.
Sebagian besar aplikasi Groovy bergantung pada library pihak ketiga. Dependency yang rentan adalah risiko serius:
gradle dependencyCheckAnalyzegradle dependencyCheckAnalyze menjalankan OWASP Dependency-Check untuk memindai CVE di seluruh dependency. gradle dependencyCheckAnalyze menghasilkan laporan kerentanan yang harus direview sebelum rilis.
Beberapa praktik untuk melindungi supply chain:
1.+.Gradle bisa memverifikasi integritas artifact:
dependencies {
implementation("org.codehaus.groovy:groovy:4.0.24") {
verifyChecksums = true
}
}verifyChecksums = true memaksa Gradle memeriksa checksum yang sudah didokumentasikan. implementation("org.codehaus.groovy:groovy:4.0.24"){ :bash} — pemeriksaan ini memastikan artifact yang diunduh tidak dimodifikasi selama transit.
Episode 20 mengajarkan keamanan untuk aplikasi Groovy: risiko dynamic scripting, sandboxing dengan SecureASTCustomizer, validasi input, pencegahan code injection, serta secure dependency management dan supply chain awareness.
Inti yang harus dibawa pulang:
Di episode 21 selanjutnya kita akan membahas ekosistem dan community resources — memanfaatkan dokumentasi, forum, dan repositori plugin, daftar tooling seperti Groovy Console dan SDKMAN, serta belajar dari contoh open-source dan starter projects.