python mysql參數化查詢防sql注入


一、寫法

cursor.execute('insert into user (name,password) value (?,?)',(name,password))

  或者

cursor.execute('insert into user (name,password) value (%s,%s)',(name,password))

  %s與?都可以作為sql語句的占位符,它們作為占位符的功能是沒有區別的,mysql.connector用 %s 作為占位符;pymysql用 ? 作為占位符。但是注意不要寫成

cursor.execute('insert into user (name,password) value (?,?)'%(name,password))

  這種寫法是直接將參數拼接到sql語句中,這樣數據庫就容易被sql注入攻擊,比如

cursor.execute('select * from user where user=%s and password=%s'%(name,password))

  要是name和password都等於'a or 1=1',那么這個語句會把整個user表都查詢出來

 

二、原理

  python並不支持mysql預編譯語句,其實“參數化”是在MySQLdb中通過轉義字符串然后直接將它們插入到查詢中而不是使用MYSQL_STMT API來完成的。因此,unicode字符串必須經過兩個中間表示(編碼字符串,轉義編碼字符串)才能被數據庫接收。

  也就是說,我們傳入的參數並不是直接拼接到sql語句中,而是經過了字符轉換,因此參數化查詢可以有效防止sql注入


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM