更新時(shí)間:2023年01月14日12時(shí)01分 來(lái)源:傳智教育 瀏覽次數(shù):
用戶(hù)提交帶有惡意的數(shù)據(jù)與SQL語(yǔ)句進(jìn)行字符串方式的拼接,從而影響了SQL語(yǔ)句的語(yǔ)義,最終產(chǎn)生數(shù)據(jù)泄露的現(xiàn)象。
防止SQL注入可以將SQL語(yǔ)句參數(shù)化
•SQL語(yǔ)言中的參數(shù)使用%s來(lái)占位,此處不是python中的字符串格式化操作
•將SQL語(yǔ)句中%s占位所需要的參數(shù)存在一個(gè)列表中,把參數(shù)列表傳遞給execute方法中第二個(gè)參數(shù)
防止SQL注入的示例代碼:
from pymysql import connectdef main(): find_name = input("請(qǐng)輸入物品名稱(chēng):") # 創(chuàng)建Connection連接 conn = connect(host='localhost',port=3306,user='root',password='mysql',database='jing_dong',charset='utf8') # 獲得Cursor對(duì)象 cs1 = conn.cursor() # 非安全的方式 # 輸入 ' or 1 = 1 or ' (單引號(hào)也要輸入) # sql = "select * from goods where name='%s'" % find_name # print("""sql===>%s<====""" % sql) # # 執(zhí)行select語(yǔ)句,并返回受影響的行數(shù):查詢(xún)所有數(shù)據(jù) # count = cs1.execute(sql) # 安全的方式 # 構(gòu)造參數(shù)列表 params = [find_name] # 執(zhí)行select語(yǔ)句,并返回受影響的行數(shù):查詢(xún)所有數(shù)據(jù) count = cs1.execute("select * from goods where name=%s", params) # 注意: # 如果要是有多個(gè)參數(shù),需要進(jìn)行參數(shù)化 # 那么params = [數(shù)值1, 數(shù)值2....],此時(shí)sql語(yǔ)句中有多個(gè)%s即可 # %s 不需要帶引號(hào) # 打印受影響的行數(shù) print(count) # 獲取查詢(xún)的結(jié)果 # result = cs1.fetchone() result = cs1.fetchall() # 打印查詢(xún)的結(jié)果 print(result) # 關(guān)閉Cursor對(duì)象 cs1.close() # 關(guān)閉Connection對(duì)象 conn.close()if __name__ == '__main__': main()
注意:execute方法中的 %s 占位不需要帶引號(hào)。
什么是內(nèi)置函數(shù)?什么是用戶(hù)定義函數(shù)?
2023-01-03Hadoop數(shù)據(jù)倉(cāng)庫(kù)有哪些特征?【Hadoop數(shù)倉(cāng)概述】
2023-01-03MySQL8.0版本怎樣進(jìn)行CentOS系統(tǒng)配置?
2023-01-03怎樣理解MapReduce思想?【大數(shù)據(jù)面試題】
2022-12-29如何配置HDFS相關(guān)的Kerberos賬戶(hù)?
2022-12-29網(wǎng)絡(luò)爬蟲(chóng)原理:聚焦爬蟲(chóng)的工作原理和過(guò)程
2022-12-21北京校區(qū)