虽然有人会探索this question,但显而易见的问题是,是否存在匹配的正则表达式
${foo}
但不是
<c:if test="${foo}" />
或
<c:when test="${foo}" />
将${foo}
与<c:out value="${foo}" />
替换为foo
,${foo}
只要jsp
在{{1}中有效el expression,就可以是任意字符串}}
编辑:
只要在替换后没有违反${foo}
语法, jsp
就可以在任何地方!这只是防范jsp
中XXS attack的预防措施。
答案 0 :(得分: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
答案 1 :(得分:1)
以下正则表达式应该适用于您的示例:
\${[^}]*}(?![^<>]*>)
虽然我认为这可能仍会对一些罕见的情况产生误报。
答案 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沙箱的一系列攻击)。