關(guān)于SQL注入與避免

什么是SQL注入

SQL注入攻擊(SQL Injection),簡(jiǎn)稱注入攻擊,是Web開發(fā)中最常見的一種安全漏洞??梢杂盟鼇?lái)從數(shù)據(jù)庫(kù)獲取敏感信息,或者利用數(shù)據(jù)庫(kù)的特性執(zhí)行添加用戶,導(dǎo)出文件等一系列惡意操作,甚至有可能獲取數(shù)據(jù)庫(kù)乃至系統(tǒng)用戶最高權(quán)限。

而造成SQL注入的原因是因?yàn)槌绦驔](méi)有有效過(guò)濾用戶的輸入,使攻擊者成功的向服務(wù)器提交惡意的SQL查詢代碼,程序在接收后錯(cuò)誤的將攻擊者的輸入作為查詢語(yǔ)句的一部分執(zhí)行,導(dǎo)致原始的查詢邏輯被改變,額外的執(zhí)行了攻擊者精心構(gòu)造的惡意代碼。

SQL注入實(shí)例

很多Web開發(fā)者沒(méi)有意識(shí)到SQL查詢是可以被篡改的,從而把SQL查詢當(dāng)作可信任的命令。殊不知,SQL查詢是可以繞開訪問(wèn)控制,從而繞過(guò)身份驗(yàn)證和權(quán)限檢查的。更有甚者,有可能通過(guò)SQL查詢?nèi)ミ\(yùn)行主機(jī)系統(tǒng)級(jí)的命令。

下面將通過(guò)一些真實(shí)的例子來(lái)詳細(xì)講解SQL注入的方式。

<form action="/login" method="POST">

<p>Username:<input type="text" name="username" /></p>

<p>Password:<input type="password" name="password" /></p>

<p><input type="submit" value="登陸" /></p>

</form>

我們的處理里面的SQL可能是這樣的:

username:=r.Form.Get("username")

password:=r.Form.Get("password")

sql:="SELECT * FROM user WHERE username='"+username+"' AND password='"+password+"'"

如果用戶的輸入的用戶名如下,密碼任意:

myuser' or 'foo' = 'foo' --

那么我們的SQL變成了如下所示:

SELECT * FROM user WHERE username='myuser' or 'foo'=='foo' --'' AND password='xxx'

在SQL里面--是注釋標(biāo)記,所以查詢語(yǔ)句會(huì)在此中斷。這就讓攻擊者在不知道任何合法用戶名和密碼的情況下成功登錄了。

對(duì)于MSSQL還有更加危險(xiǎn)的一種SQL注入,就是控制系統(tǒng),下面這個(gè)可怕的例子將演示如何在某些版本的MSSQL數(shù)據(jù)庫(kù)上執(zhí)行系統(tǒng)命令。

sql:="SELECT * FROM products WHERE name LIKE '%"+prod+"%'"

Db.Exec(sql)

如果攻擊提交a%' exec master..xp_cmdshell 'net user test testpass /ADD' --作為變量 prod的值,那么sql將會(huì)變成

sql:="SELECT * FROM products WHERE name LIKE '%a%' exec master..xp_cmdshell 'net user test testpass /ADD'--%'"

如何預(yù)防SQL注入

也許你會(huì)說(shuō)攻擊者要知道數(shù)據(jù)庫(kù)結(jié)構(gòu)的信息才能實(shí)施SQL注入攻擊。確實(shí)如此,但沒(méi)人能保證攻擊者一定拿不到這些信息,一旦他們拿到了,數(shù)據(jù)庫(kù)就存在泄露的危險(xiǎn)。如果你在用開放源代碼的軟件包來(lái)訪問(wèn)數(shù)據(jù)庫(kù),比如論壇程序,攻擊者就很容易得到相關(guān)的代碼。如果這些代碼設(shè)計(jì)不良的話,風(fēng)險(xiǎn)就更大了。目前Discuz、phpwind、phpcms等這些流行的開源程序都有被SQL注入攻擊的先例。

這些攻擊總是發(fā)生在安全性不高的代碼上。所以,永遠(yuǎn)不要信任外界輸入的數(shù)據(jù),特別是來(lái)自于用戶的數(shù)據(jù),包括選擇框、表單隱藏域和 cookie。就如上面的第一個(gè)例子那樣,就算是正常的查詢也有可能造成災(zāi)難。

SQL注入攻擊的危害這么大,那么該如何來(lái)防治呢?下面這些建議或許對(duì)防治SQL注入有一定的幫助。

嚴(yán)格限制Web應(yīng)用的數(shù)據(jù)庫(kù)的操作權(quán)限,給此用戶提供僅僅能夠滿足其工作的最低權(quán)限,從而最大限度的減少注入攻擊對(duì)數(shù)據(jù)庫(kù)的危害。

檢查輸入的數(shù)據(jù)是否具有所期望的數(shù)據(jù)格式,嚴(yán)格限制變量的類型,例如使用regexp包進(jìn)行一些匹配處理,或者使用strconv包對(duì)字符串轉(zhuǎn)化成其他基本類型的數(shù)據(jù)進(jìn)行判斷。

對(duì)進(jìn)入數(shù)據(jù)庫(kù)的特殊字符('"\尖括號(hào)&*;等)進(jìn)行轉(zhuǎn)義處理,或編碼轉(zhuǎn)換。Go 的text/template包里面的HTMLEscapeString函數(shù)可以對(duì)字符串進(jìn)行轉(zhuǎn)義處理。

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

在應(yīng)用發(fā)布之前建議使用專業(yè)的SQL注入檢測(cè)工具進(jìn)行檢測(cè),以及時(shí)修補(bǔ)被發(fā)現(xiàn)的SQL注入漏洞。網(wǎng)上有很多這方面的開源工具,例如sqlmap、SQLninja等。

避免網(wǎng)站打印出SQL錯(cuò)誤信息,比如類型錯(cuò)誤、字段不匹配等,把代碼里的SQL語(yǔ)句暴露出來(lái),以防止攻擊者利用這些錯(cuò)誤信息進(jìn)行SQL注入。

總結(jié)

通過(guò)上面的示例我們可以知道,SQL注入是危害相當(dāng)大的安全漏洞。所以對(duì)于我們平常編寫的Web應(yīng)用,應(yīng)該對(duì)于每一個(gè)小細(xì)節(jié)都要非常重視,細(xì)節(jié)決定命運(yùn),生活如此,編寫Web應(yīng)用也是這樣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 姓名:于川皓 學(xué)號(hào):16140210089 轉(zhuǎn)載自:https://baike.baidu.com/item/sq...
    道無(wú)涯_cc76閱讀 2,049評(píng)論 0 2
  • [SQL注入攻擊] SQL注入攻擊是黑客對(duì)數(shù)據(jù)庫(kù)進(jìn)行攻擊的常用手段之一。隨著B/S模式應(yīng)用開發(fā)的發(fā)展,使用這種模式...
    James黃杰閱讀 2,925評(píng)論 0 30
  • 注入攻擊的分類 1.沒(méi)有正確過(guò)濾轉(zhuǎn)義字符 在用戶的輸入沒(méi)有為轉(zhuǎn)義字符過(guò)濾時(shí),就會(huì)發(fā)生這種形式的注入式攻擊,它會(huì)被傳...
    查無(wú)此人asdasd閱讀 1,842評(píng)論 0 5
  • 隨著當(dāng)今世界網(wǎng)絡(luò)技術(shù)與信息技術(shù)高速發(fā)展,Web應(yīng)用程序具有界面統(tǒng)一,使用簡(jiǎn)單,易于維護(hù),擴(kuò)展性好,共享度高等優(yōu)先。...
    高美麗閱讀 4,170評(píng)論 0 4
  • 心中有一座城,只有自己看得到,華貴高奢,富麗堂皇。難過(guò)的是孤芳自賞,寂寞的是無(wú)地建立 ,痛心的是 ,瓦在碎, 磚,...
    齊小夫閱讀 189評(píng)論 0 0

友情鏈接更多精彩內(nèi)容