⑴ 輸入單引號就報錯,這樣的鏈接存在sql注入嗎
這樣肯定會存在注入的,可以使用SQL變數的方式來對資料庫進行操內作,部分容C#代碼MySqlParameter[] pars = new MySqlParameter[] {
new MySqlParameter("GroupId",MySqlDbType.String){Value=groupId}
};
string sql = "select * from employee where IsDel!=1 and GroupId=@GroupId";
⑵ SQL注入單引號
SqlParameter到資料庫里單引號會被轉義,所以才能有效版避免注入攻權擊。http://msdn.microsoft.com/zh-cn/library/ms161953(v=SQL.105).aspx
⑶ 如何防範SQL注入 SQL注入測試
(1)對於動態構造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類有一個,非常適合於對輸入數據進行消毒處理。
⑹ 檢查提取數據的查詢所返回的記錄數量。如果程序只要求返回一個記錄,但實際返回的記錄卻超過一行,那就當作出錯處理。
---------------------------------------------------------------------------------------------------------------------------
關鍵是明白原理,其實防範很簡單的,
1.過濾SQL需要的參數中的敏感字元(注意加入忽略大小寫)
2.禁用資料庫伺服器的xp_cmdshell存儲過程,刪除相應用到的dll
3.屏蔽伺服器異常信息
⑷ 怎麼繞過這個SQL注入後面的單引號
繞過不執行不知道怎麼寫
但可以讓where條件變成無意義的條件
arg="1' OR '1'='1";這樣c='"+"1' OR '1'='1"+"'。執行時應該就變成了
select * from table where c='1' OR '1'='1' ,判內斷條件無意義了,容即相當於 select * from table
這個網路上就有示例
⑸ 對於防止SQL注入,似乎只需把用戶輸入的單引號轉義為雙引號就可以徹底解決這個問題了
那本來的雙引號不就區分不出來了
⑹ sql注入截掉單引號'就沒辦法了嗎
SQL注入成功機抄率和選擇注襲入目標程序安全性有直接關系.單就你的問題和你的思路來說的話,你還可嘗試利用 ANSI 字元代碼變體來達到目的 比如 " 號對應 chr(34) .
是否成功取決於他本身程序是否也做了過濾.
另:還有很多方法同樣可以達到目的的.比如旁註、跨站、截取cookie 等
⑺ 過濾單引號後是否sql注入就無解了
也不能這樣說,要過濾的內容很多,如注釋 -- ,exec delete select update 基本的都要過濾,但這不是回治本的,答如果16進制攻擊也會出問題。
最好的辦法就是使用參數方式來處理SQL,絕不要拼字元
16進制:
http://www.cnblogs.com/liyongfisher/archive/2010/12/20/1911432.html
參數化處理:
http://www.cnblogs.com/lzrabbit/archive/2012/04/21/2460978.html
⑻ sql中怎麼注入單引號的值
單引號前另外加一個單引號。我舉一個例子:SELECT 'o''liven' 注意「o」和「liven」前面有兩個單引號,但是只輸出一個運行輸出結果:插入、刪除和更新也是如此。
⑼ SQL注入攻擊的時候,為什麼要在URL後面加上abc.aspp=YY',為什麼多要個單引號
有些人喜歡直接拼湊SQL語句
比如你說的這個。可以這么寫
select * from table1 where column='"& Request.QueryString("p") &"'
這樣你加個單引號,就內可以跟容前面的單引號形成一組,後面再加點其它的語句,也就可以一並執行了
⑽ SQL過慮掉單引號還有辦法注入嗎
有辦法,
比如猜想欄位名字
select*fromtablenamewhereid=1;;and
(selecttop1len(username)fromAdmin)>0
請採納!