แก้ไขรหัสหลามเพื่อแทรกค่า NULL ลงใน MySQL

ฉันกำลังพยายามแทรกตัวแปรบางตัวลงในฐานข้อมูล MySQL โดยใช้ python บางครั้งตัวแปรจะเป็นสตริงและบางครั้งอาจเป็นไม่มี

สิ่งที่ฉันกำลังพยายามในเวอร์ชันที่เรียบง่ายอย่างมากอยู่ด้านล่าง:

import MySQLdb as mdb
f = "Bob"
m = None
l = "Smith"

db = mdb.connect("blah blah blah")
with db:
    cur.execute("INSERT INTO name (first, middle, last) VALUES ('{0}', '{1}', '{2}')".format(f, m, l))

ปัญหาคือแทรก 'None' เป็นสตริงแทนที่จะเป็นค่า NULL จริง

ฉันสามารถแก้ไขปัญหาได้โดยเปลี่ยนบรรทัดสุดท้ายเป็น:

cur.execute("INSERT INTO name (first, middle, last) VALUES (%s, %s, %s)", (f, m, l))

แต่ฉันเชื่อว่านี่ทำให้โค้ดเสี่ยงต่อการโจมตีแบบฉีด MySQL หากใครรู้วิธีที่ถูกต้องโดยใช้วิธี .format ฉันจะขอบคุณมาก


person Ken Williams    schedule 25.06.2015    source แหล่งที่มา
comment
ไม่ การจัดรูปแบบสตริงทำให้คุณมีความเสี่ยง การส่งผ่านค่าวิธีที่สองคือสิ่งที่คาดหวัง   -  person That1Guy    schedule 25.06.2015
comment
ขอบคุณ - ฉันดีใจที่ได้รับคำขอโทษสำหรับคำถามโง่ๆ ในช่วงต้นๆ   -  person Ken Williams    schedule 25.06.2015
comment
มันไม่ใช่คำถามโง่ๆ สิ่งสำคัญคือคุณต้องรู้วิธีป้องกันการแทรก SQL   -  person That1Guy    schedule 25.06.2015


คำตอบ (1)


วิธีการแทรกข้อมูลที่คาดหวังมีดังต่อไปนี้:

cur.execute("INSERT INTO name (first, middle, last) VALUES (%s, %s, %s)", (f, m, l))

การจัดรูปแบบสตริงเหมือนกับในตัวอย่างแรกของคุณทำให้แอปพลิเคชันของคุณเสี่ยงต่อการถูกแทรก SQL

person That1Guy    schedule 25.06.2015
comment
อย่างแน่นอน. ทั้ง % ที่เลิกใช้แล้ว และ .format จะไม่ทำงานในกรณีนี้ - person Neurotransmitter; 27.07.2016