2

誰もがこの質問を調査しますが、一致する可能性のある正規表現があるかどうかという明らかな質問が生じます

${foo}

だがしかし

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

また

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

これらのスタンドアローン${foo}をに置き換えるには、 が有効なel 式である限り、任意の文字列を使用でき<c:out value="${foo}" />ます。foo${foo}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 に答える
0

一般に、正規表現は、重要な言語、特にかっこの一致、エスケープされた引用符、およびネストされた引用符を許可する言語を正しく処理できるほど強力ではありません。

ほとんどの場合に有効と思われる正規表現をここで見つけることができますが、それはおそらく、十分に巧妙な攻撃者にまだ出会っていないことを意味します.

ユーザーに入力を許可する内容をより厳しく制限する必要があります。JSP コードを受け入れるのではなく、「クリーンアップ」を試みてから実行してください。搾取されます。Sun でさえこれを達成できませんでした (Java アプレット サンドボックスに対する最近の一連の攻撃を参照してください)。

于 2013-06-13T01:33:03.827 に答える
0

これを試して

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

おそらく、正規表現による検索機能をサポートするテキスト エディターで JSP を編集しようとしていると思います。それ以外の方法で (@fge が指摘したように) JSP を解析しようとするのは賢明ではありません。

これは一致するが一致${foo}しない正規表現です="${foo}"

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

<c:if test="${foo}" />またはでの一致を効果的に排除する<c:when test="${foo}" />

于 2013-06-12T17:23:21.163 に答える