为什么这个正则表达式表示安全

时间:2011-08-02 12:40:43

标签: regex jsp

我有一个针对XSS攻击的JSP兑换,其中它检查内容是否与正则表达式匹配以确定它是否安全,这是代码:

String contents = bodyContent.getString();
String regExp = new String("^\\w{5,25}$");
// Do a regex to find the good stuff
if (contents.matches(regExp)) {
     //write the original content
}else{
     //change content to make it safe and write it
}

我的问题是关于正则表达式“^ \ w {5,25} $”,您可以直观地看到它here。为什么匹配这个正则表达式会显示安全性?

6 个答案:

答案 0 :(得分:3)

如果正则表达式是:

 ^\w{5,25}$

然后这会将字符串限制为字母,数字和下划线 - 即没有空格或其他标点符号。这意味着它不能是一个邪恶的剧本,因为它肯定会包含空格或分号。

答案 1 :(得分:3)

铁路图不正确,“\ w”是一个匹配所谓的字符的正则表达式。这些是A-Z,a-z,0-9和下划线。

输入匹配通常被认为是安全的,因为它不能包含任何常用的特殊或转义字符,但绝不是保证。

答案 2 :(得分:3)

除了已经被其他人回答的具体问题之外,这是防止JSP受到XSS攻击的明显错误方法。您应该只使用JSTL <c:out>标记或fn:escapeXml()函数重新显示用户控制的数据。

E.g。

<c:out value="${header['user-agent']}" />

<input type="text" name="foo" value="${fn:escapeXml(param.foo)}" />

这样,像<>等HTML / XML特殊字符将不会按字面解释(这会导致潜在的XSS漏洞),但会被转义以便它们得到正确的按原样显示。

这是幕后的文字char-by-char匹配和替换。所有<都替换为&lt;,所有>都替换为&gt;,所有"都替换为&quot;,依此类推。这确实并且不应该涉及正则表达式。

答案 3 :(得分:2)

你匹配了许多“单词”字符,锚定在字符串的开头和结尾。所以我们知道在那个集合中除了_之外没有标点符号。

任何匹配此套装的东西都被认为是安全的,我猜作者认为在这样的字符串中没有任何恶意。

我无法理解为什么少于5个字符被认为是不安全的。

我不明白为什么如果一串25个这样的字符是安全的,26则不是。

答案 4 :(得分:1)

你的正则表达式验证字符串只包含“word”字符类[a-Z0-9]。因此,只是验证字符串中没有标点符号或特殊字符。它还验证长度,从5到25。

XSS攻击通常依赖于<script>...</script>例程插入数据库 - 显然有几个特殊字符[&lt;&gt; /]。

答案 5 :(得分:0)

我能想到为什么少于五个字符“不安全”的唯一原因是,如果它被用于搜索查询,1到4个字符可能会返回过多的结果。许多数据库驱动的搜索功能至少需要3-5个字符才能避免大量的点击。这个字符串会用于任何类型的字符串匹配吗?

相关问题