Rumah >pangkalan data >tutorial mysql >Bagaimana PreparedStatements Melindungi Terhadap SQL Injection?

Bagaimana PreparedStatements Melindungi Terhadap SQL Injection?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-20 22:55:09506semak imbas

How Do PreparedStatements Protect Against SQL Injection?

Pernyataan Disediakan: Pertahanan Teguh Terhadap Suntikan SQL

Suntikan SQL kekal sebagai kelemahan keselamatan yang kritikal, membenarkan penyerang memanipulasi pertanyaan pangkalan data untuk tujuan berniat jahat. Kenyataan yang disediakan menawarkan penyelesaian yang berkuasa, dengan berkesan menghalang jenis serangan ini. Tetapi bagaimana ia berfungsi?

Pernyataan yang disediakan menggunakan pertanyaan berparameter. Daripada membenamkan input pengguna terus ke dalam rentetan SQL, pertanyaan templat dibuat dengan ruang letak (seperti "?"). Nilai sebenar kemudiannya dibekalkan secara berasingan menggunakan kaedah seperti setString(), setInt(), dsb.

Ini berbeza dengan ketara dengan menggabungkan input pengguna secara langsung ke dalam rentetan SQL (cth., "INSERT INTO users VALUES('" username "')"). Dalam pendekatan tidak selamat ini, kod hasad yang disuntik oleh pengguna menjadi sebahagian daripada pertanyaan yang dilaksanakan. Contohnya, pengguna boleh memasukkan '; DROP TABLE users; --' yang membawa kepada pemadaman jadual.

Pernyataan yang disediakan mengurangkan risiko ini dengan memisahkan dengan ketat pertanyaan SQL daripada data yang dibekalkan pengguna. Pemegang tempat dianggap sebagai data, bukan sebagai kod SQL boleh laku. Enjin pangkalan data mengendalikan nilai parameter secara bebas, menghalang sebarang kod hasad daripada ditafsirkan sebagai sebahagian daripada arahan SQL.

Contoh Ilustrasi:

Bandingkan dua coretan kod ini:

<code class="language-java">// Vulnerable to SQL injection
Statement stmt = conn.createStatement("INSERT INTO users VALUES('" + username + "')");
stmt.execute();</code>
<code class="language-java">// Secure using PreparedStatement
PreparedStatement stmt = conn.prepareStatement("INSERT INTO users VALUES(?)");
stmt.setString(1, username);
stmt.execute();</code>

Contoh pertama terdedah kepada suntikan SQL. Yang kedua, menggunakan PreparedStatement, memisahkan struktur pertanyaan dengan selamat daripada username pengguna, menjadikan percubaan suntikan SQL tidak berkesan.

Ringkasnya, kekuatan teras PreparedStatements terletak pada keupayaan mereka untuk mengasingkan input pengguna daripada pertanyaan SQL, memberikan pertahanan yang kukuh dan boleh dipercayai terhadap suntikan SQL dan menjaga integriti pangkalan data.

Atas ialah kandungan terperinci Bagaimana PreparedStatements Melindungi Terhadap SQL Injection?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn