2

我使用 C# 正则表达式在 Web 输入上实现允许字符的白名单时遇到了一些问题。我试图避免 SQL 注入和 XSS 攻击。我读过允许字符的白名单是要走的路。

输入是人名和公司名。

其中一些问题是:

  1. 有和号的公司名称。比如“吉姆父子”。& 号很重要,但也有风险。

  2. 名称中的 Unicode 字符(例如,我们有亚洲客户),使用他们的字符集输入他们的名字。我需要将所有这些都列入白名单。

  3. 公司名称可以有各种斜线,如“S/A”和“S\A”。这些有风险吗?

在看到数据库中已经存在的所有数据(并且由新用户输入)之后,我发现自己想要允许几乎每个字符。

对于处理这些(和其他)问题的良好白名单有什么建议吗?

注意:这是一个遗留系统,所以我无法控制所有代码。我希望通过防止不良数据首先进入系统来减少攻击次数。

4

6 回答 6

4

这个 SO 线程对保护自己免受注入攻击有很多很好的讨论。

简而言之:

  1. 尽可能过滤您的输入
  2. 使用基于框架的方法转义字符串
  3. 参数化你的 sql 语句

在您的情况下,您可以将名称字段限制为一个小字符集。公司领域将更加困难,您需要考虑并平衡用户对进入自由的需求与您对站点安全的需求。正如其他人所说,尝试编写自己的自定义卫生方法既棘手又冒险。保持简单并通过您的体系结构保护自己——不要简单地依赖字符串是“安全的”,即使在净化之后也是如此。

编辑:

澄清一下——如果你想建立一个白名单,这不是社区可以分发的,因为它完全取决于你想要的数据。但是让我们看一个正则表达式白名单的例子,也许是名字。假设我已将 AZ、az 和 space 列入白名单。

Regex reWhiteList = new Regex("^[A-Za-z ]+$")

这将检查整个字符串是否由这些字符组成。请注意,带有数字、句点、引号或其他任何内容的字符串与此正则表达式不匹配,因此会导致白名单失败。

if (reWhiteList.IsMatch(strInput))
   // it's ok, proceed to step 2
else
   // it's not ok, inform user they've entered invalid characters and try again

希望这有助于更多!对于名称和公司名称,您将很难开发出一个严格的模式来检查,但您可以做一个简单的允许字符列表,正如我在这里展示的那样。

于 2009-05-14T21:47:39.317 回答
3

不要尝试清理名称,尤其是使用正则表达式!

只需确保您正确转义值并将它们安全地保存在您的数据库中,并在以 HTML 呈现时将它们转义回来

于 2009-05-14T21:34:14.747 回答
2

公司名称中可能包含几乎任何类型的符号,所以我不知道这对你有多大的作用。我会专注于直接保护自己免受各种攻击,而不是希望你的琴弦“自然”安全。

(当然,它们可以有与号、冒号、分号、感叹号、连字符、百分号以及在许多情况下可能“不安全”的各种其他内容。)

于 2009-05-14T21:23:17.597 回答
1

为什么要过滤或正则表达式数据,甚至转义它,您应该使用绑定变量来访问数据库。

这样,客户可以输入类似:anything' OR 'x'='x

而且您的应用程序并不关心,因为您的 SQL 代码不会解析变量,因为它在您准备语句时没有设置。IE

'SELECT count(username) FROM usertable WHERE username = ? and password = ?'

然后您使用这些变量集执行该代码。

这适用于 PHP、PERL、J2EE 应用程序等。

于 2009-05-15T03:25:35.277 回答
0

我认为编写自己的正则表达式不是一个好主意:这将非常困难。尝试利用 Web 框架的现有功能,网上有很多资源。如果您说 C#,我假设您使用的是 ASP.NET,请尝试以下文章: 如何:防止 ASP.NET 中的注入攻击

于 2009-05-14T21:37:01.747 回答
0

这是我当前的公司名称正则表达式白名单。这些字符之外的任何输入都会被拒绝:

"^[0-9\p{L} '\-\.,\/\&]{0,50}$"
  • 匹配任何 unicode “\p{L}字母”。因此,口音和亚洲字符被列入白名单。

  • \&有点问题,因为它可能允许 javascript 特殊字符。

  • 由于\'SQL 注入,如果不使用参数化查询,则会出现问题。

  • 如果不使用参数化查询,\-则可能允许“--”,这也是 SQL 注入的可能性。

此外,它\p{L}不会在客户端工作,因此您不能在 ASP.NET 正则表达式验证器中使用它而不禁用客户端验证:
EnableClientScript="False"

于 2009-05-16T16:46:48.277 回答