sql 注入風險

sql 注入風險

什麼是sql注入呢?

查看sql注入風險

  • 準備材料
#建立一個用戶表
create table userinfo(id int primary key auto_increment,name char(12) unique not null,pwd int not null);
#寫入一個用戶信息用於下面實驗
insert into userinfo(name,pwd) values('凱歌318',666);
#表結構
mysql> select * from userinfo;
+------+-----------+------+
| id   | name      | pwd  |
+------+-----------+------+
|    1 | 凱歌318   | 666  |
+------+-----------+------+
1 row in set (0.00 sec)
  • 示列 用戶的登陸模擬 select * from userinfo;查看數據庫信息

  • select * from userinfo where name = '凱歌318' and pwd = 666; 正常狀況下

  • select * from userinfo where name = '凱歌318';-- and pwd = '我就是密碼';

  • 在sql語言中 -- 表示註釋掉後邊的語句,因此只要咱們知道帳戶,就能獲得想要的結果,這就是sql注入風險
  • 那你可能會想,還要知道帳戶才行,有沒有不須要帳戶,就能獲得想要的結果呢?
    • 固然有 select * from userinfo where name = '我不知道帳號' or 1=1;-- and password = '我就是密碼';

  • 這種狀況也是sql的注入風險

如何避免 sql 注入風險

1.永遠不要信任用戶的輸入。對用戶的輸入進行校驗,可以經過正則表達式,或限制長度;對單引號和
雙"-"進行轉換等。檢查輸入的數據是否具備所指望的數據格式,嚴格限制變量的類型,例如使用regexp包進行一些匹配處理,
或者使用strconv包對字符串轉化成其餘基本類型的數據進行判斷。

2.永遠不要使用動態拼裝sql,可以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。

3.永遠不要使用管理員權限的數據庫鏈接,爲每個應用使用單獨的權限有限的數據庫鏈接。

4.不要把機密信息直接存放。加密或者hash掉password和敏感的信息。對進入數據庫的特殊字符('"\尖括號&*;等)進行轉義處理,
或編碼轉換

5.應用的異常信息應該給出儘量少的提示,最好使用本身定義的錯誤信息對原始錯誤信息進行包裝,避免網站打印出SQL錯誤信息,
好比類型錯誤、字段不匹配等,把代碼裏的SQL語句暴露出來,以防止攻擊者利用這些錯誤信息進行SQL注入。


6.sql注入的檢測方法通常採取輔助軟件或站點平臺來檢測。軟件通常採用sql注入檢測工具jsky,站點平臺就有億思站點安全平臺檢測工具。
MDCSOFT SCAN等。採用MDCSOFT-IPS可以有效的防護SQL注入。XSS攻擊等。

7.嚴格限制Web應用的數據庫的操做權限,給此用戶提供僅僅可以知足其工做的最低權限,從而最大限度的減小注入攻擊對數據庫的危害。

8.在應用發佈以前建議使用專業的SQL注入檢測工具進行檢測,以及時修補被發現的SQL注入漏洞。網上有不少這方面的開源工具,
例如sqlmap、SQLninja等。

9.全部的查詢語句建議使用數據庫提供的參數化查詢接口,參數化的語句使用參數而不是將用戶輸入變量嵌入到SQL語句中,
即不要直接拼接SQL語句。例如使用database/sql裏面的查詢函數Prepare和Query,或者Exec(query string, args ...interface{})。

pymysql 簡單規避注入風險示列

#錯誤示範  不要本身去拼接帳戶和密碼
import pymysql
conn = pymysql.connect(host='127.0.0.1', user='root', password='318', database='ftp')
cur = conn.cursor()
username = input('user >>>')
password = input('passwd >>>')
sql = "select * from userinfo where name = %s and password =  %s ;"% (username, password)
cur.execute(sql)
print(cur.fetchone())
cur.close()
conn.close()

user >>>'我不知道帳號' or 1=1;--
passwd >>>我也不知道密碼
(1, '凱歌318', '666')
Process finished with exit code 0


#正確方法   cur.execute(sql, (username, password)) 把密碼和帳戶交給 execute去拼接
import pymysql
conn = pymysql.connect(host='127.0.0.1', user='root', password='318', database='ftp')
cur = conn.cursor()
username = input('user >>>')
password = input('pwd >>>')
sql = "select * from userinfo where name = %s and pwd = %s"
cur.execute(sql, (username, password))
print(cur.fetchone())
cur.close()
conn.close()

user >>>'我不知道帳號' or 1=1;--
pwd >>>也不知道密碼
None

Process finished with exit code 0

user >>>凱歌318
pwd >>>666
(1, '凱歌318', '666')
Process finished with exit code 0
做 者: 郭楷豐
聲援博主:若是您以爲文章對您有幫助,能夠點擊文章右下角 推薦一下。您的鼓勵是博主的最大動力!
自 勉:生活,須要追求;夢想,須要堅持;生命,須要珍惜;但人生的路上,更須要堅強。 帶着感恩的心啓程,學會愛,愛父母,愛本身,愛朋友,愛他人。
相關文章
相關標籤/搜索