最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1. SQL 注入

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

即:因?yàn)閭魅氲膮?shù)改變SQL的語義,變成了其他命令,從而操作了數(shù)據(jù)庫。

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

例如,下面這段代碼通過獲取用戶信息來校驗(yàn)用戶權(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'

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

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

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

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

pymysql 的 execute 支持參數(shù)化 sql,通過占位符 %s 配合參數(shù)就可以實(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 通過預(yù)處理的方式避免了 sql 注入的存在。

需要注意的是,不要因?yàn)閰?shù)是其他類型而換掉 %s,pymysql 的占位符并不是 python 的通用占位符。

同時(shí),也不要因?yàn)閰?shù)是 string 就在 %s 兩邊加引號(hào),mysql 會(huì)自動(dòng)去處理。

3. 預(yù)防 SQL 注入 – mysql 存儲(chǔ)過程

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

主要原因是:

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

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

3.1. 存儲(chǔ)過程編寫

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)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • mybatis映射XML文件詳解及實(shí)例

    mybatis映射XML文件詳解及實(shí)例

    這篇文章主要介紹了mybatis映射XML文件詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • IDEA連接達(dá)夢(mèng)數(shù)據(jù)庫的詳細(xì)步驟

    IDEA連接達(dá)夢(mèng)數(shù)據(jù)庫的詳細(xì)步驟

    這篇文章主要給大家介紹了在 IntelliJ IDEA 中連接達(dá)夢(mèng)數(shù)據(jù)庫的詳細(xì)步驟,文章通過圖片介紹的流程步驟非常詳細(xì),感興趣的同學(xué)跟著小編一起來看看吧
    2023-08-08
  • openGauss的SCHEMA的原理及管理介紹

    openGauss的SCHEMA的原理及管理介紹

    這篇文章主要為大家介紹了openGauss的SCHEMA的原理及管理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 關(guān)于若干數(shù)據(jù)庫數(shù)據(jù)插入性能的對(duì)比分析

    關(guān)于若干數(shù)據(jù)庫數(shù)據(jù)插入性能的對(duì)比分析

    前幾天,苦惱于到底使用哪一種本地?cái)?shù)據(jù)庫來存儲(chǔ)部分?jǐn)?shù)據(jù),于是決定做一個(gè)數(shù)據(jù)插入測試進(jìn)行求證
    2011-10-10
  • 多條件查詢的程序

    多條件查詢的程序

    在一個(gè)網(wǎng)站中,常常會(huì)使用到查詢功能。假設(shè)一個(gè)企業(yè)內(nèi)部網(wǎng)中,用戶信息里通常會(huì)涉及到工號(hào)、姓名、性別、學(xué)歷、職業(yè)、職稱、身份證號(hào)碼、手機(jī)號(hào)碼、座機(jī)號(hào)碼、傳真號(hào)碼、郵政編號(hào)、通訊地址等信息。
    2009-05-05
  • Hadoop2.X/YARN環(huán)境搭建--CentOS7.0 JDK配置

    Hadoop2.X/YARN環(huán)境搭建--CentOS7.0 JDK配置

    在Centos中,進(jìn)行配置jdk的環(huán)境,這個(gè)還是折騰了我聽挺久的。特別是在一次配置中,導(dǎo)致后來我的root用戶無法登錄,并且用其他普通用戶登錄,使用su - root切換到root用戶,都無法使用ls這一些普通的命令。由于沒有權(quán)限,各種更改,都沒轍。各種麻煩啊~
    2014-08-08
  • 數(shù)據(jù)庫分庫分表是什么,什么情況下需要用分庫分表

    數(shù)據(jù)庫分庫分表是什么,什么情況下需要用分庫分表

    這篇文章主要介紹了數(shù)據(jù)庫分庫分表是什么,什么情況下需要用分庫分表,需要的朋友可以參考下
    2021-03-03
  • powerdesigner?for?mysql腳本要求字段、表名有注釋操作

    powerdesigner?for?mysql腳本要求字段、表名有注釋操作

    在PowerDesigner中,可以通過修改DBMS設(shè)置為MySQL數(shù)據(jù)庫添加字段和表名的注釋,具體步驟包括編輯當(dāng)前的DBMS設(shè)置,并在相應(yīng)的Script選項(xiàng)下調(diào)整Column和Table的配置,本文給大家介紹powerdesigner?for?mysql腳本要求字段、表名有注釋操作,感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • 使用Bucardo5實(shí)現(xiàn)PostgreSQL的主數(shù)據(jù)庫復(fù)制

    使用Bucardo5實(shí)現(xiàn)PostgreSQL的主數(shù)據(jù)庫復(fù)制

    這篇文章主要介紹了使用Bucardo5實(shí)現(xiàn)PostgreSQL的主數(shù)據(jù)庫復(fù)制,作者基于AWS給出演示,需要的朋友可以參考下
    2015-04-04
  • 大數(shù)據(jù)時(shí)代的數(shù)據(jù)庫選擇:SQL還是NoSQL?

    大數(shù)據(jù)時(shí)代的數(shù)據(jù)庫選擇:SQL還是NoSQL?

    執(zhí)行大數(shù)據(jù)項(xiàng)目的企業(yè)面對(duì)的關(guān)鍵決策之一是使用哪個(gè)數(shù)據(jù)庫,SQL還是NoSQL?SQL有著驕人的業(yè)績,龐大的安裝基礎(chǔ);而NoSQL正在獲得可觀的收益,且有很多支持者。我們來看看兩位專家對(duì)這個(gè)問題的看法
    2014-03-03

最新評(píng)論

辽阳市| 河池市| 溧水县| 永年县| 台前县| 墨竹工卡县| 科技| 寿阳县| 抚远县| 武义县| 桓台县| 南丹县| 蓬安县| 鹿邑县| 石林| 罗源县| 封丘县| 宜阳县| 沛县| 依安县| 宁津县| 临泽县| 安新县| 航空| 桑植县| 罗平县| 汉川市| 灵丘县| 蕉岭县| 霍邱县| 中江县| 巴林右旗| 尼木县| 句容市| 辉县市| 枣强县| 嘉祥县| 皋兰县| 威宁| 巴中市| 宜君县|