๐จ Memahami eval di JavaScript, Bahayanya, dan Cara Mengatasinya di Vite + React + TS + Hono

1. Apa itu eval?
eval adalah fungsi bawaan JavaScript yang bisa mengeksekusi string sebagai kode JavaScript.
Contoh:
const code = "2 + 2";
console.log(eval(code)); // 4
Sekilas terlihat praktis, tapi sangat berisiko. eval akan membaca string apa adanya lalu menjalankannya. Jika string itu berasal dari input user atau sumber luar, bisa memicu serangan injeksi kode (XSS).
2. Kenapa eval Berbahaya?
Ada beberapa alasan kenapa eval dianggap insecure:
XSS (Cross-Site Scripting):
Penyerang bisa menyisipkan script berbahaya yang langsung dieksekusi.
Misalnya,eval("alert(document.cookie)")โ mencuri cookie user.Membuka pintu arbitrary code execution:
Jika ada input tak tervalidasi, attacker bisa jalankan perintah tak diinginkan.Mengganggu keamanan modern (CSP):
Browser modern + CSP (Content Security Policy) default sering memblokeval, sehingga error muncul:Content Security Policy of your site blocks the use of 'eval' in JavaScript
Lambat & sulit dioptimasi:
Engine JavaScript (seperti V8) tidak bisa mengoptimasi kodeeval, karena isinya bisa berubah-ubah.
3. Kenapa Error eval Muncul di Vite + React + TypeScript + Hono?
Ketika membangun aplikasi dengan Vite + React TS, ada beberapa penyebab umum:
Vite dev server: saat mode development, Vite menggunakan
evaluntuk debugging source maps (misalnyaeval-source-map).Library pihak ketiga: beberapa package lama masih pakai
evalataunew Function().CSP ketat di server Hono: kamu mungkin mengatur header CSP tanpa
unsafe-eval.
4. Cara Mengatasi Error CSP karena eval
๐น (1) Hilangkan pemakaian eval
Jangan gunakan
evalataunew Function()secara manual.Ganti
eval("2+2")โ2+2langsung.Ganti
setTimeout("doSomething()", 100)โsetTimeout(doSomething, 100).
๐น (2) Pastikan Vite tidak pakai eval di production
Secara default,
vite buildmenghasilkan bundle tanpa eval.Masalah biasanya hanya di dev mode.
Jika error muncul di production, pastikan mode build benar:
vite build --mode productionPeriksa
vite.config.ts, hindari source map berbasis eval:export default defineConfig({ build: { sourcemap: true, // aman, tidak pakai eval } })
๐น (3) Atur CSP Header di Hono
Jika kamu ingin izin sementara untuk development (agar error hilang), tambahkan 'unsafe-eval' di CSP hanya di dev mode.
Contoh middleware Hono:
import { Hono } from 'hono'
const app = new Hono()
app.use('*', async (c, next) => {
const isDev = process.env.NODE_ENV !== 'production'
const csp = isDev
? "default-src 'self'; script-src 'self' 'unsafe-eval';"
: "default-src 'self'; script-src 'self';"
c.header('Content-Security-Policy', csp)
await next()
})
app.get('/', (c) => c.html('<h1>Hello Vite + React + Hono!</h1>'))
export default app
โ ๏ธ Catatan: 'unsafe-eval' tidak boleh dipakai di production.
๐น (4) Gunakan Nonce / Hash di CSP (solusi aman)
Kalau aplikasi butuh inline script tanpa eval, gunakan nonce:
app.use('*', async (c, next) => {
const nonce = crypto.randomUUID()
c.header('Content-Security-Policy', `script-src 'self' 'nonce-${nonce}';`)
c.set('csp-nonce', nonce)
await next()
})
Lalu saat render HTML:
<script nonce="THE_NONCE">console.log("aman!")</script>
๐น (5) Gunakan Report-Only Mode untuk Debug
Untuk mengecek pelanggaran tanpa memblokir:
app.use('*', (c, next) => {
c.header(
'Content-Security-Policy-Report-Only',
"default-src 'self'; script-src 'self'; report-uri /csp-report"
)
return next()
})
app.post('/csp-report', async (c) => {
const report = await c.req.json()
console.log('CSP Report:', report)
return c.text('ok')
})
5. Rekomendasi Praktis untuk Project Vite + React + TS + Hono
Development:
Tambahkan sementara
'unsafe-eval'di CSP untuk mencegah error saat hot-reload.Atau gunakan
vite --mode productionjika mau test tanpa eval.
Production:
Jangan gunakan
'unsafe-eval'.Deploy hasil
vite build.Gunakan CSP yang ketat dengan
script-src 'self'+ nonce/hash.
Library check:
Selalu audit library dengan
grep "eval("dinode_modules.Cari alternatif library yang tidak pakai
eval.
6. Kesimpulan
evalberbahaya karena membuka celah XSS dan memperlambat performa.Error
Content Security Policy blocks 'eval'muncul karena CSP memblokireval.Di Vite React TS + Hono, masalah biasanya muncul di dev mode (bukan production).
Solusi:
โ Jangan pakaievalmanual.
โ Pastikanvite builduntuk production.
โ Gunakan CSP aman di Hono (nonce/hash),'unsafe-eval'hanya untuk development jika terpaksa.





