0Pricing
Python Academy · درس

الاستعلامات المعلَّمة بالمعاملات

امنع حقن SQL

الاستعلامات المعلَّمة بالمعاملات درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.

خطر بناء السلاسل النصية

ينطوي بناء SQL من خلال ربط السلاسل النصية على مخاطر. فإذا احتوت مدخلات المستخدم على SQL، فقد تغيّر الاستعلام. يُسمّى ذلك حقن SQL.

لا تفعلوا ذلك مطلقًا مع البيانات غير الموثوقة.

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

كيف يبدو الحقن

تخيّلوا قيمة خبيثة. يؤدي ربطها بالسلسلة إلى تغيير معنى الاستعلام بالكامل.

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

البدائل النائبة للحماية

الطريقة الآمنة هي استخدام الاستعلامات ذات المعلمات. استخدموا ? كعنصر نائب، ومرّروا القيم في صف. ويتولى برنامج التشغيل تهريبها بأمان.

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()

عناصر نائبة متعددة

استخدموا عنصر ? نائبًا واحدًا لكل قيمة. مرّروا القيم في صف بالترتيب نفسه الذي تظهر به.

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()

صفوف ذات قيمة واحدة

يحتاج الصف الذي يحتوي على عنصر واحد إلى فاصلة في نهايته: ('Alice',). ومن دونها، يتعامل Python مع القوسين على أنهما مجرد تجميع.

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

حظر محاولة الحقن

باستخدام العناصر النائبة، تُعامل القيمة الخبيثة على أنها بيانات عادية لا SQL. ولذلك لن تطابق أي شيء.

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()

العناصر النائبة المسماة

يدعم SQLite أيضًا العناصر النائبة المسماة باستخدام الصيغة :name. مرّروا قاموسًا من القيم.

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()

المعلمات في WHERE

تعمل العناصر النائبة في أي عبارة تتلقى قيمة، بما في ذلك 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

لإدراج صفوف عديدة، استخدموا executemany() مع قائمة من الصفوف. فهذا أسرع ولا يزال آمنًا.

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()

العناصر النائبة ليست للمعرّفات

تعمل العناصر النائبة مع القيم فقط، وليس مع أسماء الجداول أو الأعمدة. ويجب أن تأتي هذه الأسماء من قائمة مسموحة موثوقة في شفرتكم.

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()

دالة إدراج قابلة لإعادة الاستخدام

يساعد تغليف عمليات الإدراج ذات المعلمات داخل دالة على إبقاء شفرتكم نظيفة وآمنة باستمرار.

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()

اختبار سريع

اختبروا معرفتكم بالاستعلامات الآمنة.

مراجعة

تعلّمتم كتابة استعلامات آمنة من الحقن.

  • لا تربطوا أبدًا المدخلات غير الموثوقة مباشرةً في SQL
  • استخدموا العناصر النائبة ? مع صف من القيم
  • تتلقى العناصر النائبة المسماة :name قاموسًا
  • تُدرج executemany() صفوفًا عديدة بأمان
  • العناصر النائبة مخصّصة للقيم، وليست للمعرّفات

الأسئلة الشائعة

هل درس «الاستعلامات المعلَّمة بالمعاملات» مجاني؟

نعم — نص درس «الاستعلامات المعلَّمة بالمعاملات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.

ماذا ستتعلم في «الاستعلامات المعلَّمة بالمعاملات»؟

امنع حقن SQL تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟

لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «الاستعلامات المعلَّمة بالمعاملات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟

نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الاتصال وإنشاء الجداول
  2. Insert وSelect وUpdate وDelete
  3. الاستعلامات المعلَّمة بالمعاملات
  4. المعاملات ومديرو السياق
← العودة إلى Python Academy