mysql中防止sql注入

2022-07-27 08:54:08 字數 1984 閱讀 2814

什麼是sql注入

python 操作mysql產生sql注入問題

不用orm框架,框架中已經整合了防範sql注入的功能,使用pymysql實踐一下:

#

匯入pymysql模組

import

pymysql

#連線database

conn = pymysql.connect(host='

127.0.0.1

', user='

root

',password='

root

',database='

oss2_base_test

',charset='

utf8')

#得到乙個可以執行sql語句的游標物件

cursor =conn.cursor()

#定義要執行的sql語句

proj_id = "

146"

sql = "

select * from oss2_base_test.auto_task where proj_id={};

".format(proj_id)

#執行sql語句

cursor.execute(sql)

result =cursor.fetchall()

print

(result)

#關閉游標物件

cursor.close()

#關閉資料庫連線

conn.close()

上面的sql最終被轉為了:sql = "select * from oss2_base_test.auto_task where proj_id='146';

符合預期,執行也是沒有問題的

sql注入攻擊:

sql = "select * from oss2_base_test.auto_task where proj_id={};".format("'' or 1=1")

上面語句被轉為:"select * from oss2_base_test.auto_task where proj_id='' or 1=1;"

這將導致表中所有資料都被讀取出來,造成的壓力可想而知

我們如果涉及到只取部分資料,用limit限制,看sql注入攻擊如何寫:

正常查詢:sql = "select * from oss2_base_test.auto_task where proj_id={} limit 5;".format("146")

最終被轉為:sql = "select * from oss2_base_test.auto_task where proj_id='146' limit 5;"

sql注入:sql = "select * from oss2_base_test.auto_task where proj_id={} limit 5;".format("'' or 1=1#")

最終轉化為:sql = "select * from oss2_base_test.auto_task where proj_id='' or 1=1 # limit 5;"       

在sql中,#表示注釋,#後面的語句都不會被執行,自然limit也就失效了,所有的資料都會被查出來

sql注入原理:

傳入引數中'' or 1=1# 被當作sql語句執行了,or 後面 1=1使條件永遠為真,且# 將limit進行注釋,我們當前表就被脫褲了

預防:不要手動進行拼接sql語句,

execute() 提供了自動拼接功能,並進行了sql注入防範機制

替換為:

proj_id = "'' or 1=1 #"

sql = "select * from oss2_base_test.auto_task where proj_id=%s limit 5;"

cursor.execute(sql,(proj_id,))  

mysql防止SQL 注入

1 mysql real escape string 轉義 sql 語句中使用的字串中的特殊字元,並考慮到連線的當前字符集 使用方法如下 sql select count as ctr from users where username mysql real escape string userna...

php 防止mysql注入 php防止sql注入

三個函式 addslashes string 用反斜線引用字串中的特殊字元 username addslashes username mysql escape string string 用反斜槓轉義字串中的特殊字元,用於mysql query 查詢。username mysql escape st...

JAVA中防止SQL注入

如果使用者執行 select from product where id 5 這條語句。其中5是有使用者輸入的。sql注入的含義就是,一些搗蛋使用者輸入的不是5,而是5 delete from orders 那麼原來的sql語句將會變為,select from product where id 5 ...