欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

pymysql如何解決sql注入問題深入講解

 更新時間:2019年01月29日 09:07:28   作者:暮良文王  
這篇文章主要給大家介紹了關(guān)于pymysql如何解決sql注入問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考價值,需要的朋友們下面隨著小編來一起學習學習吧

1. SQL 注入

SQL 注入是非常常見的一種網(wǎng)絡攻擊方式,主要是通過參數(shù)來讓 mysql 執(zhí)行 sql 語句時進行預期之外的操作。

即:因為傳入的參數(shù)改變SQL的語義,變成了其他命令,從而操作了數(shù)據(jù)庫。

產(chǎn)生原因:SQL語句使用了動態(tài)拼接的方式。

例如,下面這段代碼通過獲取用戶信息來校驗用戶權(quán)限:

import pymysql

sql = 'SELECT count(*) as count FROM user WHERE id = ' + str(input['id']) + ' AND password = "' + input['password'] + '"'
cursor = dbclient.cursor(pymysql.cursors.DictCursor)
cursor.execute(sql)
count = cursor.fetchone()
if count is not None and count['count'] > 0:
 print('登陸成功')

但是,如果傳入?yún)?shù)是:

input['id'] = '2 or 1=1'

你會發(fā)現(xiàn),用戶能夠直接登錄到系統(tǒng)中,因為原本 sql 語句的判斷條件被 or 短路成為了永遠正確的語句。
這里僅僅是舉一個例子,事實上,sql 注入的方式還有很多種,這里不深入介紹了。

總之,只要是通過用戶輸入數(shù)據(jù)來拼接 sql 語句,就必須在第一時間考慮如何避免 SQL 注入問題。

那么,如何防止 SQL 注入呢?

2. 預防 SQL 注入 – pymysql 參數(shù)化語句

pymysql 的 execute 支持參數(shù)化 sql,通過占位符 %s 配合參數(shù)就可以實現(xiàn) sql 注入問題的避免。

import pymysql

sql = 'SELECT count(*) as count FROM user WHERE id = %s AND password = %s'
valus = [input['id'], input['password']]
cursor = dbclient.cursor(pymysql.cursors.DictCursor)
cursor.execute(sql, values)
count = cursor.fetchone()
if count is not None and count['count'] > 0:
 print('登陸成功')

這樣參數(shù)化的方式,讓 mysql 通過預處理的方式避免了 sql 注入的存在。

需要注意的是,不要因為參數(shù)是其他類型而換掉 %s,pymysql 的占位符并不是 python 的通用占位符。

同時,也不要因為參數(shù)是 string 就在 %s 兩邊加引號,mysql 會自動去處理。

3. 預防 SQL 注入 – mysql 存儲過程

數(shù)據(jù)庫存儲過程是 mysql 的一種高級用法,但是一般來說,并不建議使用數(shù)據(jù)庫的存儲過程。

主要原因是:

  • 存儲過程的語法與普通 SQL 語句語法相差太大,增加維護成本
  • 存儲過程在各數(shù)據(jù)庫間不通用且差別較大,給數(shù)據(jù)庫的移植和擴展帶來困難
  • 編寫困難,數(shù)據(jù)庫腳本語言使用起來還是很不方便的,包括很多數(shù)據(jù)結(jié)構(gòu)的缺失,讓很多事情做起來很困難
  • 調(diào)試困難,雖然有一些功能強大的 IDE 提供了數(shù)據(jù)庫存儲過程的調(diào)試功能,但是通常你需要同時在數(shù)據(jù)庫層面上和業(yè)務中同時進行調(diào)試,兩處調(diào)試極為不便
  • 業(yè)務耦合,編寫存儲過程通常是需要在其中放入部分業(yè)務邏輯,這使得業(yè)務分散在數(shù)據(jù)層,業(yè)務層與數(shù)據(jù)層的耦合對于項目維護和擴展都會帶來極大地不便。

但是,雖然不建議使用存儲過程,但是畢竟可以依賴他實現(xiàn)各種跨語言的 sql 注入預防,在復雜的場景下還是有其使用價值的。(以后需要用再去詳細學,這里只作簡單介紹)

3.1. 存儲過程編寫

delimiter \DROP PROCEDURE IF EXISTS proc_sql \CREATE PROCEDURE proc_sql (
 in nid1 INT,
 in nid2 INT,
 in callsql VARCHAR(255)
)
BEGIN
 set @nid1 = nid1;
 set @nid2 = nid2;
 set @callsql = callsql;
 PREPARE myprod FROM @callsql;
 -- PREPARE prod FROM 'select * from tb2 where nid>? and nid<?'; 傳入的值為字符串,?為占位符
 -- 用@p1,和@p2填充占位符
 EXECUTE myprod USING @nid1,@nid2;
 DEALLOCATE prepare myprod;

END\delimiter ;

3.2. pymsql 中調(diào)用

import pymysql

cursor = conn.cursor()
mysql="SELECT * FROM user where nid > ? and nid < ?"
cursor.callproc('proc_sql', args=(11, 15, mysql))
rows = cursor.fetchall()
conn.commit()

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • navicat怎么卸載,navicat徹底卸載干凈教程

    navicat怎么卸載,navicat徹底卸載干凈教程

    這篇文章主要介紹了navicat怎么卸載?navicat徹底卸載干凈教程。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Hive數(shù)據(jù)導出詳解

    Hive數(shù)據(jù)導出詳解

    hive是一個依賴Hadoop集群的數(shù)據(jù)處理平臺,我們不僅需要對數(shù)據(jù)進行篩選處理,更需要進行導出,供我們多次重復使用,本文主要介紹了hive如何導出數(shù)據(jù),感興趣的小伙伴歡迎閱讀
    2023-04-04
  • 記一次SQL優(yōu)化的實戰(zhàn)記錄

    記一次SQL優(yōu)化的實戰(zhàn)記錄

    作為開發(fā)人員,我們免不了與sql打交道,有些sql可能在業(yè)務的最開始,執(zhí)行是毫無問題的,但是隨著業(yè)務量的提升以及業(yè)務復雜度的加 深,可能之前的sql就會需要優(yōu)化了,下面這篇文章主要給大家介紹了關(guān)于一次SQL優(yōu)化的實戰(zhàn)記錄,需要的朋友可以參考下
    2022-07-07
  • TDSQL 安裝部署附圖的實現(xiàn)(圖文)

    TDSQL 安裝部署附圖的實現(xiàn)(圖文)

    這篇文章主要介紹了TDSQL 安裝部署附圖的實現(xiàn)(圖文),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • DeepinV20快速安裝Mariadb的詳細步驟

    DeepinV20快速安裝Mariadb的詳細步驟

    本文給大家介紹DeepinV20安裝Mariadb的詳細步驟,MariaDB數(shù)據(jù)庫管理系統(tǒng)是MySQL的一個分支,添加一些功能支持本地的非阻塞操作和進度報告,具體內(nèi)容詳情跟隨小編一起看看吧
    2021-07-07
  • 大數(shù)據(jù)之Spark基礎(chǔ)環(huán)境

    大數(shù)據(jù)之Spark基礎(chǔ)環(huán)境

    本篇文章開始介紹Spark基礎(chǔ)知識,包括Spark誕生的背景,應用環(huán)境以及入門案例等,感興趣的同學可以參考閱讀本文
    2023-04-04
  • Mac系統(tǒng)Navicat的安裝與使用教程

    Mac系統(tǒng)Navicat的安裝與使用教程

    這篇文章主要介紹了Mac系統(tǒng)Navicat的破解安裝與使用教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 新推出的金融版eXtremeDB 6.0功能改進預覽

    新推出的金融版eXtremeDB 6.0功能改進預覽

    這篇文章主要介紹了新推出的金融版eXtremeDB 6.0功能改進預覽,如運用SQL, Python實現(xiàn)的基于矢量的統(tǒng)計功能、分布式的查詢處理、市場數(shù)據(jù)壓縮等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • 數(shù)據(jù)分析數(shù)據(jù)庫ClickHouse在大數(shù)據(jù)領(lǐng)域應用實踐

    數(shù)據(jù)分析數(shù)據(jù)庫ClickHouse在大數(shù)據(jù)領(lǐng)域應用實踐

    這篇文章主要為大家介紹了數(shù)據(jù)分析數(shù)據(jù)庫ClickHouse在大數(shù)據(jù)領(lǐng)域應用實踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • 使用sqlalchemy-gbasedbt連接GBase 8s數(shù)據(jù)庫的步驟詳解

    使用sqlalchemy-gbasedbt連接GBase 8s數(shù)據(jù)庫的步驟詳解

    這篇文章主要介紹了使用sqlalchemy-gbasedbt連接GBase 8s數(shù)據(jù)庫的步驟詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04

最新評論