<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://lms.onnocenter.or.id/wiki/index.php?action=history&amp;feed=atom&amp;title=Praktik%3A_Mengamankan_formulir_login_dari_serangan_dasar</id>
	<title>Praktik: Mengamankan formulir login dari serangan dasar - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://lms.onnocenter.or.id/wiki/index.php?action=history&amp;feed=atom&amp;title=Praktik%3A_Mengamankan_formulir_login_dari_serangan_dasar"/>
	<link rel="alternate" type="text/html" href="https://lms.onnocenter.or.id/wiki/index.php?title=Praktik:_Mengamankan_formulir_login_dari_serangan_dasar&amp;action=history"/>
	<updated>2026-04-21T02:02:50Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://lms.onnocenter.or.id/wiki/index.php?title=Praktik:_Mengamankan_formulir_login_dari_serangan_dasar&amp;diff=72429&amp;oldid=prev</id>
		<title>Unknown user: /* 2. Membuat Formulir Login yang Aman */</title>
		<link rel="alternate" type="text/html" href="https://lms.onnocenter.or.id/wiki/index.php?title=Praktik:_Mengamankan_formulir_login_dari_serangan_dasar&amp;diff=72429&amp;oldid=prev"/>
		<updated>2025-04-07T02:35:00Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;2. Membuat Formulir Login yang Aman&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 02:35, 7 April 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l124&quot;&gt;Line 124:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 124:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;#039;&amp;#039;&amp;#039;Validasi Input:&amp;#039;&amp;#039;&amp;#039; Memastikan bahwa input tidak kosong sebelum diproses.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;#039;&amp;#039;&amp;#039;Validasi Input:&amp;#039;&amp;#039;&amp;#039; Memastikan bahwa input tidak kosong sebelum diproses.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;#039;&amp;#039;&amp;#039;Password Hashing:&amp;#039;&amp;#039;&amp;#039; Menggunakan `password_verify()` untuk memverifikasi kata sandi yang telah di-hash.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;#039;&amp;#039;&amp;#039;Password Hashing:&amp;#039;&amp;#039;&amp;#039; Menggunakan `password_verify()` untuk memverifikasi kata sandi yang telah di-hash.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Untuk informasi lebih lanjut tentang penggunaan prepared statements dalam mencegah SQL Injection, Anda dapat merujuk ke sumber berikut:&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==3. Mencegah Cross-Site Scripting (XSS)==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==3. Mencegah Cross-Site Scripting (XSS)==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Unknown user</name></author>
	</entry>
	<entry>
		<id>https://lms.onnocenter.or.id/wiki/index.php?title=Praktik:_Mengamankan_formulir_login_dari_serangan_dasar&amp;diff=72428&amp;oldid=prev</id>
		<title>Unknown user: /* 1. Persiapan Lingkungan */</title>
		<link rel="alternate" type="text/html" href="https://lms.onnocenter.or.id/wiki/index.php?title=Praktik:_Mengamankan_formulir_login_dari_serangan_dasar&amp;diff=72428&amp;oldid=prev"/>
		<updated>2025-04-07T02:34:34Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;1. Persiapan Lingkungan&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 02:34, 7 April 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l27&quot;&gt;Line 27:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 27:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  sudo apt install php libapache2-mod-php php-mysql -y&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  sudo apt install php libapache2-mod-php php-mysql -y&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Untuk informasi lebih lanjut mengenai instalasi LAMP, Anda dapat merujuk ke panduan berikut: citeturn0search1&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;1.2. Konfigurasi Direktori Proyek&amp;#039;&amp;#039;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;1.2. Konfigurasi Direktori Proyek&amp;#039;&amp;#039;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Unknown user</name></author>
	</entry>
	<entry>
		<id>https://lms.onnocenter.or.id/wiki/index.php?title=Praktik:_Mengamankan_formulir_login_dari_serangan_dasar&amp;diff=72427&amp;oldid=prev</id>
		<title>Unknown user at 02:34, 7 April 2025</title>
		<link rel="alternate" type="text/html" href="https://lms.onnocenter.or.id/wiki/index.php?title=Praktik:_Mengamankan_formulir_login_dari_serangan_dasar&amp;diff=72427&amp;oldid=prev"/>
		<updated>2025-04-07T02:34:15Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://lms.onnocenter.or.id/wiki/index.php?title=Praktik:_Mengamankan_formulir_login_dari_serangan_dasar&amp;amp;diff=72427&amp;amp;oldid=72326&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Unknown user</name></author>
	</entry>
	<entry>
		<id>https://lms.onnocenter.or.id/wiki/index.php?title=Praktik:_Mengamankan_formulir_login_dari_serangan_dasar&amp;diff=72326&amp;oldid=prev</id>
		<title>Unknown user: Created page with &quot;Berikut adalah modul &quot;Praktik: Mengamankan Formulir Login dari Serangan Dasar&quot; untuk mata kuliah Pemrograman Web, dengan fokus pada keamanan web dasar menggunakan Ubuntu 24.04...&quot;</title>
		<link rel="alternate" type="text/html" href="https://lms.onnocenter.or.id/wiki/index.php?title=Praktik:_Mengamankan_formulir_login_dari_serangan_dasar&amp;diff=72326&amp;oldid=prev"/>
		<updated>2025-04-06T02:07:54Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;Berikut adalah modul &amp;quot;Praktik: Mengamankan Formulir Login dari Serangan Dasar&amp;quot; untuk mata kuliah Pemrograman Web, dengan fokus pada keamanan web dasar menggunakan Ubuntu 24.04...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Berikut adalah modul &amp;quot;Praktik: Mengamankan Formulir Login dari Serangan Dasar&amp;quot; untuk mata kuliah Pemrograman Web, dengan fokus pada keamanan web dasar menggunakan Ubuntu 24.04. Modul ini mencakup langkah-langkah praktis dan contoh implementasi tanpa menggunakan alat dari Microsoft.&lt;br /&gt;
&lt;br /&gt;
## Pendahuluan&lt;br /&gt;
&lt;br /&gt;
Formulir login merupakan salah satu komponen penting dalam aplikasi web yang sering menjadi target serangan seperti **SQL Injection** dan **Cross-Site Scripting (XSS)**. Memahami dan menerapkan teknik pengamanan yang tepat pada formulir login akan membantu mencegah akses tidak sah dan melindungi data pengguna.&lt;br /&gt;
&lt;br /&gt;
## 1. Persiapan Lingkungan&lt;br /&gt;
&lt;br /&gt;
### 1.1. Instalasi LAMP Stack&lt;br /&gt;
&lt;br /&gt;
Pastikan server Ubuntu 24.04 Anda telah terinstal **Apache**, **MySQL**, dan **PHP** (LAMP Stack). Jika belum, ikuti langkah-langkah berikut:&lt;br /&gt;
&lt;br /&gt;
1. **Perbarui daftar paket:**&lt;br /&gt;
&lt;br /&gt;
   ```bash&lt;br /&gt;
   sudo apt update&lt;br /&gt;
   ```&lt;br /&gt;
&lt;br /&gt;
2. **Instal Apache:**&lt;br /&gt;
&lt;br /&gt;
   ```bash&lt;br /&gt;
   sudo apt install apache2 -y&lt;br /&gt;
   ```&lt;br /&gt;
&lt;br /&gt;
3. **Instal MySQL:**&lt;br /&gt;
&lt;br /&gt;
   ```bash&lt;br /&gt;
   sudo apt install mysql-server -y&lt;br /&gt;
   ```&lt;br /&gt;
&lt;br /&gt;
   Setelah instalasi, amankan MySQL dengan menjalankan:&lt;br /&gt;
&lt;br /&gt;
   ```bash&lt;br /&gt;
   sudo mysql_secure_installation&lt;br /&gt;
   ```&lt;br /&gt;
&lt;br /&gt;
4. **Instal PHP:**&lt;br /&gt;
&lt;br /&gt;
   ```bash&lt;br /&gt;
   sudo apt install php libapache2-mod-php php-mysql -y&lt;br /&gt;
   ```&lt;br /&gt;
&lt;br /&gt;
   Untuk informasi lebih lanjut mengenai instalasi LAMP, Anda dapat merujuk ke panduan berikut: citeturn0search1&lt;br /&gt;
&lt;br /&gt;
### 1.2. Konfigurasi Direktori Proyek&lt;br /&gt;
&lt;br /&gt;
Buat direktori untuk proyek Anda dan atur izin yang sesuai:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
sudo mkdir /var/www/html/secure-login&lt;br /&gt;
sudo chown -R $USER:$USER /var/www/html/secure-login&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
## 2. Membuat Formulir Login yang Aman&lt;br /&gt;
&lt;br /&gt;
### 2.1. Struktur Dasar Formulir Login&lt;br /&gt;
&lt;br /&gt;
Buat file `index.php` di direktori proyek dengan konten berikut:&lt;br /&gt;
&lt;br /&gt;
```php&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;id&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Formulir Login Aman&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h2&amp;gt;Login&amp;lt;/h2&amp;gt;&lt;br /&gt;
    &amp;lt;?php&lt;br /&gt;
    if (isset($_SESSION[&amp;#039;error&amp;#039;])) {&lt;br /&gt;
        echo &amp;#039;&amp;lt;p style=&amp;quot;color:red;&amp;quot;&amp;gt;&amp;#039; . htmlspecialchars($_SESSION[&amp;#039;error&amp;#039;]) . &amp;#039;&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
        unset($_SESSION[&amp;#039;error&amp;#039;]);&lt;br /&gt;
    }&lt;br /&gt;
    ?&amp;gt;&lt;br /&gt;
    &amp;lt;form action=&amp;quot;authenticate.php&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label for=&amp;quot;username&amp;quot;&amp;gt;Nama Pengguna:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;username&amp;quot; name=&amp;quot;username&amp;quot; required&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&lt;br /&gt;
        &amp;lt;label for=&amp;quot;password&amp;quot;&amp;gt;Kata Sandi:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;password&amp;quot; id=&amp;quot;password&amp;quot; name=&amp;quot;password&amp;quot; required&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Masuk&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
### 2.2. Proses Autentikasi dengan Prepared Statements&lt;br /&gt;
&lt;br /&gt;
Buat file `authenticate.php` dengan konten berikut untuk memproses input pengguna dan mencegah SQL Injection:&lt;br /&gt;
&lt;br /&gt;
```php&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
$host = &amp;#039;localhost&amp;#039;;&lt;br /&gt;
$dbname = &amp;#039;nama_database&amp;#039;;&lt;br /&gt;
$username = &amp;#039;nama_pengguna&amp;#039;;&lt;br /&gt;
$password = &amp;#039;kata_sandi&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
    $pdo = new PDO(&amp;quot;mysql:host=$host;dbname=$dbname;charset=utf8&amp;quot;, $username, $password);&lt;br /&gt;
    $pdo-&amp;gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);&lt;br /&gt;
} catch (PDOException $e) {&lt;br /&gt;
    die(&amp;quot;Koneksi gagal: &amp;quot; . htmlspecialchars($e-&amp;gt;getMessage()));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
    $user = trim($_POST[&amp;#039;username&amp;#039;]);&lt;br /&gt;
    $pass = trim($_POST[&amp;#039;password&amp;#039;]);&lt;br /&gt;
&lt;br /&gt;
    if (empty($user) || empty($pass)) {&lt;br /&gt;
        $_SESSION[&amp;#039;error&amp;#039;] = &amp;#039;Nama pengguna dan kata sandi harus diisi.&amp;#039;;&lt;br /&gt;
        header(&amp;#039;Location: index.php&amp;#039;);&lt;br /&gt;
        exit();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    $stmt = $pdo-&amp;gt;prepare(&amp;quot;SELECT password FROM users WHERE username = :username&amp;quot;);&lt;br /&gt;
    $stmt-&amp;gt;bindParam(&amp;#039;:username&amp;#039;, $user, PDO::PARAM_STR);&lt;br /&gt;
    $stmt-&amp;gt;execute();&lt;br /&gt;
    $row = $stmt-&amp;gt;fetch(PDO::FETCH_ASSOC);&lt;br /&gt;
&lt;br /&gt;
    if ($row &amp;amp;&amp;amp; password_verify($pass, $row[&amp;#039;password&amp;#039;])) {&lt;br /&gt;
        $_SESSION[&amp;#039;user&amp;#039;] = $user;&lt;br /&gt;
        header(&amp;#039;Location: dashboard.php&amp;#039;);&lt;br /&gt;
        exit();&lt;br /&gt;
    } else {&lt;br /&gt;
        $_SESSION[&amp;#039;error&amp;#039;] = &amp;#039;Nama pengguna atau kata sandi salah.&amp;#039;;&lt;br /&gt;
        header(&amp;#039;Location: index.php&amp;#039;);&lt;br /&gt;
        exit();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
**Penjelasan:**&lt;br /&gt;
&lt;br /&gt;
- **Koneksi Database:** Menggunakan PDO untuk koneksi yang aman ke database.&lt;br /&gt;
&lt;br /&gt;
- **Prepared Statements:** Mencegah SQL Injection dengan memisahkan data dari perintah SQL.&lt;br /&gt;
&lt;br /&gt;
- **Validasi Input:** Memastikan bahwa input tidak kosong sebelum diproses.&lt;br /&gt;
&lt;br /&gt;
- **Password Hashing:** Menggunakan `password_verify()` untuk memverifikasi kata sandi yang telah di-hash.&lt;br /&gt;
&lt;br /&gt;
Untuk informasi lebih lanjut tentang penggunaan prepared statements dalam mencegah SQL Injection, Anda dapat merujuk ke sumber berikut: citeturn0search14&lt;br /&gt;
&lt;br /&gt;
## 3. Mencegah Cross-Site Scripting (XSS)&lt;br /&gt;
&lt;br /&gt;
Untuk mencegah XSS, pastikan semua output yang ditampilkan ke pengguna telah di-escape dengan `htmlspecialchars()`. Contoh implementasi telah ditunjukkan pada bagian sebelumnya di mana pesan kesalahan ditampilkan.&lt;br /&gt;
&lt;br /&gt;
Selain itu, Anda dapat mengatur **Content Security Policy (CSP)** untuk membatasi sumber daya yang dapat dimuat oleh browser, sehingga mencegah eksekusi skrip berbahaya. Tambahkan header berikut pada konfigurasi Apache:&lt;br /&gt;
&lt;br /&gt;
```apache&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
    Header set Content-Security-Policy &amp;quot;default-src &amp;#039;self&amp;#039;; script-src &amp;#039;self&amp;#039;; style-src &amp;#039;self&amp;#039;;&amp;quot;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Untuk informasi lebih lanjut tentang pencegahan XSS dalam aplikasi PHP, Anda dapat merujuk ke artikel berikut: citeturn0search10&lt;br /&gt;
&lt;br /&gt;
## 4. Penggunaan HTTPS&lt;br /&gt;
&lt;br /&gt;
Pastikan komunikasi antara klien dan server dienkripsi dengan HTTPS. Anda dapat menggunakan **Let&amp;#039;s Encrypt** untuk mendapatkan sertifikat SSL&lt;/div&gt;</summary>
		<author><name>Unknown user</name></author>
	</entry>
</feed>