Skip to content

Fix: Sembunyikan ID Perangkat (id_device) pada Datatable Publik - #715

Merged
habibie11 merged 4 commits into
rilis-devfrom
fix/id_device_bocor
Sep 1, 2026
Merged

Fix: Sembunyikan ID Perangkat (id_device) pada Datatable Publik#715
habibie11 merged 4 commits into
rilis-devfrom
fix/id_device_bocor

Conversation

@pandigresik

@pandigresik pandigresik commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

Pull Request: Fix: Sembunyikan ID Perangkat (id_device) pada Datatable Publik

Description

Dua endpoint datatable publik (/datatables/pengguna-layanandesa dan /datatables/pengguna-keloladesa) hanya memvalidasi if($request->ajax()) sehingga dapat diakses tanpa autentikasi. Endpoint tersebut membocorkan data sensitif berupa id_device (Android Build ID perangkat petugas desa) dan field primary key id yang digunakan untuk pelacakan perangkat. PR ini menyembunyikan kolom sensitif tersebut dari respons JSON datatable dan menghapusnya dari tampilan tabel, sehingga data pelacakan perangkat tidak lagi terekspos ke publik.

Changes Made

  1. Hide kolom id (DashboardController.php:258): Menambahkan ->makeHidden(['id']) pada datatablePenggunaLayanandesa agar primary key tidak ikut dikirim pada respons JSON.
  2. Hide kolom id_device (DashboardController.php:337): Menambahkan ->makeHidden(['id_device']) pada datatablePenggunaKeloladesa agar Android Build ID perangkat tidak bocor.
  3. Perbaikan query & hide kolom (KelolaDesaDashboardController.php:90-98): Refactor query dengan select eksplisit, alias akses_terakhir untuk kolom akses, tambah makeHidden(['id_device']).
  4. Perbaikan query & hide kolom (LayananDesaDashboardController.php:90-99): Refactor query serupa dengan makeHidden(['id']).
  5. Hapus kolom "Id Perangkat" (tabel.blade.php): Menghapus header <th>Id Perangkat</th> dan binding kolom id_device/id dari DataTables di kedua view (keloladesa/tabel.blade.php dan layanandesa/tabel.blade.php).
  6. Perbaikan konsistensi kolom akses: Mengganti binding kolom updated_at menjadi akses_terakhir agar sesuai dengan alias baru di query, berikut format tanggal j F Y H:i:s.

Reason for Change

  • Kebocoran data tracking: id_device adalah identitas perangkat (Android Build ID) yang dapat digunakan untuk melacak perangkat petugas desa tertentu. Karena endpoint publik (tanpa auth), siapa pun dapat mengambilnya.
  • Privasi & keamanan: Field primary key id dan identitas perangkat seharusnya tidak diekspos pada respons API publik.
  • Menjaga fungsionalitas: Field sensitif dihapus dari output namun data fungsional (nama desa, kecamatan, kabupaten, waktu akses) tetap dipertahankan untuk kebutuhan dashboard.

Impact of Change

Keamanan: Data identitas perangkat petugas desa tidak lagi bocor ke publik.
Privasi: Android Build ID perangkat tidak dapat dilacak melalui endpoint publik.
Privasi: Primary key internal (id) tidak terekspos ke client.
Kompatibilitas: Data tampilan dashboard tetap berfungsi normal tanpa kolom sensitif.

Related Issue

Steps to Reproduce

Before fix (problem):

  1. Akses endpoint publik GET /datatables/pengguna-keloladesa (dipicu dari GET /web/keloladesa/detail) tanpa login, kirim header X-Requested-With: XMLHttpRequest.
  2. Periksa respons JSON pada setiap baris data.
  3. ❌ Terlihat field id_device berisi Android Build ID perangkat petugas desa (data tracking).
  4. Akses GET /datatables/pengguna-layanandesa dengan cara serupa.
  5. ❌ Terlihat field id (primary key) pada respons.

After fix (solution):

  1. Akses endpoint publik yang sama tanpa login.
  2. Periksa respons JSON pada setiap baris data.
  3. ✅ Kolom id_device dan id tidak lagi muncul pada respons.
  4. ✅ Kolom fungsional (desa, kecamatan, kabupaten, waktu akses) tetap tampil.
  5. ✅ Tampilan tabel tidak lagi menampilkan kolom "Id Perangkat".

Testing on related features:

  • Dashboard KelolaDesa ✅ Data tabel tetap tampil normal.
  • Dashboard LayananDesa ✅ Data tabel tetap tampil normal.

Checklist

  • Saya telah mematuhi aturan penulisan script
  • Saya telah mengikuti proses review pull request
  • Saya telah membuat [unit test/integration test] untuk memverifikasi perbaikan
  • Pengujian manual telah dilakukan di lingkungan development
  • Tidak ada error atau warning pada console
  • Tabel datatable publik tidak lagi memuat kolom sensitif

Technical Details

Technical Explanation

Respons datatable di-generate menggunakan yajra/laravel-datatables (DataTables::of(...)->make(true)). Meskipun field id_device ditampilkan lewat editColumn, kolom tersebut tetap dikirim pada JSON. Perbaikan menambahkan makeHidden([...]) (wrapper DataTables atas makeHidden() Eloquent) agar kolom tertentu disembunyikan dari serialisasi JSON tanpa menghapusnya dari query/model.

// Sebelum: field sensitif ikut terkirim
return DataTables::of($desa)
    ->addIndexColumn()
    ->escapeColumns([])
    ->make(true);

// Sesudah: field sensitif disembunyikan
return DataTables::of($desa)
    ->addIndexColumn()
    ->escapeColumns([])
    ->editColumn('tgl_akses', static fn ($q) => $q->updated_at ? Carbon::parse($q->updated_at)->translatedFormat('j F Y H:i:s') : '')
    ->makeHidden(['id_device'])   // KelolaDesa
    ->makeHidden(['id'])          // LayananDesa
    ->make(true);

Selain itu query pada KelolaDesaDashboardController dan LayananDesaDashboardController di-refactor agar memakai select eksplisit dengan alias akses_terakhir untuk kolom updated_at, dan view di-update menggunakan data: 'akses_terakhir' agar konsisten.

Catatan: kolom id disembunyikan pada datatablePenggunaLayanandesa, sedangkan datatablePenggunaKeloladesa menyembunyikan id_device (karena id_device merupakan primary key dari track_keloladesa). Pastikan penggunaan makeHidden sesuai dengan nama field yang diekspos di masing-masing endpoint.

Configuration changes

Tidak ada perubahan konfigurasi.

Dependencies added

Tidak ada dependency baru.

Testing

Manual Testing

  • Panggil GET /datatables/pengguna-layanandesa tanpa login (dengan header X-Requested-With) dan pastikan tidak ada field id.
  • Panggil GET /datatables/pengguna-keloladesa tanpa login dan pastikan tidak ada field id_device.
  • Pastikan halaman dashboard KelolaDesa dan LayananDesa tetap menampilkan data tabel dengan benar.
  • Regression Testing - pastikan fitur lain di dashboard tidak rusak.

Automated Testing

  • Integration Test - verifikasi respons datatable tidak mengandung id_device/id

Breaking Changes

Tidak ada. Kolom sensitif hanya dihapus dari respons publik; tidak ada data fungsional yang hilang.

Migration Guide

Tidak diperlukan.

References


Catatan tambahan: Middleware autentikasi pada endpoint ini memang tidak diterapkan, karena saat ini memang endpoint tersebut bisa diakses secara public

image

@github-actions

Copy link
Copy Markdown

🔄 AI PR Review sedang antri di server...

Proses review akan segera dimulai di background — hasil akan muncul sebagai komentar setelah selesai.
Powered by CrewAI · PR #715

@pandigresik pandigresik changed the title Fix/id device bocor Fix: Sembunyikan ID Perangkat (id_device) pada Datatable Publik Aug 31, 2026
@habibie11 habibie11 self-assigned this Sep 1, 2026
@habibie11
habibie11 merged commit 242df95 into rilis-dev Sep 1, 2026
1 check passed
@habibie11
habibie11 deleted the fix/id_device_bocor branch September 1, 2026 09:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants