Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions catatan_rilis.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ Di rilis ini, versi 2604.0.0 berisi penambahan dan perbaikan yang diminta penggu
2. [#948](https://github.com/OpenSID/OpenKab/issues/948) Penambahan filter tahun pada statistik seni budaya & pendidikan data presisi.
3. [#952](https://github.com/OpenSID/OpenKab/issues/952) Penambahan filter tahun pada statistik Aktivitas Keagamaan, ketenagakerjaan dan adat data presisi.
4. [#942](https://github.com/OpenSID/OpenKab/issues/942) Penambahan fitur menampilkan artikel OpenSID di halaman publik.
5. [#372](https://github.com/OpenSID/API-Database-Gabungan/issues/372) Penambahan judul dan kategori ketika hapus artikel.


#### Perbaikan BUG

Expand Down
6 changes: 4 additions & 2 deletions resources/views/master/artikel/index.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,11 @@ className: 'aksi',
let canEdit = `{{ $canedit }}`
let canDelete = `{{ $candelete }}`
var id = row.id;
let titleDelete = `Apakah anda yakin menghapus artikel dengan judul ${row.attributes.judul} - kategori ${row.attributes.kategori_nama} ?`
let buttonEdit = canEdit ? `<a href="{{ route('master-data-artikel.index') }}/${id}/edit" class="btn btn-warning btn-sm" title="Edit">
<i class="fas fa-edit"></i>
</a>` : ``;
let buttonDelete = canDelete ? `<button type="button" class="btn btn-danger btn-sm hapus" data-id="${id}" title="Hapus">
let buttonDelete = canDelete ? `<button type="button" class="btn btn-danger btn-sm hapus" data-id="${id}" data-title-delete="${titleDelete}" title="Hapus">
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[HIGH] 🐛 Bug: HTML Attribute Injection via Unescaped Data

Kode:

<button class="btn btn-sm btn-danger delete-btn" data-id="${row.id}" data-title-delete="${titleDelete}">

Skenario:
Variable titleDelete sudah mengandung HTML tags (<strong>). Ketika dimasukkan ke dalam attribute data-title-delete, jika ada karakter quote (" atau ') di dalam row.judul atau row.kategori_nama, bisa break keluar dari attribute context. Contoh: judul artikel Test" onload="alert('XSS') akan menghasilkan:

data-title-delete="... judul <strong>Test" onload="alert('XSS')</strong> ..."

Ini akan membuat attribute onload baru yang mengeksekusi JavaScript.

Dampak:

  • XSS execution saat element di-render
  • Attribute injection bisa menambahkan event handler berbahaya
  • Bypass sanitization yang hanya fokus pada HTML content

Fix:

// Opsi 1: Jangan simpan HTML di data attribute, simpan data mentah saja
render: function(data, type, row) {
    return `
        <a href="/artikel/${row.id}/edit" class="btn btn-sm btn-warning">
            <i class="fas fa-edit"></i>
        </a>
        <button class="btn btn-sm btn-danger delete-btn" 
                data-id="${row.id}" 
                data-judul="${escapeHtml(row.judul)}" 
                data-kategori="${escapeHtml(row.kategori_nama)}">
            <i class="fas fa-trash"></i>
        </button>
    `;
}

// Lalu di event handler:
$('#artikel-table').on('click', '.delete-btn', function() {
    var id = $(this).data('id');
    var judul = $(this).data('judul');
    var kategori = $(this).data('kategori');
    
    Swal.fire({
        title: 'Konfirmasi Hapus',
        html: `Apakah anda yakin menghapus artikel dengan judul <strong>${judul}</strong> kategori <strong>${kategori}</strong> ?`,
        // ... rest
    });
});

// Opsi 2: Gunakan text-only tanpa HTML formatting
Swal.fire({
    title: 'Konfirmasi Hapus',
    text: `Apakah anda yakin menghapus artikel "${judul}" kategori "${kategori}" ?`,
    icon: 'warning',
    // ...
});

<i class="fas fa-trash"></i>
</button>` : ``;
return `${buttonEdit} ${buttonDelete}`;
Expand Down Expand Up @@ -145,10 +146,11 @@ className: 'text-center',

$(document).on('click', 'button.hapus', function() {
var id = $(this).data('id')
let titleDelete = $(this).data('title-delete')
var that = $(this);
Swal.fire({
title: 'Hapus',
text: "Apakah anda yakin menghapus artikel ini?",
text: titleDelete,
icon: 'warning',
showCancelButton: true,
confirmButtonText: 'Hapus'
Expand Down