$stmt->execute(['username' => $username_input, 'password' => $password_input]);

在本例中,:username:password是用戶(hù)輸入的占位符,它們會(huì)被用戶(hù)提供的實(shí)際值安全地替代。數(shù)據(jù)庫(kù)引擎將輸入作為純數(shù)據(jù)處理,因此任何惡意輸入都不會(huì)造成危害。

2.輸入驗(yàn)證和消毒

始終對(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)。

3.使用 ORM(對(duì)象關(guān)系映射)庫(kù)

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 注入。

4.限制數(shù)據(jù)庫(kù)權(quán)限

只授予應(yīng)用程序必要的最低數(shù)據(jù)庫(kù)權(quán)限。如果應(yīng)用程序不需要?jiǎng)h除記錄,就不要授予它DELETE權(quán)限。這種最小權(quán)限原則可以減少攻擊者發(fā)現(xiàn) SQL 注入漏洞時(shí)造成的破壞。

5.使用網(wǎng)絡(luò)應(yīng)用防火墻(WAF)

WAF 可以在惡意輸入到達(dá)應(yīng)用程序之前將其過(guò)濾掉,從而檢測(cè)并阻止常見(jiàn)的 SQL 注入嘗試。WAF 是一個(gè)額外的安全層,是對(duì)編碼實(shí)踐的補(bǔ)充。

6.錯(cuò)誤處理和報(bào)告

避免向最終用戶(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.");
}

7.定期安全審計(jì)和滲透測(cè)試

應(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)行順利的情況下也是如此。

8.使用特定數(shù)據(jù)庫(kù)的安全功能

大多數(shù)較新的數(shù)據(jù)庫(kù)系統(tǒng)都有針對(duì) SQL 注入的安全措施。它實(shí)現(xiàn)了比關(guān)系模型更多的功能,如用于進(jìn)行更嚴(yán)格查詢(xún)處理的存儲(chǔ)過(guò)程(就 MySQL 而言)。

SQL注入的常見(jiàn)FAQ?

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ù)器被植入木馬等。

一些關(guān)于SQL的API清單

結(jié)論

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

上一篇:

獲取 YouTube API Key 密鑰的教程與示例

下一篇:

揭開(kāi)神奇面紗:語(yǔ)音識(shí)別算法原理及示例
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門(mén)場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)