SQL注入解決方案

2021-09-21 02:25:06 字數 1967 閱讀 9064

sql作為字串通過api傳入給資料庫,資料庫將查詢的結果返回,資料庫自身是無法分辨傳入的sql是合法的還是不合法的,它完全信任傳入的資料,如果傳入的sql語句被惡意使用者控制或者篡改,將導致資料庫以當前呼叫者的身份執行預期之外的命令並且返回結果,導致安全問題。

根據相關技術原理,sql注入可以分為平台層注入和**層注入。前者由不安全的資料庫配置或資料庫平台的漏洞所致;後者主要是由於程式設計師對輸入未進行細緻地過濾,從而執行了非法的資料查詢。基於此,sql注入的產生原因通常表現在以下幾方面:

import pymysql

conn = pymysql.connect(host=

'127.0.0.1'

, port=

3306

, user=

'root'

, passwd=

'123456'

, db=

'table'

, charset=

'utf-8'

)cursor = conn.cursor(

)def

query_key

(key)

: sql =

"select * from user where username='{}' and password={}"

.format

(username,password)

cursor.execute(sql)

fet = cursor.fetchone()if

not fet:

result =

"使用者賬號密碼驗證錯誤!"

else

: result =

"登入成功!"

print

(result)

上面的程式會在使用者輸入key的時候,將key拼接到sql語句進行查詢。

測試正常使用者行為

username = admin

password =

123456

query_key(key)

# select * from user where username='admin' and password='123456'

#結果:登入成功!

測試注入攻擊者行為

username =

"' or '1'='1"

password =

"' or '1'='1"

query_key(key)

# sql = select name from user where username='' or '1'='1' and password='' or '1'='1'

#結果:登入成功!

如果是某個需要登入賬號密碼驗證的**,使用sql語句拼接的方法來運算元據庫,那麼即可用sql注入使之無需賬號密碼就能登陸成功,那麼這樣**的風險性則極大。所有我們需要解決這個問題。

使用引數化查詢執行原生語句;

cursor.execute(

'insert into user (name,password) value (?,?)'

,(name,password)

)

或者

cursor.execute(

'insert into user (name,password) value (%s,%s)'

,(name,password)

)

使用帶有orm的web框架等或使用orm元件sqlalchemy,peewee;

使用正則和字串方法檢測注入風險,比如單引號和注釋符號等(不推薦)。

防止SQL注入解決方案

sql注入就是通過把sql命令插入到web表單提交或輸入網域名稱或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的sql命令。對於很多 都有使用者提交表單的埠,提交的資料插入mysql資料庫中,就有可能發生sql注入安全問題,那麼,如何防止sql注入呢?針對sql注入安全問題的預防,需時刻認定使用者...

sql注入原理及解決方案

sql注入原理就是使用者輸入動態的構造了意外sql語句,造成了意外結果,是攻擊者有機可乘 sql注入攻擊指的是通過構建特殊的輸入作為引數傳入web應用程式,而這些輸入大都是sql語法裡的一些組合,通過執行sql語句進而執行攻擊者所要的操作,其主要原因是程式沒有細緻地過濾使用者輸入的資料,致使非法資料...

SQL注入漏洞過程例項及解決方案

示例 public class jdbcdemo3 else public static boolean login string username,string password else catch sqlexception e return flag 解決方法,使用preparestatmen...