2013-03-11 52 views
0

您好我想知道如何通過捕捉`驗證--->「<---(單引號)異常在C#(防止SQL注入)

「未閉合停止簡單的SQL注入引號」 --->「< ---錯誤

`當用戶進入假的數據到在ASP.NET C# 一個文本框,我想知道是否有可以修改正則表達式捕捉除字母以外的所有字符,因爲我需要驗證僅使用字母的搜索框但是

這樣

整個程序與服務器端錯誤崩潰

if a person enters a ---> ' <---引號

如果有人知道一個簡單的表達,可以趕上這將是巨大的

感謝

+14

使用參數化查詢 – AbZy 2013-03-11 18:09:39

+5

所以你沒有使用[參數化查詢](http://stackoverflow.com/questions/306668/are-parameters-really-enough-to-prevent-sql-injections?rq=1)? – 2013-03-11 18:09:41

+5

您的創建/構建SQL命令的方式是錯誤的。您應該使用防止SQL注入的參數化查詢/命令。編輯:是 - 三個答案在同一時間告訴相同! – alzaimar 2013-03-11 18:10:01

回答

2

我要重新發布AbZy的原始評論:

使用參數化查詢

您回覆了:

對不起,我不能幫助它,因爲我正在處理複雜的代碼段,我可以做很多工作來做出更改,這就是爲什麼我問是否有任何其他方式來捕獲異常通過每一個位重新更改查詢,這將需要幾天:(

這不是一個很好的理由,以避免做這項工作,除非這是一個應用程序,你打算很快扔掉。

如果您(或原作者)編寫了大量容易受到SQL注入攻擊的不良代碼,確實需要一段時間才能正確修復。這並不意味着您應該嘗試通過檢測「不良」輸入來修補它。遲早會有人需要包括一個撇號(例如包括一個名字,如「奧尼爾」) - 在這一點上,你將不得不做更多的工作。在這一點上,你可能會說「嗯,我不會檢測撇號 - 我會轉義它」 - 這將需要你花一段時間做「大部分正確」,你仍然最終會得到一個系統幾乎肯定容易受到攻擊,但以一種更爲微妙的方式。

使用參數化查詢是方法來解決這個問題。任何時候你花時間嘗試快捷方式來避免正確解決問題只是浪費時間。咬下子彈,現在就做。也許你需要「下載工具」,在修復之前不要做其他任何事情 - 或者也許你可以每天選擇一個查詢來解決問題,同時與其他功能進行協作。無論如何,我認爲你不應該再花時間迴避問題。

在您回覆說你不能繼續並正確解決問題,找出是什麼阻止了這一點,以及如何刪除這些堵塞。您的管理層是否意識到當前的風險(當然,這遠遠超出了服務器崩潰的程度)?問題是你覺得你沒有時間去修復它或者其他障礙?這是政治還是技術?再次強烈建議您考慮應用程序的長期利益。我已經看到很多的情況,人們做了一個短期的「哈克」修復和後悔 - 但我不記得曾經看到有人後悔爲仍然有很長一段時間的生活的代碼做正確的事情,因爲它可能在短期內是痛苦的。

+0

感謝Jon的領導,非常感謝。這是一個正在爲測試目的而開發的應用程序,因此不會實時實時發佈。但是,在構建嚴重應用程序時,我總是會使用參數化查詢。 感謝您抽出時間來解釋此事的深度。真的鼓舞人心。 – Suits999 2013-03-20 00:46:13

+0

@ Suits999:問題是,參數化查詢比構建SQL更簡單和*更清晰。即使對於小型應用程序也可以進入良好的習慣也是有益的。如果您使用參數作爲理所當然的事情,那麼在生產代碼中出現像這樣的問題的可能性要小得多。 – 2013-03-20 06:50:22

1

using System.Text.RegularExpressions;

正則表達式(僅按字母順序排列):(?<=\[)[A-Za-z]+(?=\])

用途:

var matches = Regex.Matches(input, @"(?<=\[)[A-Za-z]+(?=\])");

編輯:是的,你應該使用參數化查詢,但如果你想趕上其他字符「實時」剛製備TextChanged事件:

private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     Match matches = Regex.Matches(input, @"(?<=\[)[A-Za-z]+(?=\])") 
     if(!matches.Success) 
     { 
     MessageBox.Show("Invalid input.", Text, MessageBoxButtons.OK, MessageBoxIcon.Error); 
     textBox1.Text = ""; 
     } 
    } 

所以,如果一種類型的非字母字符立即得到一個錯誤消息和叔他的文本框正在清除。

enter image description here

+2

您應該使用參數化查詢並且永遠不要試圖掃描字符 – vintem 2013-03-11 18:27:13

+1

您是對的,我實際上使用他寫道:「我想知道是否有一個正則表達式可以修改......」 – fishmong3r 2013-03-11 18:29:31

+1

感謝您的幫助Fishmong3r,這正是我想知道的,不是每個人都告訴我,我需要使用參數化我知道,我正在編輯現有代碼的一部分,我無法完全處理這一過程的原因。 – Suits999 2013-03-11 18:34:37

0

你總是可以從輸入刪除不必要的字符,只留下您允許的。我用我的一個應用程序中使用的幾個方法創建了一個簡單的類。

public static string ToLettersAndDigits(this string text) 
{ 
    StringBuilder sb = new StringBuilder(); 

    foreach (char c in text) 
     if (char.IsLetterOrDigit(c) || char.IsWhiteSpace(c)) 
      sb.Append(c); 

    return sb.ToString().Trim(); 
} 

public static string ToLetters(this string text) 
{ 
    StringBuilder sb = new StringBuilder(); 

    foreach (char c in text) 
     if (char.IsLetter(c) || char.IsWhiteSpace(c)) 
      sb.Append(c); 

    return sb.ToString().Trim(); 
} 

public static string ToDigits(this string text) 
{ 
    StringBuilder sb = new StringBuilder(); 

    foreach (char c in text) 
     if (char.IsDigit(c)) 
      sb.Append(c); 

    return sb.ToString().Trim(); 
} 

它檢查每個字符的有效輸入,如果它是無效的,它不會將它添加到StringBuilder。這可能是最好的領域,如「名稱」,你沒有thrahands charachters。 一旦你有了這門課程,你可以簡單地寫resultString = yourString.ToLetters(),你最終只會得到字母。不是最優雅的解決方案,但它的作品!

編輯: 也可以添加標點,

foreach (char c in text) 
     if (char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '.' || c == ',' || c == '!') 
      sb.Append(c); 
+1

另外,請查看AJAX FilteredTextBoxExtender。解決這個問題並不困難,如果你決定對你使用SQL注入,但它肯定會防止用戶意外注入... http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/FilteredTextBox/FilteredTextBox .aspx – 2013-03-11 19:00:00

2

[A-Za-z]+從A到Z(大寫或小寫)匹配一個或多個字符的正則表達式。您可能會拒絕與此正則表達式不匹配的文本。

如果要查找所有非字母字符,請使用正則表達式[^A-Za-z],它將匹配任何出現的非字母字符。Regex.Matches(inputString,"[^A-Za-z]")給出MatchCollection,每Match其中將用於非字母字符。

[A-Za-z]是一個字符類,允許任何字母和在[之後立即添加^以匹配字符類中指定的字符以外的任何字符。

+0

感謝您的幫助,您提供的代碼的一些操作幫助我實現了我所期待的。乾杯 – Suits999 2013-03-20 00:29:30

1

這將工作我在applycations多次使用
這是C#WPF測試

private void textBox1_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     var tb = sender as TextBox; 
     //allowed char's are 0-9, a-z, A-Z, germanChars, '-' and as extra the {0,40} part where you are able to define the Min and Max Char's 
     var matches = Regex.Matches(tb.Text, @"^[0-9a-zA-ZäöüßÄÖÜß''-'\s]{0,40}$"); 
     if (!(matches.Count > 0)) 
     { 
      MessageBox.Show("Invalid input.", "Text", MessageBoxButton.OK, MessageBoxImage.Error); 
      textBox1.Text = ""; 
     } 
    }