0Pricing
Python Academy · Pelajaran

Kueri Berparameter

Cegah injeksi SQL

Kueri Berparameter adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Python Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Python Academy mencakup 4 pelajaran total.

Bahaya Merangkai Teks

Membangun SQL dengan merangkai teks berisiko. Jika masukan pengguna berisi SQL, masukan tersebut dapat mengubah kueri Anda. Ini disebut injeksi SQL.

Jangan pernah melakukan ini dengan data yang tidak tepercaya.

name = 'Alice'
# Unsafe pattern - do NOT do this
query = "SELECT * FROM users WHERE name = '" + name + "'"
print(query)

Bentuk Injeksi

Bayangkan sebuah nilai berbahaya. Merangkainya akan mengubah makna kueri sepenuhnya.

name = "x' OR '1'='1"
query = "SELECT * FROM users WHERE name = '" + name + "'"
print(query)
print('The OR clause makes every row match!')

Penanda Tempat sebagai Solusi

Cara yang aman adalah menggunakan kueri berparameter. Gunakan ? sebagai penanda tempat dan teruskan nilai sebagai tupel. Penggerak akan melakukan pelolosan dengan aman.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')
cur.execute('INSERT INTO users (name) VALUES (?)', ('Alice',))
cur.execute('SELECT * FROM users')
print(cur.fetchall())
conn.close()

Beberapa Penanda Tempat

Gunakan satu ? untuk setiap nilai. Teruskan semuanya dalam tupel dengan urutan yang sama seperti kemunculannya.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')
cur.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Bob', 25))
cur.execute('SELECT * FROM users')
print(cur.fetchall())
conn.close()

Tupel Bernilai Tunggal

Tupel yang memiliki satu elemen memerlukan koma di akhir: ('Alice',). Tanpa koma tersebut, Python menganggap tanda kurung hanya sebagai pengelompokan.

good = ('Alice',)
bad = ('Alice')
print(type(good), type(bad))

Upaya Injeksi Diblokir

Dengan penanda tempat, nilai berbahaya diperlakukan sebagai data biasa, bukan SQL. Nilai tersebut hanya tidak cocok dengan apa pun.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')
cur.execute('INSERT INTO users (name) VALUES (?)', ('Alice',))
evil = "x' OR '1'='1"
cur.execute('SELECT * FROM users WHERE name = ?', (evil,))
print('Rows matched:', cur.fetchall())
conn.close()

Penanda Tempat Bernama

SQLite juga mendukung penanda tempat bernama dengan sintaks :name. Teruskan kamus yang berisi nilai.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')
cur.execute('INSERT INTO users (name, age) VALUES (:n, :a)', {'n': 'Carol', 'a': 40})
cur.execute('SELECT * FROM users')
print(cur.fetchall())
conn.close()

Parameter dalam WHERE

Penanda tempat dapat digunakan dalam klausa apa pun yang menerima nilai, termasuk WHERE.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')
cur.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Alice', 30))
cur.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Bob', 25))
cur.execute('SELECT name FROM users WHERE age > ?', (28,))
print(cur.fetchall())
conn.close()

executemany

Untuk menyisipkan banyak baris, gunakan executemany() dengan daftar tupel. Cara ini lebih cepat dan tetap aman.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')
rows = [('Alice',), ('Bob',), ('Carol',)]
cur.executemany('INSERT INTO users (name) VALUES (?)', rows)
cur.execute('SELECT COUNT(*) FROM users')
print(cur.fetchone())
conn.close()

Penanda Tempat Bukan untuk Pengenal

Penanda tempat hanya berfungsi untuk nilai, bukan nama tabel atau kolom. Nama tersebut harus berasal dari daftar putih tepercaya di kode Anda sendiri.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')
allowed = {'name', 'id'}
col = 'name'
if col in allowed:
    cur.execute('SELECT ' + col + ' FROM users')
    print('Safe column query ran')
conn.close()

Fungsi Penyisipan yang Dapat Digunakan Kembali

Membungkus penyisipan berparameter dalam sebuah fungsi membuat kode Anda tetap rapi dan aman secara konsisten.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')

def add_user(cursor, name):
    cursor.execute('INSERT INTO users (name) VALUES (?)', (name,))

add_user(cur, 'Dave')
cur.execute('SELECT * FROM users')
print(cur.fetchall())
conn.close()

Pemeriksaan Cepat

Uji pengetahuan Anda tentang kueri yang aman.

Rangkuman

Anda telah mempelajari cara menulis kueri yang aman dari injeksi.

  • Jangan pernah merangkai masukan yang tidak tepercaya ke dalam SQL
  • Gunakan penanda tempat ? dengan tupel yang berisi nilai
  • Penanda tempat bernama :name menerima kamus
  • executemany() menyisipkan banyak baris dengan aman
  • Penanda tempat digunakan untuk nilai, bukan pengenal

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Kueri Berparameter” gratis?

Ya — teks lengkap “Kueri Berparameter” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Python Academy, upgrade ke CoddyKit PRO. Kursus Python Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Kueri Berparameter”?

Cegah injeksi SQL Kamu berlatih Python Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Python Academy?

Tidak diperlukan pengalaman sebelumnya. Python Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Kueri Berparameter” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Python Academy ini?

Ya. Setiap pelajaran Python Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Menyambungkan dan Membuat Tabel
  2. Insert, Select, Update, Delete
  3. Kueri Berparameter
  4. Transaksi dan Pengelola Context
← Kembali ke Python Academy