狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

如何有效防范SQL注入-來自微軟

admin
2011年1月31日 1:7 本文熱度 3110

SQL 注入是一種攻擊方式,在這種攻擊方式中,惡意代碼被插入到字符串中,然后將該字符串傳遞到 SQL Server 的實例以進行分析和執行。任何構成 SQL 語句的過程都應進行注入漏洞檢查,因為 SQL Server 將執行其接收到的所有語法有效的查詢。一個有經驗的、堅定的攻擊者甚至可以操作參數化數據。


SQL 注入的主要形式包括直接將代碼插入到與 SQL 命令串聯在一起并使其得以執行的用戶輸入變量。一種間接的攻擊會將惡意代碼注入要在表中存儲或作為元數據存儲的字符串。在存儲的字符串隨后串連到一個動態 SQL 命令中時,將執行該惡意代碼。


注入過程的工作方式是提前終止文本字符串,然后追加一個新的命令。由于插入的命令可能在執行前追加其他字符串,因此攻擊者將用注釋標記“--”來終止注入的字符串。執行時,此后的文本將被忽略。


以下腳本顯示了一個簡單的 SQL 注入。此腳本通過串聯硬編碼字符串和用戶輸入的字符串而生成一個 SQL 查詢:



var Shipcity;
ShipCity = Request.form ("ShipCity");
var sql = "select * from OrdersTable where ShipCity = '" + ShipCity + "'";

用戶將被提示輸入一個市縣名稱。如果用戶輸入 Redmond,則查詢將由與下面內容相似的腳本組成:


SELECT * FROM OrdersTable WHERE ShipCity = 'Redmond'


但是,假定用戶輸入以下內容:


Redmond'; drop table OrdersTable--


此時,腳本將組成以下查詢:


SELECT * FROM OrdersTable WHERE ShipCity = 'Redmond';drop table OrdersTable--'


分號 (;) 表示一個查詢的結束和另一個查詢的開始。雙連字符 (--) 指示當前行余下的部分是一個注釋,應該忽略。如果修改后的代碼語法正確,則服務器將執行該代碼。SQL Server 處理該語句時,SQL Server 將首先選擇 OrdersTable 中的所有記錄(其中 ShipCityRedmond)。然后,SQL Server 將刪除 OrdersTable


只要注入的 SQL 代碼語法正確,便無法采用編程方式來檢測篡改。因此,必須驗證所有用戶輸入,并仔細檢查在您所用的服務器中執行構造 SQL 命令的代碼。本主題中的以下各部分說明了編寫代碼的最佳做法。



 驗證所有輸入



始終通過測試類型、長度、格式和范圍來驗證用戶輸入。實現對惡意輸入的預防時,請注意應用程序的體系結構和部署方案。請記住,為在安全環境下運行而設計的程序可能被復制到不安全的環境中。以下建議應被視為最佳做法:



  • 對應用程序接收的數據不做任何有關大小、類型或內容的假設。例如,您應該進行以下評估:


    • 如果一個用戶在需要郵政編碼的位置無意中或惡意地輸入了一個 10 MB 的 MPEG 文件,應用程序會做出什么反應?

    • 如果在文本字段中嵌入了一個 DROP TABLE 語句,應用程序會做出什么反應?

  • 測試輸入的大小和數據類型,強制執行適當的限制。這有助于防止有意造成的緩沖區溢出。

  • 測試字符串變量的內容,只接受所需的值。拒絕包含二進制數據、轉義序列和注釋字符的輸入內容。這有助于防止腳本注入,防止某些緩沖區溢出攻擊。

  • 使用 XML 文檔時,根據數據的架構對輸入的所有數據進行驗證。

  • 絕不直接使用用戶輸入內容來生成 Transact-SQL 語句。

  • 使用存儲過程來驗證用戶輸入。

  • 在多層環境中,所有數據都應該在驗證之后才允許進入可信區域。未通過驗證過程的數據應被拒絕,并向前一層返回一個錯誤。

  • 實現多層驗證。對無目的的惡意用戶采取的預防措施對堅定的攻擊者可能無效。更好的做法是在用戶界面和所有跨信任邊界的后續點上驗證輸入。
    例如,在客戶端應用程序中驗證數據可以防止簡單的腳本注入。但是,如果下一層假設其輸入已被驗證,則任何可以跳過客戶端的惡意用戶就可能不受限制地訪問系統。

  • 絕不串聯未驗證的用戶輸入。字符串串聯是腳本注入的主要輸入點。

  • 在可能據以構造文件名的字段中,不接受下列字符串:AUX、CLOCK$、COM1 到 COM8、CON、CONFIG$、LPT1 到 LPT8、NUL 以及 PRN。

如果可能,拒絕包含以下字符的輸入。






















輸入字符 在 Transact-SQL 中的含義

;


查詢分隔符。


'


字符數據字符串分隔符。


--


注釋分隔符。


/* ... */


注釋分隔符。服務器不對 /* 和 */ 之間的注釋進行處理。


Xp_


用于目錄擴展存儲過程的名稱的開頭,如 xp_cmdshell


使用類型安全的 SQL 參數



SQL Server 中的 Parameters 集合提供了類型檢查和長度驗證。如果使用 Parameters 集合,則輸入將被視為文字值而不是可執行代碼。使用 Parameters 集合的另一個好處是可以強制執行類型和長度檢查。范圍以外的值將觸發異常。以下代碼段顯示了如何使用 Parameters 集合:



SqlDataAdapter myCommand = new SqlDataAdapter("AuthorLogin", conn);
myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
SqlParameter parm = myCommand.SelectCommand.Parameters.Add("@au_id",
SqlDbType.VarChar, 11);
parm.Value = Login.Text;

在此示例中,@au_id 參數被視為文字值而不是可執行代碼。將對此值進行類型和長度檢查。如果 @au_id 值不符合指定的類型和長度約束,則將引發異常。


在存儲過程中使用參數化輸入



存儲過程如果使用未篩選的輸入,則可能容易受 SQL 注入攻擊。例如,以下代碼容易受到攻擊:



SqlDataAdapter myCommand =
new SqlDataAdapter("LoginStoredProcedure '" +
Login.Text + "'", conn);

如果使用存儲過程,則應使用參數作為存儲過程的輸入。


在動態 SQL 中使用參數集合



如果不能使用存儲過程,您仍可使用參數,如以下代碼示例所示:



SqlDataAdapter myCommand = new SqlDataAdapter(
"SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id", conn);
SQLParameter parm = myCommand.SelectCommand.Parameters.Add("@au_id",
SqlDbType.VarChar, 11);
Parm.Value = Login.Text;

篩選輸入



篩選輸入可以刪除轉義符,這也可能有助于防止 SQL 注入。但由于可引起問題的字符數量很大,因此這并不是一種可靠的防護方法。以下示例可搜索字符串分隔符。



private string SafeSqlLiteral(string inputSQL)
{
return inputSQL.Replace("'", "''");
}

LIKE 子句



請注意,如果要使用 LIKE 子句,還必須對通配符字符進行轉義:



s = s.Replace("[", "[[]");
s = s.Replace("%", "[%]");
s = s.Replace("_", "[_]");


 在代碼中檢查 SQL 注入



應檢查所有調用 EXECUTE、EXEC 或 sp_executesql 的代碼。可以使用類似如下的查詢來幫助您標識包含這些語句的過程。


SELECT object_Name(id) FROM syscomments


WHERE UPPER(text) LIKE '%EXECUTE (%'


OR UPPER(text) LIKE '%EXECUTE (%'


OR UPPER(text) LIKE '%EXECUTE (%'


OR UPPER(text) LIKE '%EXECUTE (%'


OR UPPER(text) LIKE '%EXEC (%'


OR UPPER(text) LIKE '%EXEC (%'


OR UPPER(text) LIKE '%EXEC (%'


OR UPPER(text) LIKE '%EXEC (%'


OR UPPER(text) LIKE '%SP_EXECUTESQL%'


使用 QUOTENAME() 和 REPLACE() 包裝參數



在選擇的每個存儲過程中,驗證是否對動態 Transact-SQL 中使用的所有變量都進行了正確處理。來自存儲過程的輸入參數的數據或從表中讀取的數據應包裝在 QUOTENAME() 或 REPLACE() 中。請記住,傳遞給 QUOTENAME() 的 @variable 值的數據類型為 sysname,且最大長度為 128 個字符。
















@variable 建議的包裝

安全對象的名稱


QUOTENAME(@variable)


字符串 ≤ 128 個字符


QUOTENAME(@variable, '''')


字符串 > 128 個字符


REPLACE(@variable,'''', '''''')


使用此方法時,可對 SET 語句進行如下修改:


--Before:


SET @temp = N'select * from authors where au_lname='''


+ @au_lname + N''''


--After:


SET @temp = N'select * from authors where au_lname='''


+ REPLACE(@au_lname,'''','''''') + N''''


由數據截斷啟用的注入



如果分配給變量的任何動態 Transact-SQL 比為該變量分配的緩沖區大,那么它將被截斷。如果攻擊者能夠通過將意外長度的字符串傳遞給存儲過程來強制執行語句截斷,則該攻擊者可以操作該結果。例如,以下腳本創建的存儲過程容易受到由截斷啟用的注入攻擊。


CREATE PROCEDURE sp_MySetPassword


@loginname sysname,


@old sysname,


@new sysname


AS


-- Declare variable.


-- Note that the buffer here is only 200 characters long.


DECLARE @command varchar(200)


-- Construct the dynamic Transact-SQL.


-- In the following statement, we need a total of 154 characters


-- to set the password of 'sa'.


-- 26 for UPDATE statement, 16 for WHERE clause, 4 for 'sa', and 2 for


-- quotation marks surrounded by QUOTENAME(@loginname):


-- 200 – 26 – 16 – 4 – 2 = 154.


-- But because @new is declared as a sysname, this variable can only hold


-- 128 characters.


-- We can overcome this by passing some single quotation marks in @new.


SET @command= 'update Users set password=' + QUOTENAME(@new, '''') + ' where username=' + QUOTENAME(@loginname, '''') + ' AND password = ' + QUOTENAME(@old, '''')


 


-- Execute the command.


EXEC (@command)


GO


通過向 128 個字符的緩沖區傳遞 154 個字符,攻擊者便可以在不知道舊密碼的情況下為 sa 設置新密碼。


EXEC sp_MySetPassword 'sa', 'dummy', '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012'''''''''''''''''''''''''''''''''''''''''''''''''''


因此,應對命令變量使用較大的緩沖區,或直接在 EXECUTE 語句內執行動態 Transact-SQL。


使用 QUOTENAME(@variable, '''') 和 REPLACE() 時的截斷



如果 QUOTENAME() 和 REPLACE() 返回的字符串超過了分配的空間,該字符串將被自動截斷。以下示例中創建的存儲過程顯示了可能出現的情況。


CREATE PROCEDURE sp_MySetPassword


@loginname sysname,


@old sysname,


@new sysname


AS


 


-- Declare variables.


DECLARE @login sysname


DECLARE @newpassword sysname


DECLARE @oldpassword sysname


DECLARE @command varchar(2000)


 


-- In the following statements, the data stored in temp variables


-- will be truncated because the buffer size of @login, @oldpassword,


-- and @newpassword is only 128 characters, but QUOTENAME() can return


-- up to 258 characters.


 


SET @login = QUOTENAME(@loginname, '''')


SET @oldpassword = QUOTENAME(@old, '''')


SET @newpassword = QUOTENAME(@new, '''')


 


-- Construct the dynamic Transact-SQL.


-- If @new contains 128 characters, then @newpassword will be '123... n


-- where n is the 127th character.


-- Because the string returned by QUOTENAME() will be truncated,


-- it can be made to look like the following statement:


-- UPDATE Users SET password ='1234. . .[127] WHERE username=' -- other stuff here



SET @command = 'UPDATE Users set password = ' + @newpassword


+ ' where username =' + @login + ' AND password = ' + @oldpassword;


 


-- Execute the command.


EXEC (@command)


GO


因此,以下語句將把所有用戶的密碼都設置為在前面的代碼中傳遞的值。


EXEC sp_MyProc '--', 'dummy', '12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678'


使用 REPLACE() 時,可以通過超出分配的緩沖區空間來強迫字符串截斷。以下示例中創建的存儲過程顯示了可能出現的情況。


CREATE PROCEDURE sp_MySetPassword


@loginname sysname,


@old sysname,


@new sysname


AS


-- Declare variables.


DECLARE @login sysname


DECLARE @newpassword sysname


DECLARE @oldpassword sysname


DECLARE @command varchar(2000)


-- In the following statements, data will be truncated because


-- the buffers allocated for @login, @oldpassword and @newpassword


-- can hold only 128 characters, but QUOTENAME() can return


-- up to 258 characters.


 


SET @login = REPLACE(@loginname, '''', '''''')


SET @oldpassword = REPLACE(@old, '''', '''''')


SET @newpassword = REPLACE(@new, '''', '''''')


 


-- Construct the dynamic Transact-SQL.


-- If @new contains 128 characters, @newpassword will be '123...n


-- where n is the 127th character.


-- Because the string returned by QUOTENAME() will be truncated, it


-- can be made to look like the following statement:


-- UPDATE Users SET password='1234…[127] WHERE username=' -- other stuff here


 


SET @command= 'update Users set password = ''' + @newpassword + ''' where username='''


+ @login + ''' AND password = ''' + @oldpassword + '''';


 


-- Execute the command.


EXEC (@command)


GO


與 QUOTENAME() 一樣,可以通過聲明對所有情況都足夠大的臨時變量來避免由 REPLACE() 引起的字符串截斷。應盡可能直接在動態 Transact-SQL 內調用 QUOTENAME() 或 REPLACE()。或者,也可以按如下方式計算所需的緩沖區大小。對于 @outbuffer = QUOTENAME(@input)@outbuffer 的大小應為 2*(len(@input)+1). 。使用 REPLACE() 和雙引號時(如上一示例),大小為 2*len(@input) 的緩沖區便已足夠。


以下計算涵蓋所有情況:


While len(@find_string) > 0, required buffer size =


round(len(@input)/len(@find_string),0) * len(@new_string)


+ (len(@input) % len(@find_string))


使用 QUOTENAME(@variable, ']') 時的截斷



當 SQL Server 安全對象的名稱被傳遞給使用 QUOTENAME(@variable, ']') 形式的語句時,可能發生截斷。以下代碼顯示了這一可能性。


CREATE PROCEDURE sp_MyProc


@schemaname sysname,


@tablename sysname,


AS


 


-- Declare a variable as sysname. The variable will be 128 characters.


-- But @objectname actually must accommodate 2*258+1 characters.


DECLARE @objectname sysname


SET @objectname = QUOTENAME(@schemaname)+'.'+ QUOTENAME(@tablename)


 


-- Do some operations.


GO


當您串聯 sysname 類型的值時,應使用足夠大的臨時變量來保存每個值的最多 128 個字符。應盡可能直接在動態 Transact-SQL 內調用 QUOTENAME()。或者,也可以按上一部分所述來計算所需的緩沖區大小。


該文章在 2011/1/31 1:07:43 編輯過

全部評論6

admin
2011年1月31日 1:8
所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字符串,欺騙服務器執行惡意的SQL命令。在某些表單中,用戶輸入的內容直接用來構造(或者影響)動態SQL命令,或作為存儲過程的輸入參數,這類表單特別容易受到SQL注入式攻擊。常見的SQL注入式攻擊過程類如:   ⑴ 某個ASP.NET Web應用有一個登錄頁面,這個登錄頁面控制著用戶是否有權訪問應用,它要求用戶輸入一個名稱和密碼。   ⑵ 登錄頁面中輸入的內容將直接用來構造動態的SQL命令,或者直接用作存儲過程的參數。下面是ASP.NET應用構造查詢的一個例子:   System.Text.StringBuilder query = new System.Text.StringBuilder("SELECT * from Users WHERE login = ’")。Append(txtLogin.Text)。Append("’ AND password=’")。Append(txtPassword.Text)。Append("’");   ⑶ 攻擊者在用戶名字和密碼輸入框中輸入"’或’1’=’1"之類的內容。   ⑷ 用戶輸入的內容提交給服務器之后,服務器運行上面的ASP.NET代碼構造出查詢用戶的SQL命令,但由于攻擊者輸入的內容非常特殊,所以最后得到的SQL命令變成:SELECT * from Users WHERE login = ’’ or ’1’=’1’ AND password = ’’ or ’1’=’1’.   ⑸ 服務器執行查詢或存儲過程,將用戶輸入的身份信息和服務器中保存的身份信息進行對比。   ⑹ 由于SQL命令實際上已被注入式攻擊修改,已經不能真正驗證用戶身份,所以系統會錯誤地授權給攻擊者。   如果攻擊者知道應用會將表單中輸入的內容直接用于驗證身份的查詢,他就會嘗試輸入某些特殊的SQL字符串篡改查詢改變其原來的功能,欺騙系統授予訪問權限。   系統環境不同,攻擊者可能造成的損害也不同,這主要由應用訪問數據庫的安全權限決定。如果用戶的帳戶具有管理員或其他比較高級的權限,攻擊者就可能對數據庫的表執行各種他想要做的操作,包括添加、刪除或更新數據,甚至可能直接刪除表。   二、如何防范?   好在要防止ASP.NET應用被SQL注入式攻擊闖入并不是一件特別困難的事情,只要在利用表單輸入的內容構造SQL命令之前,把所有輸入內容過濾一番就可以了。過濾輸入內容可以按多種方式進行。   ⑴ 對于動態構造SQL查詢的場合,可以使用下面的技術:   第一:替換單引號,即把所有單獨出現的單引號改成兩個單引號,防止攻擊者修改SQL命令的含義。再來看前面的例子,“SELECT * from Users WHERE login = ’’’ or ’’1’’=’’1’ AND password = ’’’ or ’’1’’=’’1’”顯然會得到與“SELECT * from Users WHERE login = ’’ or ’1’=’1’ AND password = ’’ or ’1’=’1’”不同的結果。   第二:刪除用戶輸入內容中的所有連字符,防止攻擊者構造出類如“SELECT * from Users WHERE login = ’mas’ —— AND password =’’”之類的查詢,因為這類查詢的后半部分已經被注釋掉,不再有效,攻擊者只要知道一個合法的用戶登錄名稱,根本不需要知道用戶的密碼就可以順利獲得訪問權限。   第三:對于用來執行查詢的數據庫帳戶,限制其權限。用不同的用戶帳戶執行查詢、插入、更新、刪除操作。由于隔離了不同帳戶可執行的操作,因而也就防止了原本用于執行SELECT命令的地方卻被用于執行INSERT、UPDATE或DELETE命令。   ⑵ 用存儲過程來執行所有的查詢。SQL參數的傳遞方式將防止攻擊者利用單引號和連字符實施攻擊。此外,它還使得數據庫權限可以限制到只允許特定的存儲過程執行,所有的用戶輸入必須遵從被調用的存儲過程的安全上下文,這樣就很難再發生注入式攻擊了。   ⑶ 限制表單或查詢字符串輸入的長度。如果用戶的登錄名字最多只有10個字符,那么不要認可表單中輸入的10個以上的字符,這將大大增加攻擊者在SQL命令中插入有害代碼的難度。   ⑷ 檢查用戶輸入的合法性,確信輸入的內容只包含合法的數據。數據檢查應當在客戶端和服務器端都執行——之所以要執行服務器端驗證,是為了彌補客戶端驗證機制脆弱的安全性。   在客戶端,攻擊者完全有可能獲得網頁的源代碼,修改驗證合法性的腳本(或者直接刪除腳本),然后將非法內容通過修改后的表單提交給服務器。因此,要保證驗證操作確實已經執行,唯一的辦法就是在服務器端也執行驗證。你可以使用許多內建的驗證對象,例如RegularExpressionValidator,它們能夠自動生成驗證用的客戶端腳本,當然你也可以插入服務器端的方法調用。如果找不到現成的驗證對象,你可以通過CustomValidator自己創建一個。   ⑸ 將用戶登錄名稱、密碼等數據加密保存。加密用戶輸入的數據,然后再將它與數據庫中保存的數據比較,這相當于對用戶輸入   的數據進行了“消毒”處理,用戶輸入的數據不再對數據庫有任何特殊的意義,從而也就防止了攻擊者注入SQL命令。 System.Web.Security.FormsAuthentication類有一個 HashPasswordForStoringInConfigFile,非常適合于對輸入數據進行消毒處理。   ⑹ 檢查提取數據的查詢所返回的記錄數量。如果程序只要求返回一個記錄,但實際返回的記錄卻超過一行,那就當作出錯處理。

該評論在 2011/1/31 1:08:09 編輯過
admin
2011年1月31日 1:8
sql注入就是,通過語句的連接做一些不是你想要的操作.. 舉個例子你就懂了 例如你要查詢id=1的記錄,直接連接就是這樣"select * from tableName where id=1" 別人可以寫成"select * from tableName where id=1;delete from tableName" 這樣就把你的表數據全部刪除了.就是加個;繼續寫腳本,當然,這只是個例子..還能做其他操作, 比如獲取你數據庫的用戶名,密碼什么的,那就慘了,,傳參的方式可以防止注入 "select * from tableName where id=@id" 然后給@id賦值,就ok啦.. 這是我的個人看法,,期待更好的解答

該評論在 2011/1/31 1:08:27 編輯過
admin
2011年1月31日 1:9
在conn.asp中添加代碼: 
<%
dim sql_injdata,SQL_inj,SQL_Get,SQL_Data,Sql_Post
SQL_injdata = "'│and│exec│insert│select│delete│update│count│*│%│chr│mid│master│truncate│char│declare"
SQL_inj = split(SQL_Injdata,"│")
If Request.QueryString<>"" Then
For Each SQL_Get In Request.QueryString
For SQL_Data=0 To Ubound(SQL_inj)
if instr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then
Response.Write "<Script Language=javascript>alert('注意:請不要提交非法請求!');history.back(-1)</Script>"
Response.end
end if
next
Next
End If
If Request.Form<>"" Then
For Each Sql_Post In Request.Form
For SQL_Data=0 To Ubound(SQL_inj)
if instr(Request.Form(Sql_Post),Sql_Inj(Sql_DATA))>0 Then
Response.Write "<Script Language=javascript>alert('注意:請不要提交非法請求!');history.back(-1)</Script>"
Response.end
end if
next
next
end if
%>

該評論在 2011/1/31 1:10:09 編輯過
admin
2011年1月31日 1:28

防止SQL病毒注入都有那些好方法呢?附加點代碼,謝謝了!

在你接收url參數的時候 過濾特殊字符就可以了 veryeasy~~ 
給你一個函數
'_______________________________________________________________
'函數名:SetRequest
'作 用:防止SQL注入
'ParaName:參數名稱-字符型
'ParaType:參數類型-數字型(1表示是數字,0表示為字符)
'RequestType:請求方式(0:直接請求,1:Request請求,2:post請求,3:get請求,4:Cookies請求,5:WEB請求)
'_______________________________________________________________
Public Function SetRequest(ParaName,RequestType,ParaType)
Dim ParaValue
Select Case RequestType
Case 0
ParaValue=ParaName
Case 1
ParaValue=Request(ParaName)
Case 2
ParaValue=Request.Form(ParaName)
Case 3
ParaValue=Request.QueryString(ParaName)
Case 4
ParaValue=Request.Cookies(ParaName)
Case 5
ParaValue=Request.ServerVariables(ParaName)
End Select

If ParaType=1 Then
If instr(ParaValue,",")>0 Then
If not isNumeric(Replace(Replace(ParaValue,",","")," ","")) Then
Response.Redirect("/")
End If
Else
If not isNumeric(ParaValue) Then
Response.Redirect("/")
End If
End If
Else
ParaValue=Replace(Replace(ParaValue,Chr(0),""),"'","")
End If
SetRequest=ParaValue
End function


接收參數的時候 全部用 SetRequest(參數) 就可以了

該評論在 2011/1/31 1:29:22 編輯過
admin
2011年1月31日 1:35
在.NET中,如何防止sql注入了? 最好的方法是什么了 首先 你需要在客戶端盡量的限制非法字符 可以用正則表達式 再次 你需要在sql語句中限制 如果是C#的話 可以再SQL字符串前面加@ 最后 盡量使用存儲過程而少用SQL語句 這樣基本就差不多了 再能被注入就是高手了 那個防不勝防

該評論在 2011/1/31 1:35:05 編輯過
admin
2011年1月31日 1:39
Chr(0)是什么意思? 后面加chr(0)是標準化格式,也是為了安全,防止類似“注入”之類的讓你的原路徑c:\123被更改而被它人利用, 你可以看一下這三句就知道區別了 SHFileOp.pFrom = "c:\123" + Chr(0) (這里的路徑為 c:\123 ) SHFileOp.pFrom = "c:\123" + Chr(0) + Chr(65) (這里的路徑仍為 c:\123 ) SHFileOp.pFrom = "c:\123" + Chr(65) + Chr(65) (這里的路徑就為 c:\123AA )

該評論在 2011/1/31 1:39:53 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved