如何通过<c:out value =“$ {...}”> </c:out>正则表达式替换所有出现的$ {...}

时间:2012-04-25 17:06:18

标签: java html regex

我有没有保护的JSP,它们有XSS漏洞。我需要用${...}替换<c:out value="${...}" />标记内的所有<c:out value="${...}" />字符串。

例如,

<select>
   <option value="${foo}">label</option>
</select>    
${bar}
<c:out value="${message}" />

需要正则表达式替换为以下内容:

<select>
   <option value="<c:out value="${foo}" />">label</option>
</select>    
<c:out value="${bar}" />
<c:out value="${message}" />

2 个答案:

答案 0 :(得分:0)

听起来您的起始文字中混合了<c:out value="${...}" />${...}。如果是这种情况,你可以尝试这样的事情:

str = str.replaceAll(
             "(?:<c:out\\s+value=\")?\\$\\{([^}]*)\\}(?:\"\\s*/>)?", 
             "<c:out value=\"\\${$1}\" />"
      );

我的Java正则表达式语法有点生疏,所以请检查我是否有正确的反斜杠。否则,我认为这将有效。

答案 1 :(得分:0)

正则表达式不是在需要上下文时使用的工具。但是,通过先将<c:out value="${...}" />的所有实例替换为${...},然后将所有${...}替换为<c:out value="${...}" />,可以分两步完成。

正则表达式

\${[^}]+}
<c:out value="\${[^}]+}" />