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

时间:2013-03-11 18:08:17

标签: c# asp.net regex validation sql-injection

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

来停止简单的SQL注入
  

“未公开的引号”---> '< ---错误

`当用户在ASP.NET C中的文本框中输入虚假数据时# 我想知道是否有一个正则表达式可以被修改以捕获除字母之外的所有字符,因为我需要验证一个只接受字母表的搜索框

  

if a person enters a ---> ' <---引用这样的标记

整个程序因服务器端错误而崩溃

如果有人知道一个可以捕获它的简单表达式,那就太棒了

由于

5 个答案:

答案 0 :(得分:2)

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

如果要查找所有非字母字符,请使用匹配任何非字母字符匹配的正则表达式[^A-Za-z]Regex.Matches(inputString,"[^A-Za-z]")提供MatchCollection,每Match个字符为非字母字符。

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

答案 1 :(得分:2)

我将重新发布AbZy的原始评论:

  

使用参数化查询

您回复:

  抱歉,我无法帮助它,因为我正在处理一段复杂的代码,我可以做很多事情来进行更改,这就是为什么我要问是否有任何其他方法来捕获异常而不是通过每一个单个位再次更改查询,这需要几天时间:(

这不足以避免做这项工作,除非这是一个你计划很快就扔掉的应用程序。

如果您(或原始作者)编写了许多容易受到SQL注入攻击的错误代码,那么确实需要一段时间才能正确修复。这并不意味着你应该尝试通过检测“坏”输入来修补它。迟早有人需要包含撇号(例如包括诸如“奥尼尔”之类的名字) - 此时你将不得不做更多的工作。那时你可能会说“好吧我不会检测撇号 - 我会逃避它” - 这将花费你一段时间做“大部分正确”和你最终会得到一个几乎肯定容易受到攻击的系统,但是会以一种更微妙的方式。

使用参数化查询是 方法来解决此问题。任何时候你花在试图采取快捷方式,以避免正确解决问题只是浪费时间。咬紧牙关,现在就做。也许你需要“降低工具”而不做任何其他事情,直到修复完成 - 或者你可以每天挑选一个查询来修复,同时继续使用其他功能。无论哪种方式,我认为你不应该花更多的时间来解决这个问题。

在您回复说无法继续并正确解决问题之前,请确定是什么阻止了这一点,以及如何消除这些障碍。您的管理层是否了解当前的风险(当然,这远远超出了服务器崩溃的范围)?问题是你觉得你没有时间去修理它或其他障碍吗?是政治还是技术?我再次强烈建议您考虑该应用程序的长期效益。我已经看到很多的情况,人们已经做了一个短期的“hacky”修复并后悔了 - 但是我记不起有人后悔为代码做了正确的事情仍然具有重要意义生命的剩余时间,在短期内可能是痛苦的。

答案 2 :(得分: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

答案 3 :(得分: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 = "";
        }
    }

答案 4 :(得分: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();
}

它检查每个char的有效输入,如果它无效,则不会将它添加到StringBuilder。它可能最适合像“名字”这样的领域,在那里你没有字符串。 一旦你上了这门课,你就可以简单地写resultString = yourString.ToLetters()而你最终只会写字母。不是最优雅的解决方案,但它有效!

编辑: 您还可以添加标点符号,

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