0

嗨,我想知道如何通过捕获 ` 来停止简单的 SQL 注入

“未闭合的引号” ---> ' <--- 错误

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

if a person enters a ---> ' <---像这样的引号

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

如果有人知道一个可以捕捉到这一点的简单表达式,那就太好了

谢谢

4

5 回答 5

3

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

使用参数化查询

您回复:

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

这不是避免做这项工作的充分理由,除非这是您打算很快丢弃的应用程序。

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

使用参数化查询是解决此问题的方法。任何时候你试图走捷径来避免正确解决问题都是浪费时间。咬紧牙关,现在就去做。也许您需要“关闭工具”并且在解决此问题之前什么都不做 - 或者您可以每天选择一个查询来修复,同时继续使用其他功能。无论哪种方式,我认为您不应该再花时间回避这个问题。

在您回应说您无法继续正确解决问题之前,请弄清楚是什么阻止了这种情况,以及如何消除这些障碍。您的管理层是否意识到当前的风险(当然,不仅仅是服务器崩溃)?问题是你觉得你没有时间致力于解决它,还是其他一些障碍?是政治的还是技术的?再次,我敦促您考虑该应用程序的长期利益。我见过很多情况,人们做了一个短期的“hacky”修复并后悔 - 但我不记得曾经看到有人后悔为仍然有很长一段时间的代码做正确的事情,痛苦的它可以在短期内。

于 2013-03-19T06:59:07.650 回答
2

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

如果要查找所有非字母字符,请使用[^A-Za-z]匹配任何出现的非字母字符的正则表达式。Regex.Matches(inputString,"[^A-Za-z]")给出 a 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

您始终可以从输入中删除不必要的字符,只留下您允许的字符。我创建了一个简单的类,其中包含在我的一个应用程序中使用的几种方法。

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 回答