पैरामीटरयुक्त क्वेरी
SQL इंजेक्शन रोकें
पैरामीटरयुक्त क्वेरी, CoddyKit पर Python Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Python Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Python Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
स्ट्रिंग बनाकर SQL तैयार करने का ख़तरा
स्ट्रिंग जोड़कर 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()कई पंक्तियाँ सुरक्षित रूप से डालता है- स्थानधारक मानों के लिए होते हैं, पहचानकर्ताओं के लिए नहीं
एआई शिक्षक के साथ Python सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 76
- पाठ
- 320
अक्सर पूछे जाने वाले प्रश्न
क्या “पैरामीटरयुक्त क्वेरी” पाठ निःशुल्क है?
हाँ—“पैरामीटरयुक्त क्वेरी” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Python Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Python Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“पैरामीटरयुक्त क्वेरी” में मैं क्या सीखूँगा?
SQL इंजेक्शन रोकें आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Python Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Python Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Python Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“पैरामीटरयुक्त क्वेरी” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Python Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Python Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- कनेक्ट करना और तालिकाएँ बनाना
- Insert, Select, Update, Delete
- पैरामीटरयुक्त क्वेरी
- ट्रांज़ैक्शन और संदर्भ प्रबंधक