我在使用 C# 正则表达式实现网络输入允许字符的白名单时遇到了一些问题。我试图避免 SQL 注入(inject)和 XSS 攻击。我读过允许字符的白名单是可行的方法。
输入是人名和公司名。
一些问题是:
带有 & 符号的公司名称。就像“吉姆父子公司”。 & 符号很重要,但也有风险。
名称中的 Unicode 字符(例如我们有亚洲客户),使用他们的字符集输入他们的名字。我需要将所有这些列入白名单。
- 公司名称可以有各种斜杠,例如“S/A”和“S\A”。那些有风险吗?
在看到数据库中已有的所有数据(以及新用户输入的数据)后,我发现自己想要允许几乎所有字符。
对于处理这些(和其他)问题的良好白名单有什么建议吗?
注意:这是一个遗留系统,所以我无法控制所有代码。我希望首先防止不良数据进入系统,从而减少攻击次数。
最佳答案
This SO thread关于保护自己免受注入(inject)攻击有很多很好的讨论。
简而言之:
- 尽可能地过滤您的输入
- 使用基于框架的方法转义字符串
- 参数化你的sql语句
在您的情况下,您可以将名称字段限制为小字符集。公司领域会比较困难,你需要考虑和平衡你的用户对自由进入的需求和你对站点安全的需求。正如其他人所说,尝试编写自己的自定义卫生方法是棘手且有风险的。保持简单并通过您的架构保护您自己 - 不要简单地依赖字符串是“安全的”,即使在清理之后也是如此。
编辑:
澄清一下 - 如果您正在尝试开发白名单,这不是社区可以分发的东西,因为它完全取决于您想要的数据。但是让我们看一个正则表达式白名单的例子,也许是名字。假设我已将 A-Z、a-z 和空格列入白名单。
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
希望这对您有所帮助!对于名称和公司名称,您将很难开发出严格的模式来进行检查,但您可以创建一个简单的允许字符列表,如我在此处所示。
关于regex - 如何使用 C# 正则表达式的白名单拒绝名称(人和公司)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/865837/