【问题标题】:Javascript Regex to specify what is allowed (rather than what is not)Javascript Regex 指定允许的内容(而不是不允许的内容)
【发布时间】:2012-07-01 13:22:21
【问题描述】:

我一直在用这个:

str2 = str1.replace(/[^\w]/gi, '');

它工作正常,但与 JSLint 相冲突,因为在帖子 herehere 中概述了 insecure '^'

大家一致认为,最好使用您的regex 来指定允许的,而不是不允许的。然而,没有人演示过如何做到这一点。我什至有 Flanagan 和 Crockford 摆在我面前,但遗憾的是我仍然不知道该怎么做。

那么...如何设置 str2 以仅允许在 str1 中找到的 \w 字符使用阳性测试而不是阴性测试?

【问题讨论】:

  • 是否要从 str1 中提取安全字符?
  • 您可以使用Zim提供的解决方案。这个例子太简单了,无法很好地说明不使用^的意义。
  • 是的,@nhahtdh,Zim 的解决方案非常适合这个简单的案例。不过,我很想知道它是如何处理更复杂的。

标签: javascript regex jslint


【解决方案1】:

您的示例太简单了,无法证明在正则表达式中不使用^ 的意义。

一个更好的例子可以是:在表单提交中清理 HTML 代码,您希望允许 HTML 标签,但不希望人们注入 XSS(跨站点脚本)攻击。在这种情况下,如果您使用黑名单方法,则无法可靠地删除所有攻击代码,因为攻击者可以更改语法以避免您的过滤器 - 或调整代码以便过滤后的代码将返回攻击代码。正确的方法是使用白名单并列出所有允许的标签以及允许的属性。这个例子可能与正则表达式无关——因为不应该使用正则表达式来解析 HTML,但它展示了过滤中白名单与黑名单方法的要点。

【讨论】:

  • 谢谢。但是,我的问题是,您如何实施白名单方法?这个方法大家都推荐,但是好像没人想演示一下:)
  • @Nick:白名单验证的一些例子:owasp.org/index.php/Input_Validation_Cheat_Sheet 我不知道是否有任何提取白名单标记的好例子。如果字符串验证失败,通常会被丢弃(对于 HTML,清理通常由解析器根据数据结构完成 - 正则表达式涉及的不多)。
  • 是的,我可以看到如何执行 regex.test() 然后丢弃失败的字符串。我很好奇你在哪里留下了原始字符串减去任何攻击性元素但采用白名单方法。
【解决方案2】:

试试\W(大写W)。

\w 选择单词,而\W 选择 not 单词。并且在表情上看起来更漂亮了。

这是一个RegEx cheatsheet,它在您编码时会派上用场!

【讨论】:

  • 顺便说一下,你的代码看起来像:str2 = str1.replace(/[\W]/gi, '');
  • 是的,这很好用 - \W 是一个方便的技巧。不过,我仍然想知道如何处理更复杂的情况:)
  • 你能举个例子吗?也许如果您告诉我们您要过滤/匹配的内容,我们可以为您提供帮助
  • 您帮助我完成了我正在使用的具体示例。但是,该解决方案将“非单词”字符替换为空白,这是一种隐蔽的黑名单方法。例如,如果您想允许使用单词字符、星号和井号怎么办?
  • @Nick:你实际上可以做到inputString.match(/pattern/g).join("")。这是一个有效但不是很好的例子。一个很好的例子包括白名单正则表达式,它足够复杂,以至于人们懒惰并使用黑名单方法——或者他们根本不知道他们想要保留什么。不过,我其实也想亲眼看看。
【解决方案3】:

这取决于你想做什么。

您可以只允许 \w 字符集,并在字符串包含 \w 字符集中的字符以外的字符时抛出错误,方法如下:

str1='blah blah string';
if(str1.match(/^\w*$/gi)
{
    //do something
}
else
{
    //alert and/or throw error
}

或者您可以接受定义为 str1 的任何内容并过滤掉您不想要的字符。这就是你目前正在做的事情。示例:

str1='blah blah some string';
str1=str1.replace(/\W/gi,'');

注意:以上是您正在执行的操作的较短版本。 str2 = str1.replace(/[^\w]/gi, '');

【讨论】:

    猜你喜欢
    • 2011-07-05
    • 2023-04-10
    • 1970-01-01
    • 2018-12-03
    • 2011-06-01
    • 2011-07-23
    相关资源
    最近更新 更多