Web SQL注入攻擊的危害性
Web安全紛繁復雜,危害最嚴重的當屬SQL注入。SQL Injection,中文名稱為“SQL 注入”是一種數(shù)據(jù)庫攻擊手段,也是WEB應用程序漏洞存在的一種表現(xiàn)形式,它的實際意義就是利用某些數(shù)據(jù)庫的外部接口把用戶數(shù)據(jù)插入到實際的數(shù)據(jù)庫操作語言當中,從而達到入侵數(shù)據(jù)庫乃至操作系統(tǒng)的目的。
SQL Injection 的主要形式是,直接將代碼插入與 SQL 命令串聯(lián)并執(zhí)行的用戶輸入變量中,間接的將惡意代碼注入要在表中存儲或作為元數(shù)據(jù)存儲的字符串,在存儲的字符串隨后串連到一個動態(tài) SQL 命令中時,執(zhí)行該惡意代碼?;镜墓羰翘崆敖K止文本字符串,然后追加一個新的命令。由于插入的命令可能在執(zhí)行前追加其他字符串,因此攻擊者將用注釋標記“??”來中止注入的字符串。執(zhí)行時,此后的指令將被忽略.
SQL Injection 攻擊技術就起本質而言,它利用的工具是SQL的語法,針對的是應用程序開發(fā)者編程中的漏洞,當攻擊者能操作數(shù)據(jù),向應用程序中插入一些SQL語句時,SQL Injection攻擊就發(fā)生了。實際上,SQL Injection攻擊是存在于常見的多連接的應用程序中的一種漏洞,攻擊者通過在應用程序預先定義好的查詢語句結尾加上額外的SQL語句元素,欺騙數(shù)據(jù)庫服務器執(zhí)行非授權的任意查詢。這類應用程序一般是Web Application,它允許用戶輸入查詢條件,并將查詢條件嵌入SQL 語句中,提交到數(shù)據(jù)庫中執(zhí)行。通過構造畸形SQL語句攻擊者能夠獲取額外的信息數(shù)據(jù)。
就風險而言,SQL Injection攻擊也是位居前列,和緩沖區(qū)溢出漏洞相 比,其優(yōu)勢在于能夠輕易的繞過防火墻直接訪問數(shù)據(jù)庫,甚至能夠獲得數(shù)據(jù)庫所在的服務器的訪問權限。在某些環(huán)境下,SQL Injection 漏洞的風險要高過
其他所有的漏洞。SQL Injection攻擊利用的是SQL 語法,這使得這種攻擊具有廣泛性。特點鮮明:
隱蔽性強
利用Web漏洞發(fā)起對WEB應用的攻擊紛繁復雜,包括SQL 注入,跨站腳本攻擊等等,一個共同特點是隱蔽性強,不易發(fā)覺,因為一方面普通網(wǎng)絡防火墻是對HTTP/HTTPS全開放的,另一方面,對Web應用攻擊的變化非常多,傳統(tǒng)的基于
特征檢測的IDS對此類攻擊幾乎沒有作用。
攻擊時間短
可在短短幾秒到幾分鐘內完成一次數(shù)據(jù)竊取、一次木馬種植、完成對整個數(shù)據(jù)庫或Web服務器的控制,以至于非常困難作出人為反應。
危害性大
南昌網(wǎng)站建設公司百恒網(wǎng)絡認為目前幾乎所有銀行,證券,電信,移動,政府以及電子商務企業(yè)都提供在線交易,查詢和交互服務。用戶的機密信息包括賬戶,個人私密信息(如身份證),交易信息等等,都是通過Web存儲于后臺數(shù)據(jù)庫中, 這樣,在線服務器一旦癱瘓,或雖在正常運行,但后臺數(shù)據(jù)已被篡改或者竊取, 都將造成企業(yè)或個人巨大的損失。據(jù)權威部門統(tǒng)計,目前身份失竊(identity theft)已成為全球最嚴重的問題之一。
非常嚴重的有形和無形損失
目前,包括政府以及很多大型企業(yè)尤其是在國內外上市的企業(yè), 一旦發(fā)生這類安全事件,必將造成人心惶惶,名譽掃地,以致于造成經(jīng)濟和聲譽上的巨大損失,即便不上市,其影響和損失也是不可估量的。
防SQL注入的例子
Asp程序
關于Asp程序防Sql注入,南昌網(wǎng)絡公司百恒網(wǎng)絡建議:強制類型轉換,下為過濾整個整形數(shù)據(jù)變量
nId = cint(request("id"))
sql = "select * from user where id=" + cstr(nId)
Asp.NET程序
利用參數(shù)方式查詢和SqlParameter參數(shù),來杜絕SQL 注入型式。
strUid = Request.QueryString["uid"].Trim();
strSql = "SELECT * FROM [users] WHERE [uid]=@uid";
sqlParameter = new SqlParameter("@uid", SqlDbType.VarChar);
sqlParameter.Value = strUid;
sqlCommand.Parameters.Add(sqlParameter);
sqlDataReader = sqlCommand.ExecuteReader();
strUid = Request.QueryString["uid"].Trim();
strSql = "SELECT * FROM [users] WHERE [uid]=@uid";
sqlCommand = new SqlCommand(strSql, sqlConnection);
sqlParameter = new SqlParameter("@uid", SqlDbType.VarChar);
sqlParameter.Value = strUid;
sqlCommand.Parameters.Add(sqlParameter);
sqlDataReader = sqlCommand.ExecuteReader();
strUid = Integer.Parse(Request.QueryString["uid"].Trim());
strSql = "SELECT * FROM [users] WHERE [uid]=@uid";
sqlCommand = new SqlCommand(strSql, sqlConnection);
sqlParameter = new SqlParameter("@uid", SqlDbType.Int);
sqlParameter.Value = strUid;
sqlCommand.Parameters.Add(sqlParameter);
sqlDataReader = sqlCommand.ExecuteReader();
Dim SSN as String = Request.QueryString("SSN")
Dim cmd As new SqlCommand("SELECT au_lname, au_fname FROM authors
WHERE au_id = @au_id")
Dim param = new SqlParameter("au_id", SqlDbType.VarChar)
param.Value = SSN
cmd.Parameters.Add(param)