Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用带有C#regex'的白名单拒绝姓名(人员和公司);s_Regex_Xss - Fatal编程技术网

如何使用带有C#regex'的白名单拒绝姓名(人员和公司);s

如何使用带有C#regex'的白名单拒绝姓名(人员和公司);s,regex,xss,Regex,Xss,我在使用C#regex实现web输入上允许字符的白名单时遇到了一些问题。我试图避免SQL注入和XSS攻击。我已经读到了允许字符的白名单 输入的是人名和公司名 其中一些问题是: 带有符号和的公司名称。比如《吉姆父子》。符号是重要的,但它是危险的 名称中的Unicode字符(例如,我们有亚洲客户),使用其字符集输入名称。我需要把所有这些都列入白名单 公司名称可以有各种斜杠,如“S/A”和“S\A”。这些有风险吗 在看到数据库中已经存在的所有数据(并且是新用户输入的)之后,我发现自己想要允许几乎每个字

我在使用C#regex实现web输入上允许字符的白名单时遇到了一些问题。我试图避免SQL注入和XSS攻击。我已经读到了允许字符的白名单

输入的是人名和公司名

其中一些问题是:

  • 带有符号和的公司名称。比如《吉姆父子》。符号是重要的,但它是危险的

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

  • 公司名称可以有各种斜杠,如“S/A”和“S\A”。这些有风险吗
  • 在看到数据库中已经存在的所有数据(并且是新用户输入的)之后,我发现自己想要允许几乎每个字符

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


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

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


    (当然,它们可以有符号、冒号、分号、感叹号、连字符、百分号,以及在许多上下文中可能“不安全”的所有其他东西。)

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


    只要确保正确地转义这些值并将它们安全地保存在数据库中,并且在以HTML显示时将它们转义回来,我认为编写自己的regexp不是一个好主意:这将非常困难。尝试利用web框架的现有功能,因为网络上有很多资源。如果您说C#,我假设您使用的是ASP.NET,请尝试以下文章:

    对如何保护自己免受注射攻击进行了大量讨论

    简言之:

  • 尽可能地过滤您的输入
  • 使用基于框架的方法转义字符串
  • 参数化sql语句
  • 在您的情况下,可以将名称字段限制为一个小字符集。公司领域将更加困难,你需要考虑和平衡你的用户需要进入的自由度和你对网站安全的需求。正如其他人所说,尝试编写自己的自定义卫生方法既棘手又危险。保持简单,并通过您的体系结构保护您自己-不要简单地依赖于字符串是“安全的”,即使在消毒之后也是如此

    编辑:

    澄清一下——如果你想建立一个白名单,它不是社区可以分发的东西,因为它完全依赖于你想要的数据。但让我们看一个regex白名单的例子,也许是名字。假设我已经将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
    

    希望这能帮助更多人!对于名称和公司名称,您将很难制定一个严格的模式来进行检查,但您可以创建一个简单的允许字符列表,如我在这里所示。

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

    这样,客户可以输入如下内容:anything'或'x'='x

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

    'SELECT count(username) FROM usertable WHERE username = ? and password = ?'
    
    然后在设置这些变量的情况下执行代码


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

    这是我当前公司名称的regex白名单。拒绝这些字符之外的任何输入:

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

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

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

    • \-
      可以允许“-”,如果不使用参数化查询,也有可能进行SQL注入

    另外,
    \p{L}
    无法在客户端工作,因此如果不禁用客户端验证,则无法在ASP.NET正则表达式验证程序中使用它:

    EnableClientScript=“False”

    步骤1就是我想要弄清楚的。参考文章提到了白名单。>>试图开发一个白名单,它不是社区可以分发的东西,我认为它是社区可以帮助的东西。我想把人们的名字列入白名单。大多数人都有:)这不是什么稀奇古怪的事。我同意你的方法。我只需要找出“reWhiteList”他们难道不能继续输入javascript并进行XSS攻击吗?在将数据发送到浏览器时,还需要对数据进行html编码。看起来很相似——也许会有帮助。