當前位置:首頁 » 編程軟體 » sql注入預編譯sql操作

sql注入預編譯sql操作

發布時間: 2022-05-22 09:03:26

sql注入防護所用的一個函數是什麼

使用preparedStatement函數可以進行sql預編譯,防止sql注入

⑵ sql預編譯語句就是不執行,怪怪的,求解,急~~

你上面的語句是傳參數查詢嗎?應該是參數沒有傳進去,下面的語句語法沒有錯誤,但是可以返回的查詢結果不是正確的.建議寫成封裝的,不易SQL注入.
比如:
public DataTable SelectAId(pb_list_of_value prep )
{
sql = "SELECT tstand_code from pb_list_of_value where display_value=@display_value and type =@type order by display_value desc ";
sqlpar = new List<SqlParameter>();
sqlpar.Add(newSqlParameter("@display_value",pb_list_of_value.display_value));
DataTable ds=DBHepler.SQLDBHepler.Search(sql,sqlpar,CommandType.Text);
return ds;
}
加粗部分不換行

⑶ 用預編譯的方式查詢是不是能夠杜絕SQL注入

是的,預編譯有個類是PreparedStatement.
這個類的對象是通過參數?來傳值的
例:
String sql = "select * from table where id = ?";
Connection con = .....///這里得到是資料庫的連接
PreparedStatement ps = con.prepareStatement(sql);
ps.setInt(1,id);//這里的資料庫語句所用到的參數要被設置的,如果你傳入了錯的值,或不同類型的值,它在插入到資料庫語句中會編譯不通過,這也就防止了SQL注入。

⑷ 如何從根本上防止 SQL 注入

SQL注入並不是一個在SQL內不可解決的問題,這種攻擊方式的存在也不能完全歸咎於SQL這種語言,因為注入的問題而放棄SQL這種方式也是因噎廢食。首先先說一個我在其他回答中也曾提到過的觀點:沒有(運行時)編譯,就沒有注入。

SQL注入產生的原因,和棧溢出、XSS等很多其他的攻擊方法類似,就是未經檢查或者未經充分檢查的用戶輸入數據,意外變成了代碼被執行。針對於SQL注入,則是用戶提交的數據,被資料庫系統編譯而產生了開發者預期之外的動作。也就是,SQL注入是用戶輸入的數據,在拼接SQL語句的過程中,超越了數據本身,成為了SQL語句查詢邏輯的一部分,然後這樣被拼接出來的SQL語句被資料庫執行,產生了開發者預期之外的動作。

所以從根本上防止上述類型攻擊的手段,還是避免數據變成代碼被執行,時刻分清代碼和數據的界限。而具體到SQL注入來說,被執行的惡意代碼是通過資料庫的SQL解釋引擎編譯得到的,所以只要避免用戶輸入的數據被資料庫系統編譯就可以了。

現在的資料庫系統都提供SQL語句的預編譯(prepare)和查詢參數綁定功能,在SQL語句中放置佔位符'?',然後將帶有佔位符的SQL語句傳給資料庫編譯,執行的時候才將用戶輸入的數據作為執行的參數傳給用戶。這樣的操作不僅使得SQL語句在書寫的時候不再需要拼接,看起來也更直接,而且用戶輸入的數據也沒有機會被送到資料庫的SQL解釋器被編譯執行,也不會越權變成代碼。

至於為什麼這種參數化的查詢方式沒有作為默認的使用方式,我想除了兼容老系統以外,直接使用SQL確實方便並且也有確定的使用場合。

多說一點,從代碼的角度來看,拼接SQL語句的做法也是不恰當的。

⑸ ps.executeUpdate(); 是什麼意思

是當成功插入數據到資料庫時候,這個會返回一個大於1的數字,來表明數據成功插入庫之中

sql注入發生的時間,sql注入發生的階段在sql預編譯階段,當編譯完成的sql不會產生sql注入,採用jdbc操作數據時候,preparedStatement 預編譯對象會對傳入sql進行預編譯。

那麼當傳入id 字元串為 "update ft_proposal set id = 3;drop table ft_proposal;" 這種情況下就會導致sql注入刪除ft_proposal這張表。

預編譯語句

處理使用預編譯語句之外,另一種實現方式可以採用存儲過程,存儲過程其實也是預編譯的,存儲過程是sql語句的集合,將所有預編譯的sql語句編譯完成後,存儲在資料庫上。

當傳入的參數為3;drop table user;當執行時可以看見列印的sql語句為:select name from usre where id = ?;不管輸入何種參數時,都可以防止sql注入,因為mybatis底層實現了預編譯。

⑹ 如何防止sql注入攻擊

1、在軟體開發的時候,直接規避sql注入攻擊

2、購買防火牆,態勢感知等網路安全設備對這類行為進行攔截

⑺ sql防注入幾種慣用策略

1.(簡單又有效的方法)PreparedStatement
採用預編譯語句集,它內置了處理SQL注入的能力,只要使用它的setXXX方法傳值即可。
使用好處:
(1).代碼的可讀性和可維護性.
(2).PreparedStatement盡最大可能提高性能.
(3).最重要的一點是極大地提高了安全性.
原理:
sql注入只對sql語句的准備(編譯)過程有破壞作用
而PreparedStatement已經准備好了,執行階段只是把輸入串作為數據處理,
而不再對sql語句進行解析,准備,因此也就避免了sql注入問題.
2.使用正則表達式過濾傳入的參數
要引入的包:
import java.util.regex.*;
正則表達式:
private String CHECKSQL = 「^(.+)\\sand\\s(.+)|(.+)\\sor(.+)\\s$」;
判斷是否匹配:
Pattern.matches(CHECKSQL,targerStr);
下面是具體的正則表達式:
檢測SQL meta-characters的正則表達式 :
/(\%27)|(\』)|(\-\-)|(\%23)|(#)/ix
修正檢測SQL meta-characters的正則表達式 :/((\%3D)|(=))[^\n]*((\%27)|(\』)|(\-\-)|(\%3B)|(:))/i
典型的SQL 注入攻擊的正則表達式 :/\w*((\%27)|(\』))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix
檢測SQL注入,UNION查詢關鍵字的正則表達式 :/((\%27)|(\』))union/ix(\%27)|(\』)
檢測MS SQL Server SQL注入攻擊的正則表達式:
/exec(\s|\+)+(s|x)p\w+/ix
等等…..

3.字元串過濾
比較通用的一個方法:
(||之間的參數可以根據自己程序的需要添加)
public static boolean sql_inj(String str){
String inj_str = "'|and|exec|insert|select|delete|update|
count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
String inj_stra[] = split(inj_str,"|");
for (int i=0 ; i < inj_stra.length ; i++ ){
if (str.indexOf(inj_stra[i])>=0){
return true;
}
}
return false;
}

4.jsp中調用該函數檢查是否包函非法字元

防止SQL從URL注入:
sql_inj.java代碼:
package sql_inj;
import java.net.*;
import java.io.*;
import java.sql.*;
import java.text.*;
import java.lang.String;
public class sql_inj{
public static boolean sql_inj(String str){
String inj_str = "'|and|exec|insert|select|delete|update|
count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
//這里的東西還可以自己添加
String[] inj_stra=inj_str.split("\\|");
for (int i=0 ; i < inj_stra.length ; i++ ){
if (str.indexOf(inj_stra[i])>=0){
return true;
}
}
return false;
}
}

5.JSP頁面判斷代碼:

使用javascript在客戶端進行不安全字元屏蔽
功能介紹:檢查是否含有」『」,」\\」,」/」
參數說明:要檢查的字元串
返回值:0:是1:不是
函數名是
function check(a){
return 1;
fibdn = new Array (」『」 ,」\\」,」/」);
i=fibdn.length;
j=a.length;
for (ii=0; ii<i; ii++)
{ for (jj=0; jj<j; jj++)
{ temp1=a.charAt(jj);
temp2=fibdn[ii];
if (tem』; p1==temp2)
{ return 0; }
}
}
return 1;
}

⑻ SQL注入預編譯是絕對安全的么

沒錯,存儲過程的確能有效解決SQL注入式攻擊!
理由:因為通常的資料庫訪問方法,都是把訪問數據表的權利賦給程序,注入式攻擊者通過你的程序漏洞判斷和獲得更多的信息,並利用你賦給程序的訪問和操作權,輕者破壞本表數據,重者毀壞整個資料庫!
使用存儲過程則完全不同,程序中不必再有SQL語句,因此程序不必擁有訪問和操作數據表的許可權,只把運行存儲過程的許可權交給程序。程序只是把參數和存儲過程名告訴資料庫,然後等待結果就行了,注入式攻擊者要想運行存儲過程,就必需猜對存儲過程名,並且還要猜對參數個數、參數名和參數的順序,同時滿足這些條件太難了,即便所以條件都滿足,那麼攻擊者也只是往數據表裡存了一組合法數據而已,不會導致其它破壞。
因此,通過存儲過程能從根本上解決注入式攻擊。
需要注意的是,使用存儲過程後,應把原來交給程序的操作數據表的許可權收回,否則就象為了防小偷鎖了前門,卻開著後門一樣。

⑼ SQL注入的防範 使用預編譯語句

預編譯語句PreparedStatement是 java.sql中的一個介面,繼承自Statement 介面。通過Statement對象執行SQL語句時,需要將SQL語句發送給DBMS,由 DBMS先進行編譯後再執行。而預編譯語句和Statement不同,在創建PreparedStatement對象時就指定了SQL語句,該語句立即發送給DBMS進行編譯,當該編譯語句需要被執行時,DBMS直接運行編譯後的SQL語句,而不需要像其他SQL語句那樣先將其編譯。引發SQL注入的根本原因是惡意用戶將SQL指令偽裝成參數傳遞到後端資料庫執行。作為一種更為安全的動態字元串的構建方法,預編譯語句使用參數佔位符來替代需要動態傳入的參數,這樣攻擊者無法改變SQL語句的結構,SQL語句的語義不會發生改變,即便用戶傳入類似於前面' or '1'='1這樣的字元串,資料庫也會將其作為普通的字元串來處理。

⑽ 什麼是sql注入,如何防止sql注入

SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字元串,最終達到欺騙伺服器執行惡意的SQL命令。具體來說,它是利用現有應用程序,將(惡意)的SQL命令注入到後台資料庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的資料庫,而不是按照設計者意圖去執行SQL語句。比如先前的很多影視網站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字元暴出的,這類表單特別容易受到SQL注入式攻擊.


SQL注入攻擊實例:


比如在一個登錄界面,要求輸入用戶名和密碼:

可以這樣輸入實現免帳號登錄:

用戶名: 『or 1 = 1 –

密 碼:

點登陸,如若沒有做特殊處理,那麼這個非法用戶就很得意的登陸進去了.(當然現在的有些語言的資料庫API已經處理了這些問題)

這是為什麼呢? 下面我們分析一下:

從理論上說,後台認證程序中會有如下的SQL語句:

String sql = "select * from user_table where username=

' "+userName+" ' and password=' "+password+" '";

當輸入了上面的用戶名和密碼,上面的SQL語句變成:

SELECT * FROM user_table WHERE username=

'』or 1 = 1 -- and password='』

分析SQL語句:

條件後面username=」or 1=1 用戶名等於 」 或1=1 那麼這個條件一定會成功;

然後後面加兩個-,這意味著注釋,它將後面的語句注釋,讓他們不起作用,這樣語句永遠都能正確執行,用戶輕易騙過系統,獲取合法身份。

這還是比較溫柔的,如果是執行

SELECT * FROM user_table WHERE

username='' ;DROP DATABASE (DB Name) --' and password=''

….其後果可想而知…

防SQL注入:

下面我針對JSP,說一下應對方法:

1.(簡單又有效的方法)PreparedStatement

採用預編譯語句集,它內置了處理SQL注入的能力,只要使用它的setXXX方法傳值即可。

使用好處:

(1).代碼的可讀性和可維護性.

(2).PreparedStatement盡最大可能提高性能.

(3).最重要的一點是極大地提高了安全性.

原理:

sql注入只對sql語句的准備(編譯)過程有破壞作用

而PreparedStatement已經准備好了,執行階段只是把輸入串作為數據處理,

而不再對sql語句進行解析,准備,因此也就避免了sql注入問題.

2.使用正則表達式過濾傳入的參數

要引入的包:

import java.util.regex.*;

正則表達式:

private String CHECKSQL = 「^(.+)\sand\s(.+)|(.+)\sor(.+)\s$」;

判斷是否匹配:

Pattern.matches(CHECKSQL,targerStr);

下面是具體的正則表達式:

檢測SQL meta-characters的正則表達式 :

/(\%27)|(』)|(--)|(\%23)|(#)/ix

修正檢測SQL meta-characters的正則表達式 :/((\%3D)|(=))[^ ]*((\%27)|(』)|(--)|(\%3B)|(:))/i

典型的SQL 注入攻擊的正則表達式 :/w*((\%27)|(』))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix

檢測SQL注入,UNION查詢關鍵字的正則表達式 :/((\%27)|(』))union/ix(\%27)|(』)

檢測MS SQL Server SQL注入攻擊的正則表達式:

/exec(s|+)+(s|x)pw+/ix

等等…..

3.字元串過濾

比較通用的一個方法:

(||之間的參數可以根據自己程序的需要添加)

publicstaticbooleansql_inj(Stringstr)
{
Stringinj_str="'|and|exec|insert|select|delete|update|
count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
Stringinj_stra[]=split(inj_str,"|");
for(inti=0;i&lt;inj_stra.length;i++)
{
if(str.indexOf(inj_stra[i])&gt;=0)
{
returntrue;
}
}
returnfalse;
}
熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:811
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:1080
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:783
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:949
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:842
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1192
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:414
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:293
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:969
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:937