MySQL-ga ulanish va so'rovlarni bajarish uchun Pythonning eng yaxshi amaliyoti va xavfsizligi

MySQL-da so'rovlarni bajarishning eng xavfsiz yo'li qanday? Men MySQL va SQL-ning in'ikoslari bilan bog'liq xavf-xatarlardan xabardorman.

Boshqa foydalanuvchilar (webclients) ishlashi mumkin bo'lgan parametrlarga inyeksiyani oldini olish uchun so'rovlarni qanday bajarish kerakligini bilmayman. Men o'zimning qochish funktsiyasini yozardim, lekin ko'rinib turibdiki, bu "bajarilmadi".

MySQL ma'lumotlar bazasiga MySQL in'ektsiyasini xavf ostiga olmaguncha python orqali so'rovlar va so'rovlarni xavfsiz tarzda ishlatish uchun qanday foydalanishim kerak?

42

3 javoblar

Inyektsiyalarning oldini olish uchun bajaring har bir o'zgaruvchining o'rniga % s bilan kiriting, keyin bajaring . Bu erda hujjatlardan olingan misol :

c=db.cursor()
max_price=5
c.execute("""SELECT spam, eggs, sausage FROM breakfast
          WHERE price < %s""", (max_price,))

Bu % emas, balki vergul (bu to'g'ridan-to'g'ri mag'lubiyatga almashtirish bo'lishi mumkin emas, balki qochib ketmagan). Buni qilmang :

c.execute("""SELECT spam, eggs, sausage FROM breakfast
          WHERE price < %s""" % (max_price,))

Bunga qo'shimcha ravishda, agar parametr bir magistr bo'lsa, pozitsiya egasi ("code" "% s" ) atrofidagi tirnoqlarga kerak emas.

62
qo'shib qo'ydi
va bu butun son bo'lsa
qo'shib qo'ydi muallif Lucas Kauffman, manba
max_price orqasida nima uchun vergul mavjud? Nima degani bu ? Kechirasiz, mening savollarim noobish ko'rinadi, lekin men python uchun juda yangiman :)
qo'shib qo'ydi muallif Lucas Kauffman, manba
Siz dedingiz: Bu vergul emas, balki% (bu to'g'ridan-to'g'ri mag'lubiyat tiklash, qochib ketmasligi kerak). Buni qilmang Ishonchingiz komilmi? Men verguldan foydalanganligim sababli mag'lubiyatga uchrayman
qo'shib qo'ydi muallif Hussain, manba
@Bruno Oh! Men tushundim. Men buni to'g'ri yo'l bilan qilyapman. Yo'lda meni kechir. Men buni tushunmadim.
qo'shib qo'ydi muallif Hussain, manba
% s -dan ham foydalaning (yuqoridagi misolga qarang max_price ).
qo'shib qo'ydi muallif Bruno, manba
max_price dan keyin koma 1 elementli tuple belgisi: docs.python.org/tutorial/…
qo'shib qo'ydi muallif Bruno, manba
@HussainTamboli, ha, men aynan shunday deb aytdim: vergul (parametrni joylovchi tomonlardan foydalanishning to'g'ri yo'li), (% ) parametrlardan qochib qutula olmaydi.
qo'shib qo'ydi muallif Bruno, manba
Python, MySQL-ni tushunadigan va kerakli tirnoqlarni qo'shadigan ma'lumot turiga tuple qiymatlarini o'zgartiradi.
qo'shib qo'ydi muallif shadow0359, manba

Bruno tomonidan berilgan javobning kengayishi sifatida MySQL mijozlar kutubxonasi sizning nomlangan parametrlarni ko'rsatish uchun bir nechta turli formatlarni qo'llashi mumkin. PEP 249 (DB-API) dan quyidagi kabi so'rovlarni yozishingiz mumkin:

'qmark'

>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = ?", (lumberjack,))

'soni'

>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = :1", (lumberjack,))

"nomlangan"

>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = :jack", {'jack': lumberjack})

"format"

>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = %s", (lumberjack,))

'pyformat'

>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = %(jack)s", {'jack': lumberjack})

paramstyle modul darajasidagi o'zgaruvchiga qarab, mijozlar kutubxonangizni qo'llab-quvvatlaganini ko'rishingiz mumkin:

>>> clientlibrary.paramstyle
'pyformat'

Yuqoridagi variantlardan har qanday ehtimol xavfli ma'lumotni ko'rib chiqish uchun to'g'ri ish qilish kerak. Bruno ta'kidlaganidek, hech qachon parametrlarni o'zingiz qo'shishga harakat qilmang. Ko'p ishlatiladigan mijozlar kutubxonalari bizni o'limga o'xshash narsalardan ko'ra ma'lumotlarni to'g'ri ishlashda yaxshiroq.

61
qo'shib qo'ydi
Qaysi mijoz kutubxonalari "nomlangan" ni qo'llab-quvvatlaydi? PyMySQL va MySQLdb-quvvatlash "formati" va oursql "qmark" ni qo'llab-quvvatlaydi.
qo'shib qo'ydi muallif Martin Burch, manba
sqlite3 hech bo'lmaganda «nomlangan» ni qo'llab-quvvatlaydi. Menda "nomlangan" yordamni tekshirish uchun MySQL-adapter o'rnatilgan emas.
qo'shib qo'ydi muallif Kirk Strauser, manba
Bu o'z-o'zidan yaxshi. Men juda ham xohlasam, SQLAlchemy kabi ORMni tekshirishni tavsiya qilaman va u siz uchun tafsilotlarni boshqarishga ruxsat beradi.
qo'shib qo'ydi muallif Kirk Strauser, manba
Bilaman, bu eski savol, lekin veb-sahifamni to'g'ri kodlashni va xavfsiz SQLda ko'p tajribaga ega emasligimni his qilyapman. Yuqorida aytib o'tilgan usulni SQL in'yuni oldini olish uchun etarli bo'lgan usuldan foydalanyapsizmi yoki bunga qo'shimcha qilish kerak bo'lgan boshqa narsalar bormi? Rahmat.
qo'shib qo'ydi muallif jonesy19, manba

Agar mysqldb foydalanayotgan bo'lsangiz, ichki escape_string funksiyasidan foydalanishingiz mumkin. Shunga o'xshash.

sql = "SELECT spam FROM eggs WHERE lumberjack = '" + MySQLdb.escape_string(str(lumberjack)) + "';"
cursor.execute(sql)

Men doimo ma'lumotlar bazasi ulagichining qochish funktsiyasidan foydalanishni afzal ko'raman - u mo'ljallangan va qo'lda kodlash qochish funktsiyalari sizning o'zingizga xavfsizlik tavakkalidir.

0
qo'shib qo'ydi
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming