2011-11-17 6 views
11

ビューパラメータを定義するJSF2 XHTMLページがあります。ブックマーク可能なURLを持つことができます。 XHTMLページはパラメータが含まれます。JSF2リダイレクトwith includeViewParamsを使用すると、テキストフィールドに解決されるEL式を入力できます。

<h:form id="some-id"> 
    <h:inputText value="#{nbsearchpage.searchName}" /> 
    <h:commandButton value="search" action="#{nbsearchpage.search}" /> 
</h:form> 

そして最後に、アクションメソッドの検索:同じページで

<f:metadata> 
    <f:viewParam name="searchName" value="#{nbsearchpage.searchName}" /> 
    <!-- More view parameters omitted here for brevity --> 
    <f:event listener="#{nbsearchpage.searchPreRender}" type="javax.faces.event.PreRenderViewEvent" /> 
</f:metadata> 

を、私は、テキストフィールドとユーザーがsearchNameを変更することを可能にするボタンがありますnbsearchpage Beanの()は同じページに戻りますが、パラメータを含めて:

?faces-redirect=true&amp;includeViewParams=true 

これは、ユーザーに素晴らしいURLを提供します。ユーザーが検索フィールドに「IBM」と入力すると、URLは

?searchName=IBM 

にリダイレクトされます。完全に機能します。しかし、ユーザはsearchNameテキストフィールドにEL式を入力することができ、EL式が評価されます。例えば。ユーザーがテキストフィールドで「#{2 + 2}」に入ったとき、URLは

?searchName=4 

にリダイレクトされ、これは、私たちは、やってユーザーが伴うセキュリティへのEL式を入力できるようにすべきではないと考えるものです理由。私はGlassfish 3.1.1を使用しています。

この自動EL解決を防ぐにはどうすればよいですか?私は、JSF2のビューパラメータの概念とリダイレクトの根本的な欠陥があると思いますか?私は、リダイレクトで生き残れないビュースコープと同じ問題を抱えていました。このために、私は独自のスコープを作成しなければなりませんでした。 (私はフラッシュスコープを使用することができた)。

+1

これはMojarra 2.1.2で再現できますが、これはセッション属性にアクセスして任意のメソッドを呼び出すことができるため、重大なセキュリティ上の欠陥です。 –

答えて

5

これはMojarra 2.1.4で再現できます。これは間違いなく望ましくないことです。私はissue 2247としてMojarraの人にそれを報告しました(できるなら投票してください)。 MyFaces 2.1.3では同じ問題が発生します。

根本原因がJSF実装固有のユーティリティー・クラスにある限り、この特定の問題に対する簡単な回避策はありません。 /WEB-INF/classesに変更されたコピーを簡単に作成できますが、実装に依存しないためにはViewHandlerImplまたはExternalContextImplを完全に再実装してカスタムとして供給する必要がありますが、それは多くの作業です。

<form> 
    <h:inputText id="searchName" value="#{nbsearchpage.searchName}" /> 
    <input type="submit" value="search" /> 
</form> 

と事前代わりにビューのイベントリスナーをレンダリングでアクションメソッドを実行します。

しかし、あなたはすでに<f:viewParam>を使用しているとして、あなたはまただけではなく、<h:commandButton>の代わりに<h:form><input type="submit"><form>を使用することができます。 <h:form>はPOST専用ですので、これはJSFでGETフォームを使用するより適切な方法です。具体的な問題への無関係


私はリダイレクトを生き残るないビューのスコープと同じ問題を抱えていたし、このために私は自分のスコープを作成する必要がありました。リダイレクトを存続

ビューの範囲の意図ではありませんでしを持っています。ビューのスコープは、同じビュー(特にAjaxや条件付きでコンテンツの再レンダリングを行う場合)とやりとりしている限り存続するよう意図されています。基本的に会話の範囲を探しています。あなたはCDIの@ConversationScopedまたはMyFaces CODIを見ていたでしょう。

1

この問題は、Mojarraバージョン2.0.7,2.1.5,2.1.6のMyFaces Coreバージョン2.0.11,2.1.5およびJAVASERVERFACES-2247ではMYFACES-3405で解決されました。

更新されたバージョンを使用してください。

関連する問題