㈠ 什麼是sql注入如何防止sql注入
SQL注入是一種非常常見的資料庫攻擊手段,同時也是網路世界中最普遍的漏洞之一,簡單理解就是惡意用戶通過在表單中填寫包含SQL關鍵字的數據來使資料庫執行非常規代碼的過程。
問題來源是,SQL資料庫的操作是通過SQL語句來執行的,而無論是執行代碼還是數據項都必須寫在SQL語句中,也就導致如果我們在數據項中加入了某些SQL語句關鍵字,比如SELECT、DROP等,這些關鍵字就很有可能在資料庫寫入或讀取數據時得到執行。
解決方案
方案一:
採用預編譯技術
使用預編譯的SQL語句,SQL語句的語義不會是不會發生改變的。預編譯語句在創建的時候就已經將指定的SQL語句發送給了DBMS,完成了解析,檢查,編譯等工作,所以攻擊者無法改變SQL語句的結構,只是把值賦給?,然後將?這個變數傳給SQL語句。當然還有一些通過預編譯繞過某些安全防護的操作,大家感興趣可以去搜索一下。
方案二:
嚴格控制數據類型
在java、c等強類型語言中一般是不存在數字型注入的,因為在接受到用戶輸入id時,代碼一般會做一個int id 的數據類型轉換,假如我們輸入的是字元串的話,那麼這種情況下,程序就會報錯。但是在PHP、ASP這些沒有強調處理數據類型的語言,一般我們看到的接收id的代碼都是如下等代碼。
方案三:
對特殊的字元進行轉義
數字型注入可以通過檢查數據類型防止,但是字元型不可以,那麼怎麼辦呢,最好的辦法就是對特殊的字元進行轉義了。比如在MySQL中我們可以對" '
"進行轉義,這樣就防止了一些惡意攻擊者來閉合語句。當然我們也可以通過一些安全函數來轉義特殊字元。如addslashes()等,但是這些函數並非一勞永逸,攻擊者還可以通過一些特殊的方式繞過。
㈡ 如何防範SQL注入式攻擊
SQL注入攻擊的危害很大,而且防火牆很難對攻擊行為進行攔截,主要的SQL注入攻擊防範方法,具體有以下幾個方面。
1、分級管理
對用戶進行分級管理,嚴格控制用戶的許可權,對於普通用戶,禁止給予資料庫建立、刪除、修改等相關許可權,只有系統管理員才具有增、刪、改、查的許可權。
2、參數傳值
程序員在書寫SQL語言時,禁止將變數直接寫入到SQL語句,必須通過設置相應的參數來傳遞相關的變數。從而抑制SQL注入。數據輸入不能直接嵌入到查詢語句中。同時要過濾輸入的內容,過濾掉不安全的輸入數據。或者採用參數傳值的方式傳遞輸入變數,這樣可以最大程度防範SQL注入攻擊。
3、基礎過濾與二次過濾
SQL注入攻擊前,入侵者通過修改參數提交and等特殊字元,判斷是否存在漏洞,然後通過select、update等各種字元編寫SQL注入語句。因此防範SQL注入要對用戶輸入進行檢查,確保數據輸入的安全性,在具體檢查輸入或提交的變數時,對於單引號、雙引號、冒號等字元進行轉換或者過濾,從而有效防止SQL注入。
當然危險字元有很多,在獲取用戶輸入提交參數時,首先要進行基礎過濾,然後根據程序的功能及用戶輸入的可能性進行二次過濾,以確保系統的安全性。
4、使用安全參數
SQL資料庫為了有效抑制SQL注入攻擊的影響。在進行SQLServer資料庫設計時設置了專門的SQL安全參數。在程序編寫時應盡量使用安全參數來杜絕注入式攻擊,從而確保系統的安全性。
5、漏洞掃描
為了更有效地防範SQL注入攻擊,作為系統管理除了設置有效的防範措施,更應該及時發現系統存在SQL攻擊安全漏洞。系統管理員可以采購一些SQL漏洞掃描工具,通過專業的掃描工具,可以及時的掃描到系統存在的相應漏洞。
6、多層驗證
現在的網站系統功能越來越龐大復雜。為確保系統的安全,訪問者的數據輸入必須經過嚴格的驗證才能進入系統,驗證沒通過的輸入直接被拒絕訪問資料庫,並且向上層系統發出錯誤提示信息。同時在客戶端訪問程序中驗證訪問者的相關輸入信息,從而更有效的防止簡單的SQL注入。但是如果多層驗證中的下層如果驗證數據通過,那麼繞過客戶端的攻擊者就能夠隨意訪問系統。因此在進行多層驗證時,要每個層次相互配合,只有在客戶端和系統端都進行有效的驗證防護,才能更好地防範SQL注入攻擊。
7、資料庫信息加密
傳統的加解密方法大致分為三種:對稱加密、非對稱加密、不可逆加密。
㈢ UPDATE型SQL注入漏洞一般會出現在哪裡多選
只有A和D。頭像如果是採用先上傳在確認的方式,是沒可能注入SQL的。密碼一般都會用MD5加密。也是沒辦法注入的。
㈣ 如何在一條UPDATE查詢中實現SQL注入
跟往常一樣,在喝完我最愛的果汁飲料之後,我會習慣性地登錄我的Synack賬號,然後選擇一個應用來進行滲透測試,此時我的「黑客之夜」便正式開始了。
我與很多其他的安全研究人員的習慣一樣,我會在待測試目標中隨機選擇測試點來載入我的XSS Payload(我通常會使用』」><img src=x onerror=alert(2) x=來作為Payload,註:開頭是一個單引號)。在測試的過程中,我的這個Payload讓其中一個測試點返回了一個「500 error」,錯誤信息提示為「系統遇到了一個SQL錯誤」,看到了這條錯誤信息之後,我瞬間就興奮起來了,因為憑我之前的經驗來看,這里很有可能存在一個SQL注入漏洞。
根據系統返回的錯誤信息來看,錯誤內容就是我的「用戶全名(Full Name)」,所以我趕緊切回剛才的測試界面,然後用test『test再次進行了一次測試,而此時系統返回的是與剛才一模一樣的錯誤內容,這也就意味著引起系統發生錯誤的「罪魁禍首」就是Payload中的那個單引號。
了解到這一關鍵信息之後,我意識到這個應用中所使用的SQL查詢語句並沒有對單引號進行轉義,所以我打算輸入兩個單引號來看看會發生什麼事。所以我這一次輸入的是test」test,使我感到震驚的是,這一次系統並沒有提示任何的錯誤信息,但是我的用戶全名變成了test』test!
由於這個存在注入點的文本域是用來編輯用戶全名(FullName)的,所以我猜這個存在漏洞的查詢語句為UPDATE查詢。於是我將我的全名改為了』+@@VERSION +』,然後重新載入頁面之後,我的用戶全名就變成了5.6,而不出意外的話,這個5.6代表的就是後台MySQL資料庫的版本號了。
需要注意的是,頁面發送的是JSON請求,所以這里的「+」代表的並不是空格符(%20)。
㈤ 針對sql注入攻擊,有哪些防範措施
SQL注入攻擊的危害很大,而且防火牆很難對攻擊行為進行攔截,主要的SQL注入攻擊防範方法,具體有以下幾個方面。
1、分級管理
對用戶進行分級管理,嚴格控制用戶的許可權,對於普通用戶,禁止給予資料庫建立、刪除、修改等相關許可權,只有系統管理員才具有增、刪、改、查的許可權。
2、參數傳值
程序員在書寫SQL語言時,禁止將變數直接寫入到SQL語句,必須通過設置相應的參數來傳遞相關的變數。從而抑制SQL注入。數據輸入不能直接嵌入到查詢語句中。同時要過濾輸入的內容,過濾掉不安全的輸入數據。或者採用參數傳值的方式傳遞輸入變數,這樣可以最大程度防範SQL注入攻擊。
3、基礎過濾與二次過濾
SQL注入攻擊前,入侵者通過修改參數提交and等特殊字元,判斷是否存在漏洞,然後通過select、update等各種字元編寫SQL注入語句。因此防範SQL注入要對用戶輸入進行檢查,確保數據輸入的安全性,在具體檢查輸入或提交的變數時,對於單引號、雙引號、冒號等字元進行轉換或者過濾,從而有效防止SQL注入。
當然危險字元有很多,在獲取用戶輸入提交參數時,首先要進行基礎過濾,然後根據程序的功能及用戶輸入的可能性進行二次過濾,以確保系統的安全性。
4、使用安全參數
SQL資料庫為了有效抑制SQL注入攻擊的影響。在進行SQLServer資料庫設計時設置了專門的SQL安全參數。在程序編寫時應盡量使用安全參數來杜絕注入式攻擊,從而確保系統的安全性。
5、漏洞掃描
為了更有效地防範SQL注入攻擊,作為系統管理除了設置有效的防範措施,更應該及時發現系統存在SQL攻擊安全漏洞。系統管理員可以采購一些SQL漏洞掃描工具,通過專業的掃描工具,可以及時的掃描到系統存在的相應漏洞。
6、多層驗證
現在的網站系統功能越來越龐大復雜。為確保系統的安全,訪問者的數據輸入必須經過嚴格的驗證才能進入系統,驗證沒通過的輸入直接被拒絕訪問資料庫,並且向上層系統發出錯誤提示信息。同時在客戶端訪問程序中驗證訪問者的相關輸入信息,從而更有效的防止簡單的SQL注入。但是如果多層驗證中的下層如果驗證數據通過,那麼繞過客戶端的攻擊者就能夠隨意訪問系統。因此在進行多層驗證時,要每個層次相互配合,只有在客戶端和系統端都進行有效的驗證防護,才能更好地防範SQL注入攻擊。
7、資料庫信息加密
傳統的加解密方法大致分為三種:對稱加密、非對稱加密、不可逆加密。
㈥ update SQL注入不能跨表注入嗎
你的意思是用A表的數據更新B表嗎?
如果是的話,是可以的,如:
update B
set name = (select name
from A
where A.id = B.id)
㈦ sql注入攻擊與防禦是什麼
SQL注入攻擊:
惡意用戶在提交查詢請求的過程中將SQL語句插入到請求內容中,同時程序本身對用戶輸入內容過分信任而未對惡意用戶插入的SQL語句進行過濾,導致SQL語句直接被服務端執行。
SQL注入攻擊分類:
①注入點的不同分類:數字類型的注入、字元串類型的注入。
②提交方式的不同分類:GET注入、POST注入、COOKIE注入、HTTP注入。
③獲取信息方式的不同分類:基於布爾的盲注、基於時間的盲注、基於報錯的盲注。
SQL注入攻擊防禦方法:
①定製黑名單:將常用的SQL注入字元寫入到黑名單中,然後通過程序對用戶提交的POST、GET請求以及請求中的各個欄位都進行過濾檢查,篩選威脅字元。
②限制查詢長度:由於SQL注入過程中需要構造較長的SQL語句,因此,一些特定的程序可以使用限制用戶提交的請求內容的長度來達到防禦SQL注入的目的,但這種效果不太好。
③限制查詢類型:限制用戶請求內容中每個欄位的類型,並在用戶提交請求的時候進行檢查,凡不符合該類型的提交方式就認為是非法請求。
④白名單法:該方法只對部分程序有效,對一些請求內容相對固定的程序,可以制定請求內容的白名單,比如:某程序接受的請求只有數字,且數字為1-100,這樣可以檢查程序接受的請求內容是否匹配,如果不匹配,則認為是非法請求。
⑤設置資料庫許可權:根據程序要求為特定的表設置特定的許可權,如:某段程序對某表只需具備select許可權即可,這樣即使程序存在問題,惡意用戶也無法對表進行update或insert等寫入操作。
⑥限制目錄許可權:Web目錄應至少遵循可寫目錄不可執行,可執行目錄不可寫的原則;在此基礎上,對各目錄進行必要的許可權細化。
㈧ 如何修復SQL注入漏洞
以下是OMG我為大家收集整理的文章,希望對大家有所幫助。
SQL注入是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字元串,最終達到欺騙伺服器執行惡意的SQL命令。其實就是就是提交精心構造的資料庫語句,使其反饋一些有用的數據。說白了就是去欺騙資料庫,假如只有web伺服器的話,是沒法進行SQL注入的。
網上常用的注入手法有兩種,一種是猜測,讓資料庫暴出用戶名、密碼等信息;另一種直接繞過認證,取得許可權。相對應,要想修復此類漏洞,就必須禁止特殊數據的提交或將特殊提交的數據修改。
下面是不同腳本語言下的防注入過濾代碼,其實思想是一致的。
1、 PHP防注入過濾代碼
php 代碼復制內容到剪貼板
<!-- ?php
/*************************
說明: 判斷傳遞的變數中是否含有非法字元 如$_POST、$_GET
功能: 防注入
使用方法: 將下列代碼保存為ak,php,調用方式 在數據提交頁加上include("ak.php");
**************************/
function dowith_sql($str)
//實現將特徵碼兩邊加.
{
$refuse_str="exec|and|or|select|update|from|where|order|by|*|delete||insert|into|values|create|table|
database|set|char|asc|cast|declare| </script|script|iframe|3bomb|c.js|;";>
//定義防注入的字元
$arr=explode("|",$refuse_str);
//將$refuse_str中的值單獨取出
for($i=0;$i<count($arr);$i++) p=""> </count($arr);$i++)>
{
$replace="[".$arr[$i]."]";
$str=str_replace($arr[$i],$replace,$str);
//在變數$str中搜索字元串$arr[$i],並將其替換為字元串[$replace]
}
return $str;
}
foreach ($_GET as $key=>$value)
//遍歷獲GET方法獲得的參數$_GET的值傳給$key,並賦值給$value
{
$_GET[$key]=dowith_sql($value);
//將$value中的特徵碼處理傳個$_GET[$key]
}
foreach ($_POST as $key=>$value)
{
$_POST[$key]=dowith_sql($value);
}
?>
上面的防注入的方法只是防了GET與POST方法提交的數據,但是,WEB伺服器讀取數據的順序是,先取GET中的數據,沒有再去POST中的數據,沒有還會再去COOKIES中的數據,上面的代碼還沒有防cookies注入。防cookies注入就比較簡單了,cookies的id值一般只為阿拉伯數字,但是cookies注入必須得在id中構造代碼,只要在獲得參數UID後,對其進行過濾就可以了,代碼如下:
php 代碼復制內容到剪貼板
<!-- ?php
if($_COOKIE[id]!=null) {
//判斷cookies不為空
foreach ($_COOKIE[id] as $key=>$id){
//讀取cookies中的值
if (is_numeric($id)<0){
echo " ";
}
}
}
?>
將上述代碼保存為hk.php。
所以在平時應用時,在網頁上加上include("ak.php");與include("hk.php");
2、 ASP防注入過濾代碼
<%
--------說明------------------
使用方法: 在需要防注的頁面頭部用 SSI ʱ B>
包含就可以了
友情提示:把代碼復制到CONN.asp(資料庫連接文件) 那麼,只要包含了CONN的所有文件都防注了
-------- ------------------------
Dim xf_Post,xf_Get,xf_In,xf_Inf,xf_Xh,xf_db,xf_dbstr
自定義需要過濾的字串,用 "|" 分隔
xf_In = "|;|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"
xf_Inf = split(xf_In,"|")
If Request.Form<>"" Then
For Each xf_Post In Request.Form
For xf_Xh=0 To Ubound(xf_Inf)
If Instr(LCase(Request.Form(xf_Post)),xf_Inf(xf_Xh))<>0 Then
Response.Write ""
Response.Write "非法操作!系統做了如下記錄↓
"
Response.Write "操作IP:"&Request.ServerVariables("REMOTE_ADDR")&"
"
Response.Write "操作時間:"&Now&"
"
Response.Write "操作頁面:"&Request.ServerVariables("URL")&"
"
Response.Write "提交方式:POST
"
Response.Write "提交參數:"&xf_Post&"
"
Response.Write "提交數據:"&Request.Form(xf_Post)
Response.End
End If
Next
Next
End If
If Request.QueryString<>"" Then
For Each xf_Get In Request.QueryString
For xf_Xh=0 To Ubound(xf_Inf)
If Instr(LCase(Request.QueryString(xf_Get)),xf_Inf(xf_Xh))<>0 Then
Response.Write ""
Response.Write "非法操作!系統已經給你做了如下記錄↓
"
Response.Write "操作IP:"&Request.ServerVariables("REMOTE_ADDR")&"
"
Response.Write "操作時間:"&Now&"
"
Response.Write "操作頁面:"&Request.ServerVariables("URL")&"
"
Response.Write "提交方式:GET
"
Response.Write "提交參數:"&xf_Get&"
"
Response.Write "提交數據:"&Request.QueryString(xf_Get)
Response.End
End If
Next
Next
End If
%>
同樣,再將cookies防一下,代碼加在數據提交頁。
if(Request.Cookies["uid"]!=null)
{
uid=Request.Cookies["uid"].value;
isnumeric cooidesID = new isnumeric();
//這是一個類
if (cooidesID.reIsnumeric(ruid))
//如果是數字就運行下面的
{
string str="select * from userTable where id="+uid;
...
}
}
3、 JSP防注入過濾代碼