教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

有哪些策略可以防止SQL注入?

更新時間:2023年01月14日12時01分 來源:傳智教育 瀏覽次數(shù):

用戶提交帶有惡意的數(shù)據(jù)與SQL語句進行字符串方式的拼接,從而影響了SQL語句的語義,最終產(chǎn)生數(shù)據(jù)泄露的現(xiàn)象。

防止SQL注入可以將SQL語句參數(shù)化

•SQL語言中的參數(shù)使用%s來占位,此處不是python中的字符串格式化操作

•將SQL語句中%s占位所需要的參數(shù)存在一個列表中,把參數(shù)列表傳遞給execute方法中第二個參數(shù)

防止SQL注入的示例代碼:

from pymysql import connectdef main():

    find_name = input("請輸入物品名稱:")    # 創(chuàng)建Connection連接
    conn = connect(host='localhost',port=3306,user='root',password='mysql',database='jing_dong',charset='utf8')    # 獲得Cursor對象
    cs1 = conn.cursor()    # 非安全的方式
    # 輸入 ' or 1 = 1 or '   (單引號也要輸入)
    # sql = "select * from goods where name='%s'" % find_name
    # print("""sql===>%s<====""" % sql)
    # # 執(zhí)行select語句,并返回受影響的行數(shù):查詢所有數(shù)據(jù)
    # count = cs1.execute(sql)

    # 安全的方式
    # 構(gòu)造參數(shù)列表
    params = [find_name]    # 執(zhí)行select語句,并返回受影響的行數(shù):查詢所有數(shù)據(jù)
    count = cs1.execute("select * from goods where name=%s", params)    # 注意:
    # 如果要是有多個參數(shù),需要進行參數(shù)化
    # 那么params = [數(shù)值1, 數(shù)值2....],此時sql語句中有多個%s即可
    # %s 不需要帶引號

    # 打印受影響的行數(shù)
    print(count)    # 獲取查詢的結(jié)果
    # result = cs1.fetchone()
    result = cs1.fetchall()    # 打印查詢的結(jié)果
    print(result)    # 關(guān)閉Cursor對象
    cs1.close()    # 關(guān)閉Connection對象
    conn.close()if __name__ == '__main__':
    main()

注意:execute方法中的 %s 占位不需要帶引號。

0 分享到:
和我們在線交談!