为什么这个Javascript RegExp测试不起作用?

时间:2011-02-22 06:11:38

标签: javascript regex security

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

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

当我运行此字符串时:“wwww ????? * *<><><”

进入此函数,返回true。它不应该归还假吗?事实上,无论我做什么,它似乎都回归真实。

这些也行不通:

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

6 个答案:

答案 0 :(得分:3)

/\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);
}

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

答案 1 :(得分:3)

试试这个:

var whitelist=/^\w*$/;

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

答案 2 :(得分:3)

如果您正在尝试检查目标字符串是否仅包含列入白名单的字符,则需要指定除了它们之外什么都不需要。添加开始和结束标记以及重复以使其正常工作。

  

^ \ W + $

答案 3 :(得分:2)

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

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

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

回答你的问题:

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

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

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

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

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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