正则表达式匹配并替换“$ {foo}”而不是“<c:if test =”$ {foo}“>”在Java中</c:if>

时间:2013-06-12 17:06:24

标签: java regex jsp java-ee replace

虽然有人会探索this question,但显而易见的问题是,是否存在匹配的正则表达式

${foo}

但不是

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

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

${foo}<c:out value="${foo}" />替换为foo${foo}只要jsp在{{1}中有效el expression,就可以是任意字符串}}

编辑:

只要在替换后没有违反${foo}语法,

jsp就可以在任何地方!这只是防范jspXXS attack的预防措施。

5 个答案:

答案 0 :(得分:2)

描述

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

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

替换为<c:out value="$0" />

enter image description here

输入文字:<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

enter image description here

输入文字:<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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

我相信您可能正在尝试在支持regex功能查找的文本编辑器中编辑JSP。尝试解析你的JSP(如@fge指出)虽然不明智。

这是一个匹配${foo}但不匹配="${foo}"

的正则表达式
(?<!=")\${foo}(?!")

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

上的匹配

答案 3 :(得分:0)

试试这个

str = str.replaceAll("(?<!<c:(if|when) test=[\"'])\\$\\{foo}", "<c:out value=\"\\${foo}\" />");

答案 4 :(得分:0)

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

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

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