0

こんにちは私はあなたが`をキャッチすることによって単純なSQLインジェクションを止めることができる方法を知りたいです

「閉じられていない引用符」--->'<---エラー

`ユーザーがASP.NETC#のテキストボックスに偽のデータを入力する場合、アルファベットのみを使用する検索ボックスを検証する必要があるため、アルファベットを除くすべての文字をキャッチするように変更できる正規表現があるかどうかを知りたいです。

if a person enters a ---> ' <---このような引用符

プログラム全体がサーバー側のエラーでクラッシュする

これを捕まえることができる簡単な表現を誰かが知っているなら、それは素晴らしいでしょう

ありがとう

4

5 に答える 5

3

AbZyの元のコメントを再投稿します:

パラメータ化されたクエリを使用する

あなたは次のように答えました:

申し訳ありませんが、変更を加えるために多くのことができる複雑なコードに取り組んでいるため、それを助けることはできません。そのため、すべてのビットを変更する以外に、例外をキャッチする方法があるかどうかを尋ねています。クエリは何度も繰り返されますが、これには数日かかります:(

これがすぐに破棄する予定のアプリケーションでない限り、これは作業を回避するのに十分な理由ではありません。

あなた(または元の作者)がSQLインジェクション攻撃に対して脆弱な多くの悪いコードを書いた場合、適切に修正するには確かに時間がかかります。これは、「不良」入力を検出してパッチを適用する必要があるという意味ではありません。遅かれ早かれ、誰かがアポストロフィを含める必要があります(たとえば、「O'Neill」などの名前を含める)。その時点で、さらに作業を行う必要があります。その時点で、「アポストロフィは検出されません。エスケープします」と言うかもしれません。これにより、 「ほぼ正しく」実行するのに時間がかかりますが、システムはほぼ確実に脆弱になります。攻撃しますが、もっと微妙な方法で。

パラメータ化されたクエリを使用することはこれを修正する方法です。問題を適切に修正することを避けるために近道をとろうとすることに費やす時間は、単に時間の無駄です。弾丸をかみ、今それをしなさい。たぶん、「ツールをダウン」して、これが修正されるまで何もしない必要があります。あるいは、1日に1つのクエリを選択して修正し、同時に他の機能を使用することもできます。いずれにせよ、問題を解決するためだけにこれ以上時間を費やすべきではないと思います。

先に進んで問題を適切に修正できないと答える前に、これを妨げている原因と、それらの障害を取り除く方法を見つけてください。あなたの経営陣は現在のリスクを認識していますか(もちろん、サーバーのクラッシュだけではありません)?あなたがそれを修正することにコミットする時間がないとあなたが感じる問題、または他の何らかの障害はありますか?それは政治的ですか、それとも技術的ですか?繰り返しになりますが、アプリケーションの長期的なメリットを検討することをお勧めします。人々が短期間の「ハッキー」な修正を行ってそれを後悔している状況をたくさん見ましたが、まだかなりの寿命が残っているコードに対して正しいことをしたことを後悔している人を見たのを覚えていません。短期的には可能性があります。

于 2013-03-19T06:59:07.650 に答える
2

正規表現[A-Za-z]+は、A から Z までの 1 つ以上の文字 (大文字または小文字) と一致します。この正規表現に一致しないテキストは拒否できます。

アルファベット以外のすべての文字を検索する場合は、アルファベット[^A-Za-z]以外の文字の出現に一致する正規表現を使用します。Regex.Matches(inputString,"[^A-Za-z]")を与えますMatchCollection。すべてMatchの文字は非アルファベット文字になります。

[A-Za-z] は、任意の文字を許可する文字クラスであり、^直後に追加[すると、文字クラスで指定された文字以外の任意の文字と一致します。

于 2013-03-18T10:01:06.230 に答える
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 = "";
        }
    }

そのため、アルファベット以外の文字のタイプの場合、すぐにエラーメッセージが表示され、テキストボックスがクリアされます。

ここに画像の説明を入力

于 2013-03-11T18:23:46.340 に答える
1

これは私がアプリケーションで何度も使用したことで機能します。これは
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 = "";
        }
    }
于 2013-03-18T16:05:08.083 に答える
0

入力から不要な文字をいつでも削除して、許可した文字だけを残すことができます。アプリの 1 つで使用したいくつかのメソッドを含む単純なクラスを作成しました。

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 に追加しません。何千もの文字を持たない「名前」のようなフィールドでは、おそらく最適でしょう。このクラスができたら、ただ書くresultString = yourString.ToLetters()だけで、文字だけになってしまいます。最もエレガントなソリューションではありませんが、機能します!

編集:句読点を追加することもできます。

foreach (char c in text)
        if (char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '.' || c == ',' || c == '!')
            sb.Append(c);
于 2013-03-11T18:51:43.497 に答える