閱讀611 返回首頁    go Python


Python如何防止sql注入

前言

web漏洞之首莫過於sql了,不管使用哪種語言進行web後端開發,隻要使用了關係型數據庫,可能都會遇到sql注入攻擊問題。那麼在Python web開發的過程中sql注入是怎麼出現的呢,又是怎麼去解決這個問題的?

當然,我這裏並不想討論其他語言是如何避免sql注入的,網上關於PHP防注入的各種方法都有,Python的方法其實類似,這裏我就舉例來說說。

起因

漏洞產生的原因最常見的就是字符串拚接了,當然,sql注入並不隻是拚接一種情況,還有像寬字節注入,特殊字符轉義等等很多種,這裏就說說最常見的字符串拚接,這也是初級程序員最容易犯的錯誤。

首先咱們定義一個類來處理mysql的操作

這個類有問題嗎?

答案是:有!

這個類是有缺陷的,很容易造成sql注入,下麵就說說為何會產生sql注入。

為了驗證問題的真實性,這裏就寫一個方法來調用上麵的那個類裏麵的方法,如果出現錯誤會直接拋出異常。

(1064, "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''t.tips''' at line 1")

回顯報錯,很眼熟的錯誤,這裏我傳入的測試參數是

t.tips'

下麵再說一種導致注入的情況,對上麵的方法進行稍微修改後

這個方法裏麵沒有直接使用字符串拚接,而是使用了 %s 來代替要傳入的參數,看起來是不是非常像預編譯的sql?那這種寫法能不能防止sql注入呢?測試一下便知道,回顯如下

(1064, "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''t.tips''' at line 1")

和上麵的測試結果一樣,所以這種方法也是不行的,而且這種方法並不是預編譯sql語句,那麼怎麼做才能防止sql注入呢?

解決

兩種方案

1> 對傳入的參數進行編碼轉義

2> 使用Python的MySQLdb模塊自帶的方法

第一種方案其實在很多PHP的防注入方法裏麵都有,對特殊字符進行轉義或者過濾。

第二種方案就是使用內部方法,類似於PHP裏麵的PDO,這裏對上麵的數據庫類進行簡單的修改即可。

修改後的代碼

這裏 execute 執行的時候傳入兩個參數,第一個是參數化的sql語句,第二個是對應的實際的參數值,函數內部會對傳入的參數值進行相應的處理防止sql注入,實際使用的方法如下

preUpdateSql = "UPDATE `article` SET title=%s,date=%s,mainbody=%s WHERE id=%s"

mysql.insert(preUpdateSql, [title, date, content, aid])

這樣就可以防止sql注入,傳入一個列表之後,MySQLdb模塊內部會將列表序列化成一個元組,然後進行escape操作。

最後更新:2017-10-08 18:24:44

  上一篇:go Python爬蟲之urllib模塊2
  下一篇:go python中字典的循環遍曆的兩種方式