2

虽然任何人都会探讨这个问题,但显而易见的问题是,是否有任何可能匹配的正则表达式

${foo}

但不是

<c:if test="${foo}" />

或者

<c:when test="${foo}" />

用 替换那些独立${foo}<c:out value="${foo}" />,这里foo可以是任何字符串,只要是中${foo}的有效el 表达式jsp

编辑:

${foo}只要jsp替换后不违反语法,就可以在任何地方!这只是防止XXS 攻击的预防措施jsp

4

5 回答 5

2

描述

${foo}此正则表达式将找到不在<c:.... test="${foo}" />块内的裸露

正则表达式:(?!("))\$\{[^}]*\}(?!")

用。。。来代替<c:out value="$0" />

在此处输入图像描述

输入文本:<c:if test="${foo man chu}" />${foo bar}more text here

输出文本:<c:if test="${foo man chu}" /><c:out value="${foo bar}" />more text here


要处理可能在 ` 标签内的其他边缘情况,${foo.bar}您可能需要使用此正则表达式

正则表达式:(?!("))(\$\{[^}]*\})(?!")|(<a\b[^>]*\bhref=")(\$\{[^}]*\})(")

用。。。来代替:$3<c:out value="$1$2$4" />$5

在此处输入图像描述

输入文本:<c:if test="${foo man chu}" />${foo bar}more <a href="${foo.name}" />text here

输出文本:<c:if test="${foo man chu}" /><c:out value="${foo bar}" />more <a href="<c:out value="${foo.name}" />" />text here

于 2013-06-13T01:08:08.943 回答
1

以下正则表达式应该适用于您的示例:

\${[^}]*}(?![^<>]*>)

现场演示:http ://www.rubular.com/r/ICdR4TGQXu

虽然我认为这对于一些罕见的情况可能仍然会产生误报。

于 2013-06-12T17:25:48.153 回答
0

我相信您可能正在尝试在支持按正则表达式查找功能的文本编辑器中编辑您的 JSP。否则尝试解析您的 JSP(如@fge 指出的)是不明智的。

这是一个匹配${foo}但不匹配的正则表达式="${foo}"

(?<!=")\${foo}(?!")

有效地消除<c:if test="${foo}" /><c:when test="${foo}" />

于 2013-06-12T17:23:21.163 回答
0

尝试这个

str = str.replaceAll("(?<!<c:(if|when) test=[\"'])\\$\\{foo}", "<c:out value=\"\\${foo}\" />");
于 2013-06-12T17:27:59.977 回答
0

通常,正则表达式不足以正确处理任何重要的语言,尤其是允许匹配括号、转义引号和嵌套引用的语言。

您可能会在这里找到一个似乎适用于大多数情况的正则表达式,但这可能只是意味着您还没有遇到足够聪明的攻击者。

您需要对允许用户输入的内容更加严格。您不应该接受 JSP 代码,尝试“清理它”,然后执行它。你被剥削。甚至 Sun 也无法做到这一点(参见:最近针对 Java Applet 沙箱的一系列攻击)。

于 2013-06-13T01:33:03.827 回答