Skip to content

Perbaiki Kebocoran Domain dan Informasi Infrastruktur Endpoint Datatatable - #716

Merged
pandigresik merged 5 commits into
rilis-devfrom
dev-52
Sep 1, 2026
Merged

Perbaiki Kebocoran Domain dan Informasi Infrastruktur Endpoint Datatatable#716
pandigresik merged 5 commits into
rilis-devfrom
dev-52

Conversation

@habibie11

@habibie11 habibie11 commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

issue # https://github.com/OpenSID/wiki-keamanan/issues/52

🎯 Deskripsi

Pull request ini menangani celah keamanan (P1 / Medium Security Issue) terkait tereksposnya domain instalasi kecamatan OpenDK (*.berdesa.id, *.berdesa1.id), data batas wilayah / GeoJSON polygon (peta_wilayah, batas_wilayah), data demografis, dan informasi sensitif lainnya pada endpoint publik GET /datatables/pengguna-opendk serta endpoint terkait (pengguna-openkab dan pengguna-pbb).

Sebelumnya, endpoint tersebut dipanggil oleh halaman publik (seperti /web/opendk/detail, /web/openkab-data, /web/pbb-data) dan melakukan query SELECT * tanpa whitelist kolom, sehingga seluruh atribut sensitif model ikut terbawa dalam respons JSON DataTables.

Melalui PR ini, diterapkan langkah-langkah pengamanan:

  1. Whitelist Kolom Aman (Scope Pengguna): Pada model Opendk, Openkab, dan Pbb, ditambahkan scope pengguna() yang secara tegas hanya memilih kolom non-sensitif (identitas wilayah, versi aplikasi, dan tanggal pembaruan). Kolom url, peta_wilayah, batas_wilayah, nama_camat, jumlah_penduduk, jumlah_keluarga, dll. dihapus dari respons.
  2. Anti-Scraping / Length Limiting: Membatasi nilai parameter length pada DashboardController maksimal 25 baris untuk publik dan 100 baris untuk pengguna terautentikasi (mencegah dump massal otomatis).
  3. Penyelarasan View Frontend: Menghapus kolom URL pada tampilan tabel pbb_data.blade.php agar selaras dengan data backend yang aman.

🛠️ Perubahan yang Dilakukan

1. app/Models/Opendk.php

Security Fix — Penambahan scope pengguna dengan whitelist kolom aman:

  • Menambahkan scopePengguna($query) untuk memilih hanya kolom wilayah (nama_kecamatan, nama_kabupaten, nama_provinsi, kode_*), versi, sebutan_wilayah, updated_at, dan created_at.
  • Mencegah kebocoran url, peta_wilayah, batas_wilayah, nama_camat, jml_desa, jumlah_penduduk, jumlah_keluarga, dan alamat.
+    /**
+     * Scope pengguna OpenDK untuk datatable dengan whitelist kolom aman.
+     * Tidak menyertakan data sensitif seperti url, peta_wilayah, batas_wilayah,
+     * nama_camat, jumlah_*, dan alamat.
+     *
+     * @param  \Illuminate\Database\Eloquent\Builder  $query
+     * @return \Illuminate\Database\Eloquent\Builder
+     */
+    public function scopePengguna($query)
+    {
+        return $query->select([
+            'kode_kecamatan',
+            'kode_kabupaten',
+            'kode_provinsi',
+            'nama_kecamatan',
+            'nama_kabupaten',
+            'nama_provinsi',
+            'versi',
+            'sebutan_wilayah',
+            'updated_at',
+            'created_at',
+        ]);
+    }

2. app/Models/Openkab.php

Security Fix — Penambahan scope pengguna:

  • Menambahkan scopePengguna($query) untuk memilih hanya kolom wilayah, nama aplikasi, versi, dan tanggal, serta menyaring data url dan data demografis detail.
+    /**
+     * Scope pengguna OpenKab untuk datatable dengan whitelist kolom aman.
+     *
+     * @param  \Illuminate\Database\Eloquent\Builder  $query
+     * @return \Illuminate\Database\Eloquent\Builder
+     */
+    public function scopePengguna($query)
+    {
+        return $query->select([
+            'kode_kab',
+            'nama_kab',
+            'kode_prov',
+            'nama_prov',
+            'nama_aplikasi',
+            'sebutan_kab',
+            'versi',
+            'jumlah_desa',
+            'updated_at',
+            'created_at',
+            'tgl_rekam',
+        ]);
+    }

3. app/Models/Pbb.php

Security Fix — Penambahan scope pengguna:

  • Menambahkan scopePengguna($query) untuk menyaring kolom url dari respons tabel pengguna PBB.
+    /**
+     * Scope pengguna PBB untuk datatable dengan whitelist kolom aman (tanpa url).
+     *
+     * @param  \Illuminate\Database\Eloquent\Builder  $query
+     * @return \Illuminate\Database\Eloquent\Builder
+     */
+    public function scopePengguna($query)
+    {
+        return $query->select([
+            'kode_desa',
+            'nama_desa',
+            'kode_kecamatan',
+            'nama_kecamatan',
+            'kode_kabupaten',
+            'nama_kabupaten',
+            'kode_provinsi',
+            'nama_provinsi',
+            'versi',
+            'updated_at',
+            'created_at',
+        ]);
+    }

4. app/Http/Controllers/DashboardController.php

Security Fix — Penggunaan scope aman & pembatasan parameter length:

  • Mengubah datatablePenggunaOpendk() untuk memanggil Opendk::filter($fillters)->pengguna() serta menambahkan validasi batas length.
  • Mengubah datatablePenggunaOpenkab() untuk memanggil Openkab::pengguna() serta menambahkan batas length.
  • Mengubah datatablePenggunaPbb() untuk memanggil Pbb::pengguna() serta menambahkan batas length.
  • Menambahkan batas length pada datatablePenggunaLayanandesa() dan datatablePenggunaKeloladesa().
     public function datatablePenggunaOpendk(Request $request)
     {
+        $maxLength = auth()->check() ? 100 : 25;
+        if ($request->has('length') && (int) $request->length > $maxLength) {
+            $request->merge(['length' => $maxLength]);
+        }
+
         $fillters = [
             'kode_provinsi' => $request->kode_provinsi,
             'kode_kabupaten' => $request->kode_kabupaten,
             'kode_kecamatan' => $request->kode_kecamatan,
             'akses' => $request->akses,
         ];
 
         if ($request->ajax()) {
-            $desa = Opendk::filter($fillters)->orderBY('created_at', 'desc')->get()
+            $desa = Opendk::filter($fillters)
+                ->pengguna()
+                ->orderBy('created_at', 'desc')
+                ->get()

5. resources/views/website/pbb_data.blade.php

UI Fix — Penghapusan kolom URL:

  • Menghapus kolom header <th>URL</th> dan definisi kolom DataTable { data: 'url' } agar selaras dengan data backend.

✅ Test Cases yang Diimplementasikan

  • Request publik ke /datatables/pengguna-opendk tidak lagi mengembalikan url, peta_wilayah, batas_wilayah, nama_camat, jml_desa, jumlah_penduduk, jumlah_keluarga, dan alamat.
  • Request publik ke /datatables/pengguna-openkab tidak lagi mengembalikan url dan data demografis detail.
  • Request publik ke /datatables/pengguna-pbb tidak lagi mengembalikan url.
  • Parameter length yang melebihi 25 pada request publik secara otomatis dibatasi ke 25 baris.
  • Halaman web /web/opendk/detail, /web/openkab-data, dan /web/pbb-data tetap dapat merender data tabel dengan baik tanpa error JavaScript.
  • Seluruh automated unit tests lulus (19 passed, 75 assertions).

📸 Cara Menjalankan Uji Coba Manual

  1. Uji Coba Respon Datatable OpenDK:

    curl -s -H "X-Requested-With: XMLHttpRequest" \
      "http://localhost:8000/datatables/pengguna-opendk?draw=1&start=0&length=2"
    • Verifikasi: Periksa objek data JSON. Pastikan kunci url, peta_wilayah, batas_wilayah, nama_camat, jumlah_penduduk tidak ada.
  2. Uji Coba Respon Datatable OpenKab:

    curl -s -H "X-Requested-With: XMLHttpRequest" \
      "http://localhost:8000/datatables/pengguna-openkab?draw=1&start=0&length=2"
    • Verifikasi: Pastikan kunci url, jumlah_penduduk, jumlah_keluarga, dll tidak ada.
  3. Uji Coba Respon Datatable PBB:

    curl -s -H "X-Requested-With: XMLHttpRequest" \
      "http://localhost:8000/datatables/pengguna-pbb?draw=1&start=0&length=2"
    • Verifikasi: Pastikan kunci url tidak ada.
  4. Uji Coba Pembatasan Length:

    curl -s -H "X-Requested-With: XMLHttpRequest" \
      "http://localhost:8000/datatables/pengguna-opendk?draw=1&start=0&length=1000" \
      | php -r "echo count(json_decode(file_get_contents('php://stdin'), true)['data']);"
    • Verifikasi: Output jumlah data maksimal 25 baris.
  5. Uji Coba Halaman Web Browser:

    • Buka /web/opendk/detail di browser, periksa tabel pengguna OpenDK terisi normal.
    • Buka /web/openkab-data, periksa tabel pengguna OpenKab terisi normal.
    • Buka /web/pbb-data, periksa tabel pengguna PBB terisi normal tanpa kolom URL.

🤖 Cara Menjalankan Uji Coba Otomatis (Automated Test)

Jalankan pengujian unit PHPUnit:

php artisan test --testsuite=Unit

📸 Screenshot atau Video

image

⚠️ Catatan Penting

  • Seluruh halaman publik tetap dapat menampilkan data statistik penggunaan aplikasi secara normal.
  • Data domain instalasi (url) dan struktur batas wilayah / koordinat GeoJSON dinonaktifkan sepenuhnya dari endpoint publik demi mencegah reconnaissance dan scanning kerentanan massal.

@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 #716

@habibie11
habibie11 requested a review from vickyrolanda August 31, 2026 05:42
@habibie11 habibie11 changed the title Perbaiki Kebocoran Domain dan Informasi Infrastruktur Endpoint Datata… Perbaiki Kebocoran Domain dan Informasi Infrastruktur Endpoint Datatatable Sep 1, 2026
@pandigresik
pandigresik merged commit 6b3deed into rilis-dev Sep 1, 2026
1 check passed
@pandigresik
pandigresik deleted the dev-52 branch September 1, 2026 09:14
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