import java.util.List;

public class DemoInjection {

    static final List<String> PENGGUNA = List.of("Budi", "Siti", "Dewi");

    public static void main(String[] args) {
        System.out.println("== 1. Kueri rentan: nilai pengguna digabung langsung ==");
        tampilRawan("Budi");
        tampilRawan("' OR '1'='1");
        tampilRawan("Budi'; DELETE FROM pesanan; --");

        System.out.println("== 2. Kueri berparameter: nilai terkirim sebagai data ==");
        System.out.println("input  : Budi           -> baris cocok : "
                + jalankanBerparameter("Budi"));
        System.out.println("input  : ' OR '1'='1    -> baris cocok : "
                + jalankanBerparameter("' OR '1'='1"));

        System.out.println();
        System.out.println("== 3. Validasi whitelist sebelum menyentuh SQL ==");
        System.out.println("input  : Budi           -> " + validasiWhitelist("Budi"));
        System.out.println("input  : ' OR '1'='1    -> " + validasiWhitelist("' OR '1'='1"));

        System.out.println();
        System.out.println("== 4. Prinsip hak akses minimum ==");
        System.out.println("akun aplikasi : toko_app");
        System.out.println("hak SQL       : SELECT, INSERT, UPDATE pada tabel milik aplikasi");
        System.out.println("tanpa hak     : DROP, DELETE massal, akses tabel sistem");
    }

    /** Pola yang salah: struktur SQL dan data pengguna menyatu. */
    static void tampilRawan(String input) {
        String sql = "SELECT * FROM pengguna WHERE nama = '" + input + "'";
        System.out.println("input  : " + input);
        System.out.println("SQL    : " + sql);
        if (input.contains(";")) {
            System.out.println("efek   : pernyataan tambahan dapat ikut tereksekusi"
                    + " bila opsi multi-statement aktif");
        } else if (input.contains(" OR ")) {
            System.out.println("efek   : kondisi WHERE dapat menjadi selalu benar,"
                    + " seluruh baris terbaca");
        } else if (input.contains("'")) {
            System.out.println("efek   : struktur literal SQL berubah");
        }
        System.out.println();
    }

    /** Pola yang benar: nilai hanya dibandingkan sebagai data. */
    static int jalankanBerparameter(String nilai) {
        int cocok = 0;
        for (String p : PENGGUNA) {
            if (p.equals(nilai)) {
                cocok++;
            }
        }
        return cocok;
    }

    /** Validasi masukan: hanya huruf dan spasi yang berarti di sini. */
    static String validasiWhitelist(String input) {
        return input.matches("[A-Za-z ]+")
                ? "LOLOS (pola ^[A-Za-z ]+$)"
                : "DITOLAK (ada karakter di luar huruf dan spasi)";
    }
}
