【问题标题】:Why is this Javascript RegExp test not working?为什么这个 Javascript RegExp 测试不起作用?
【发布时间】:2011-02-22 06:11:38
【问题描述】:

我正在努力弄清楚为什么这不起作用:

function hasOnlyWhitelistedCharacters(string)
{
    var whitelist = RegExp("\\w");
    console.log(whitelist.test(string));
    return whitelist.test(string);
}

当我运行这个字符串时:“wwww?????**

进入这个函数,它返回true。它不应该返回false吗?事实上,似乎无论我做什么它都会返回 true。

这些也不起作用:

var whitelist = RegExp(\w);
var whitelist = /\w/;

【问题讨论】:

    标签: javascript regex security


    【解决方案1】:

    /\w/ 匹配字符串中任意位置的单个标识符字符 ([0-9a-zA-Z_])。要针对整个字符串进行测试,请使用anchors(“^”和“$”)和repetition(“+”或“*”,具体取决于您是否要允许空字符串)。试试/^\w*$//^\w+$/,或者用/\W/ 测试你不想要的字符串。

    function hasOnlyWhitelistedCharacters(string)
    {
        var whitelist = /^\w*$/;
        console.log(whitelist.test(string));
        return whitelist.test(string);
    }
    function hasNoBlacklistedCharacters(string)
    {
        var blacklist = /\W/;
        console.log(blacklist.test(string));
        return ! blacklist.test(string);
    }
    

    对于更复杂的黑名单字符类,可以使用complemented class

    function hasOnlyWhitelistedCharacters(string)
    {
        // match all characters, which must be in the set
        var whitelist = /^[\w\s\u00C0-\uDFFF\uF900-\uFFFF]*$/;
        console.log(whitelist.test(string));
        return whitelist.test(string);
    }
    
    function hasNoBlacklistedCharacters(string)
    {
        // match one character not in the set
        var blacklist = /[^\w\s\u00C0-\uDFFF\uF900-\uFFFF]/;
        console.log(blacklist.test(string));
        return ! blacklist.test(string);
    }
    

    使用正则表达式时要注意字符编码。实际上,在任何情况下都要小心字符编码。关于编码的假设可能会导致安全漏洞。

    【讨论】:

    • 最终,我试图将所有 unicode 字符列入白名单,但禁止任何可用于脚本注入攻击的字符。
    • 你说的是 XSS 吗?您需要在服务器上执行此操作。除非您使用服务器端 JS,否则上述方法永远不会是安全的解决方案。
    • +1 获取代码!我今天早些时候刚刚发现 Javascript 不支持基于 POSIX 的识别 Unicode 字符的方法,而在这里你有我意识到我需要的 Unicode 范围解决方案。惊人的。谢谢你。
    【解决方案2】:

    试试这个:

    var whitelist=/^\w*$/;
    

    ^ 强制它尝试匹配字符串的开头。 $ 强制它匹配结尾。在\w 之后的* 使其匹配多个\w 实例。

    【讨论】:

    • 我不确定是否应该为此打开一个新的问题,但是 Javascript 正则表达式是否支持“标点符号”?如:RegExp("^\p{Punctuation}]+$");
    【解决方案3】:

    如果您尝试检查目标字符串是否仅包含列入白名单的字符,则需要指定您只需要它们。添加开始和结束标记并重复以使其工作。

    ^\w+$

    【讨论】:

    • 好的,这已经到了某个地方。除了一个问题,它是禁止 unicode 字符之外,这是可行的。我认为 \w 将允许 unicode 字符,例如日文和中文,因为我在 stackoverflow 上看到了一个相关问题的另一个答案。然而,现在我发现这是错误的。有没有办法将 unicode 字符列入白名单?
    • @ebisudave:哪些 unicode 字符? Unicode 包括所有这些。
    【解决方案4】:

    要匹配一组白名单字符中的至少一个白名单字符,请尝试以下操作:^\w+$

    要匹配一组白名单字符中的至少零个白名单字符,请尝试以下操作:^\w*$

    - 克拉 (^) 表示模式必须位于字符串的开头,美元符号 ($) 表示模式必须位于字符串的末尾。通过将您要搜索的内容包装在 ^$ 中,任何未指定的“垃圾”都会强制正则表达式返回 false。

    回答你的问题:

    \\w 应该返回 false,因为您正在取消转义反斜杠并将其转换为普通字符。您实际上是在搜索字面上的“反斜杠双 u”

    \w 将返回 true,因为您正在搜索任何列入白名单的字符

    快速的谷歌搜索给了我一些网站,您可以在其中测试您的正则表达式(如果您愿意的话),他们将帮助提供一些反馈:

    http://www.myregextester.com/index.php

    如果您没有记住所有内容,我还建议您在制作正则表达式时使用备忘单

    http://www.regular-expressions.info/reference.html

    【讨论】:

      【解决方案5】:

      它返回 true 因为wwww?????**<><>< 字符串有白名单字符。您必须在此正则表达式中添加字符串的开头和结尾

      【讨论】:

        【解决方案6】:

        它返回 true,因为第一个字符是字符,而您的正则表达式只测试第一个字符是字符。 如果我明白你想要什么,试试\w+$

        【讨论】:

        • 感谢您的回复,尽管 RegExp("\\w+") 似乎也不起作用。我想你明白我要做什么,但为了清楚起见,如果字符串中的任何字符不在白名单中,我希望测试失败。
        • 正则表达式匹配字符串中的任何位置。 "+" 将导致 "\w" 匹配一次或多次,仍然匹配示例字符串。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-22
        • 2016-12-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多