แปลง python string เพื่อใช้กับ sql command ???

  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.
  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.

สวัสดีครับ ขออนุญาตเข้าร่วมวง codenone ด้วยนะครับ เพราะล่าสุดเพิ่งได้โอกาสหัดๆใช้ python พอดีครับ

ตอนนี้ผมมีปัญหาเกี่ยวกับการเขียน python ให้ป้องกัน sql injection ครับ (อาจจะไม่ได้เป็นปัญหาเกี่ยวกับ python โดยตรงเท่าไหร่)

คือถ้าเข้าใจไม่ผิดเหมือนว่า python เวลาเชื่อมต่อกับ db มี module หรือ method ที่ป้องกัน sql injection ได้ แต่ว่าของผมจะต่างไปเล็กน้อย คือ ผมต้องนำตัวแปรที่เป็น string ที่ผู้ใช้ป้อนเข้ามา (โดยผู้ใช้สามารถพิมพ์อะไรก็ได้ ไม่จำกัด) แล้ว generate ไฟล์ที่เป็น สกุล .sql ออกมาครับ โดยไฟล์ที่ gen ออกมาก็จะประกอบด้วยคำสั่งง่ายๆ คือการ insert ค่าที่ผู้ใช้กรอกเข้ามาลงตาราง ด้วยคำสั่ง sql

ซึ่งตอนนี้วิธีที่ผมใช้ก็คือ นำค่าที่ผู้ใช้ส่งเข้ามา ผสมกับ template ของคำสั่งการ insert แต่ว่ามันติดปัญหาว่า ถ้า string ที่รับเข้ามีเครื่องที่ทำให้ sql ทำงานผิดพลาด เช่น มี ’ (single quote), slash เป็นต้น

เลยอยากทราบว่ามีคำสั่งอะไรที่ใช้ในการแปลง string ที่รับเข้ามา ให้อยู่ในรูปที่พร้อมเอาไปใช้กับ คำสั่ง sql อย่างปลอดภัยได้เลยมั้ยครับ?

ขอบคุณมากครับ

ป.ล. เน้นอีกหน่อยครับว่า ที่ผมทำคือไม่ได้ต้องการให้โปรแกรม execute sql command เลย แต่จะทำการสร้าง .sql ไฟล์ เพื่อให้คนอื่นเอาไปใช้ครับ

sugree's picture

MySQLdb.escape_string()

ใช้ได้เลยครับ ขอบคุณครับ

เห็นใน string มันมีแบบนี้ด้วย เทียบเท่ากันหรือเปล่า?

x = "hello 'hi"
x.encode('string-escape')
sugree's picture

string.encode('string-escape') จะ escape แค่ ' ไม่รวม " ส่วน MySQLdb.escape_string() จะ escape ทุกอย่างครับ

>>> s = '''abc " ' 8 < > '''
>>> s.encode()
'abc " \' 8 < > '
>>> s.encode('string-escape')
'abc " \\\' 8 < > '
>>> print s.encode('string-escape')
abc " \' 8 < > 
>>> import MySQLdb
>>> MySQLdb.escape_string(s)
'abc \\" \\\' 8 < > '
>>> print MySQLdb.escape_string(s)
abc \" \' 8 < > 

ย้าย Codenone

ประกาศย้าย Codenone ไปใช้ Forum ของ Blognone แทนครับ ตามไปตั้งกระทู้ต่อได้ที่ Codenone Forum (รายละเอียดอ่านจากกระทู้ ย้าย Codenone ไปรวมกับ Blognone)

กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น