我有一个针对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。为什么匹配这个正则表达式会显示安全性?
答案 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匹配和替换。所有<
都替换为<
,所有>
都替换为>
,所有"
都替换为"
,依此类推。这确实并且不应该涉及正则表达式。
答案 3 :(得分:2)
你匹配了许多“单词”字符,锚定在字符串的开头和结尾。所以我们知道在那个集合中除了_之外没有标点符号。
任何匹配此套装的东西都被认为是安全的,我猜作者认为在这样的字符串中没有任何恶意。
我无法理解为什么少于5个字符被认为是不安全的。
我不明白为什么如果一串25个这样的字符是安全的,26则不是。
答案 4 :(得分:1)
你的正则表达式验证字符串只包含“word”字符类[a-Z0-9]。因此,只是验证字符串中没有标点符号或特殊字符。它还验证长度,从5到25。
XSS攻击通常依赖于<script>...</script>
例程插入数据库 - 显然有几个特殊字符[&lt;&gt; /]。
答案 5 :(得分:0)
我能想到为什么少于五个字符“不安全”的唯一原因是,如果它被用于搜索查询,1到4个字符可能会返回过多的结果。许多数据库驱动的搜索功能至少需要3-5个字符才能避免大量的点击。这个字符串会用于任何类型的字符串匹配吗?