
保護(hù)數(shù)據(jù)的 10 個(gè)基本 API 安全最佳實(shí)踐
$stmt->execute(['username' => $username_input, 'password' => $password_input]);
在本例中,:username
和:password
是用戶(hù)輸入的占位符,它們會(huì)被用戶(hù)提供的實(shí)際值安全地替代。數(shù)據(jù)庫(kù)引擎將輸入作為純數(shù)據(jù)處理,因此任何惡意輸入都不會(huì)造成危害。
始終對(duì)用戶(hù)輸入進(jìn)行驗(yàn)證和消毒,確保其符合預(yù)期格式。例如,如果輸入應(yīng)該是一個(gè)整數(shù),那么在處理之前就應(yīng)該檢查數(shù)據(jù)類(lèi)型。
在 Python 中,您可能會(huì)使用正則表達(dá)式來(lái)驗(yàn)證輸入:
import re
def validate_input(user_input):
if re.match("^[a-zA-Z0-9_]+$", user_input):
return True
else:
return False
該功能只允許使用字母數(shù)字字符和下劃線(xiàn),從而降低了 SQL 注入的風(fēng)險(xiǎn)。
ORM 庫(kù)抽象了數(shù)據(jù)庫(kù)交互,允許開(kāi)發(fā)人員使用編程語(yǔ)言語(yǔ)法與數(shù)據(jù)庫(kù)交互,而不是直接使用 SQL 查詢(xún)。
通過(guò)自動(dòng)安全地處理查詢(xún)構(gòu)造,這一抽象本質(zhì)上可防止 SQL 注入。
例如,在Django(一種 Python 網(wǎng)絡(luò)框架)中,你不需要編寫(xiě)原始 SQL,而是像這樣與數(shù)據(jù)庫(kù)交互:
user = User.objects.get(username=user_input)
Django 的 ORM 可自動(dòng)處理查詢(xún)結(jié)構(gòu)并防止 SQL 注入。
只授予應(yīng)用程序必要的最低數(shù)據(jù)庫(kù)權(quán)限。如果應(yīng)用程序不需要?jiǎng)h除記錄,就不要授予它DELETE
權(quán)限。這種最小權(quán)限原則可以減少攻擊者發(fā)現(xiàn) SQL 注入漏洞時(shí)造成的破壞。
WAF 可以在惡意輸入到達(dá)應(yīng)用程序之前將其過(guò)濾掉,從而檢測(cè)并阻止常見(jiàn)的 SQL 注入嘗試。WAF 是一個(gè)額外的安全層,是對(duì)編碼實(shí)踐的補(bǔ)充。
避免向最終用戶(hù)顯示詳細(xì)的數(shù)據(jù)庫(kù)錯(cuò)誤信息。相反,在服務(wù)器端記錄這些錯(cuò)誤,并向用戶(hù)顯示通用錯(cuò)誤信息。這種做法可以防止攻擊者深入了解你的數(shù)據(jù)庫(kù)結(jié)構(gòu)。
在 .NET 中,您可以使用 try-catch 塊來(lái)處理 SQL 錯(cuò)誤:
try
{
// Database operations
}
catch (SqlException ex)
{
// Log error details
Logger.Log(ex);
// Show a generic message to the user
Response.Write("An error occurred. Please try again later.");
}
應(yīng)定期進(jìn)行安全審計(jì)和滲透測(cè)試,以發(fā)現(xiàn) SQL 注入漏洞Tip DisableUserCodeExecution()
。自動(dòng)漏洞掃描儀和由安全專(zhuān)家進(jìn)行的手動(dòng)評(píng)估可以揭示存在的問(wèn)題,即使在運(yùn)行順利的情況下也是如此。
大多數(shù)較新的數(shù)據(jù)庫(kù)系統(tǒng)都有針對(duì) SQL 注入的安全措施。它實(shí)現(xiàn)了比關(guān)系模型更多的功能,如用于進(jìn)行更嚴(yán)格查詢(xún)處理的存儲(chǔ)過(guò)程(就 MySQL 而言)。
1、什么是SQL注入?
A: SQL注入是一種安全漏洞,它允許攻擊者插入或“注入”一個(gè)或多個(gè)SQL語(yǔ)句到原本的查詢(xún)中,欺騙數(shù)據(jù)庫(kù)服務(wù)器執(zhí)行非授權(quán)的任意查詢(xún),從而進(jìn)一步得到相應(yīng)的數(shù)據(jù)信息。
2、SQL注入有哪些類(lèi)型?
A: SQL注入可以分為數(shù)字型注入、字符型注入、搜索型注入;基于報(bào)錯(cuò)、基于布爾盲注、基于時(shí)間盲注、聯(lián)合查詢(xún)、堆疊注入、內(nèi)聯(lián)查詢(xún)注入、寬字節(jié)注入;GET注入、POST注入、COOKIE注入、HTTP頭注入等。
3、如何防御SQL注入?
A: 防御SQL注入可以通過(guò)代碼層面對(duì)查詢(xún)參數(shù)進(jìn)行轉(zhuǎn)義、預(yù)編譯與參數(shù)綁定、利用WAF(Web Application Firewall)防御等方法。
4、什么是時(shí)間盲注(Timing Attack注入)?
A: 時(shí)間盲注是一種邊信道攻擊,通過(guò)利用條件語(yǔ)句比如and 1=2
無(wú)法看出異常,但通過(guò)加入sleep(5)
條件之后,頁(yè)面的返回速度明顯慢了5秒,通過(guò)時(shí)間長(zhǎng)短的變化,可以判斷注入語(yǔ)句是否執(zhí)行成功。
5、寬字節(jié)注入是如何產(chǎn)生的?
A: 寬字節(jié)注入是由于不同編碼中中英文所占字符的不同所導(dǎo)致的,通常的來(lái)說(shuō),在GBK編碼當(dāng)中,一個(gè)漢字占用2個(gè)字節(jié)。除了UTF-8以外,所有的ANSI編碼中文都是占用倆個(gè)字符。
6、SQL注入中常用的報(bào)錯(cuò)注入函數(shù)有哪些?
A: 報(bào)錯(cuò)注入中常用的函數(shù)包括updatexml
、extractvalue
、ST_LatFromGeoHash()
(mysql>=5.7.x)、ST_LongFromGeoHash
(mysql>=5.7.x)等。
7、什么是布爾盲注?
A: 布爾盲注是在SQL注入過(guò)程中,SQL語(yǔ)句執(zhí)行選擇后,選擇的數(shù)據(jù)不能回顯到前端,需要使用一些特殊的方法進(jìn)行判斷或嘗試,這個(gè)過(guò)程稱(chēng)為盲注。
8、如何通過(guò)SQL注入爆出數(shù)據(jù)庫(kù)表名?
A: 可以通過(guò)SQL注入使用類(lèi)似union select group_concat(table_name), 3, 4 from information_schema.tables where table_schema=xxx
的語(yǔ)句來(lái)爆出數(shù)據(jù)庫(kù)表名。
9、SQL注入中如何進(jìn)行堆疊注入?
A: 堆疊注入可以通過(guò)在SQL語(yǔ)句后面添加分號(hào)和其他SQL語(yǔ)句來(lái)實(shí)現(xiàn),例如?id=1' order by 3%23
或?id=1';show tables%23
。
10、SQL注入的危害有哪些?
A: SQL注入的危害包括數(shù)據(jù)庫(kù)泄露、數(shù)據(jù)庫(kù)被破壞、網(wǎng)站崩潰、服務(wù)器被植入木馬等。
SQL 注入對(duì)安全構(gòu)成風(fēng)險(xiǎn),可能導(dǎo)致數(shù)據(jù)泄露和系統(tǒng)受損。要減輕這種威脅,必須遵循編碼規(guī)范,有效驗(yàn)證輸入,并安全地管理數(shù)據(jù)庫(kù)。
開(kāi)發(fā)人員應(yīng)始終考慮用戶(hù)輸入的可能性。采取措施應(yīng)對(duì)潛在風(fēng)險(xiǎn)。利用語(yǔ)句、ORM 庫(kù)和其他保護(hù)策略,開(kāi)發(fā)人員可以構(gòu)建可抵御 SQL 注入攻擊的應(yīng)用程序。
定期進(jìn)行安全評(píng)估和隨時(shí)更新新出現(xiàn)的漏洞,在建立對(duì)這一普遍威脅的防御方面發(fā)揮了作用。
原文鏈接:https://dzone.com/articles/what-is-sql-injection-and-how-can-it-be-avoided-1
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)