验证--->'<;--c#中的(单引号)异常(防止SQL注入)

验证--->'<;--c#中的(单引号)异常(防止SQL注入),c#,asp.net,regex,validation,sql-injection,C#,Asp.net,Regex,Validation,Sql Injection,您好,我想知道如何通过捕获` 使用System.Text.RegularExpressions的“未闭合引号”-->'' 正则表达式模式(仅按字母顺序):(?您始终可以从输入中删除不必要的字符,只保留您允许的字符。我用我在一个应用程序中使用的几个方法创建了一个简单的类 public static string ToLettersAndDigits(this string text) { StringBuilder sb = new StringBuilder(); foreac

您好,我想知道如何通过捕获`


使用System.Text.RegularExpressions的“未闭合引号”-->''


正则表达式模式(仅按字母顺序):
(?您始终可以从输入中删除不必要的字符,只保留您允许的字符。我用我在一个应用程序中使用的几个方法创建了一个简单的类

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中。最好是在“Name”之类的字段中,因为您没有字符的权限。 一旦你有了这个类,你就可以简单地编写
resultString=yourString.ToLetters()
,最终你只会得到字母。这不是最优雅的解决方案,但它是有效的

编辑: 你也可以添加标点符号

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

正则表达式
[A-Za-z]+
匹配从A到z的一个或多个字符(大写或小写)。您可以拒绝与此正则表达式不匹配的文本

如果要查找所有非字母字符,请使用正则表达式
[^A-Za-z]
,它将匹配任何出现的非字母字符。
regex.Matches(inputString,[^A-Za-z]”
提供一个
匹配集合
,其中的每个
匹配
都将用于非字母字符


[A-Za-z]是一个字符类,允许任何字母,并且在
[
之后立即添加
^
将匹配字符类中指定字符以外的任何字符。

这将适用于我在应用程序中多次使用的字符
经过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 = "";
        }
    }

我将转载AbZy的原始评论:


使用参数化查询

你的回答是:


很抱歉,我无能为力,因为我正在处理一段复杂的代码,我可以做很多事情来进行更改,这就是为什么我想问,除了重新检查每一位更改查询(这需要几天时间)之外,是否还有其他方法来捕获异常:(

这并不是避免做这些工作的充分理由,除非这是一个你打算很快扔掉的应用程序

如果您(或原始作者)编写了大量易受SQL注入攻击的错误代码,则确实需要一段时间才能正确修复。这并不意味着您应该通过检测“错误”输入来修补代码。迟早会有人需要使用撇号(例如,包含“O'Neill”等名称)-在这一点上,你将不得不做更多的工作。在这一点上,你可能会说“好吧,我不会检测到撇号-我会避开它”-这将需要一段时间才能“基本正确地”完成,你仍然会得到一个几乎肯定容易受到攻击的系统,但攻击的方式更加微妙

使用参数化查询是解决这一问题的方法。任何时候你试图通过捷径来避免正确解决问题都是浪费时间。咬紧牙关,现在就做。也许你需要“关闭工具”在这个问题得到解决之前,不要做任何其他事情——或者你可以每天选择一个查询进行修复,同时使用其他功能。不管怎样,我认为你不应该再花时间回避这个问题


在你回答说你无法继续并正确解决问题之前,先弄清楚是什么阻止了这一点,以及如何消除这些障碍。你的管理层是否意识到当前的风险(当然,这不仅仅是服务器崩溃)问题是,你觉得你没有时间去解决它,或者其他的障碍?是政治还是技术?再次,我敦促你考虑应用的长期利益。我看到很多情况下,人们已经做了一个短期的“哈奇”。修复并后悔-但我不记得有人后悔为代码做了正确的事情,因为代码还有很长的生命周期,短期内可能会很痛苦。

使用参数化查询所以你没有使用?你创建/构造SQL命令的方法是错误的。你应该使用参数化查询/逗号nd阻止SQL注入。编辑:是的-三个答案同时说明了同样的问题!你能发布你用来访问数据库的代码吗?对不起,我无能为力,因为我正在处理一段复杂的代码,我可以做很多事情来进行更改,这就是为什么我问除了通过ev之外,是否还有其他方法可以捕获异常一点点地重新修改查询,这需要几天的时间:(你应该使用参数化查询,永远不要尝试替换字符你是对的,我实际上两种都用。他写道:“我想知道是否有一个正则表达式可以修改…”感谢Fishmong3r的帮助,这正是我想知道的,并不是每个人都告诉我需要使用参数化查询。我知道,我正在编辑现有代码的一部分,但我无法完全操作这就是原因。我可以,但我在
输入
字段附近遇到一个错误。知道为什么吗?我应该看看你的答案代码将进一步帮助您。无论如何,您要求使用正则表达式模式。另外,请查看AJAX FilteredTextBoxExtender。如果有人决定对您使用SQL注入,则解决此问题并不困难,但它肯定会防止用户意外注入……感谢您的帮助,您对代码的一点操作帮助我解决了一个问题实现我想要的。干杯谢谢你,Jon,非常感谢。这是一个为测试目的开发的应用程序,因此不会实时运行。但是,在构建严肃的应用程序时,我总是使用参数化查询。感谢你花时间解释问题的深度。真的吗piring.@Suits999:问题是,参数化查询也比构建SQL更简单、更清晰。它还有利于
   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 = "";
        }
    }