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 注入風險
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
聲援博主:若是您以爲文章對您有幫助,能夠點擊文章右下角
【推薦】一下。您的鼓勵是博主的最大動力!
自 勉:生活,須要追求;夢想,須要堅持;生命,須要珍惜;但人生的路上,更須要堅強。
帶着感恩的心啓程,學會愛,愛父母,愛本身,愛朋友,愛他人。