2017-12-22 11 views
2

私は医師を見つけるための以下の2つのメソッド(コンテキストが変更された)を持つコントローラクラスを持っています。 一括割り当て:両方のメソッドでエラーが不正なバインダー構成(APIの不正使用、構造)。マス課題を解決する方法:

@Controller 
@RequestMapping(value = "/findDocSearch") 
public class Controller { 

    @Autowired 
    private IFindDocService findDocService; 

    @RequestMapping(value = "/byName", method = RequestMethod.GET) 
    @ResponseBody 
    public List<FindDocDTO> findDocByName(FindDocBean bean) { 
     return findDocService.retrieveDocByName(bean.getName()); 
    } 

    @RequestMapping(value = "/byLoc", method = RequestMethod.GET) 
    @ResponseBody 
    public List<FindDocDTO> findDocByLocation(FindDocBean bean) { 
     return findDocService.retrieveDocByZipCode(bean.getZipcode(), 
     bean.getDistance()); 
    } 
} 

と私の豆は次のとおりです。これまでに見つかったすべての提案を1として

public class FindDocBean implements Serializable { 
    private static final long serialVersionUID = -1212xxxL; 

    private String name; 
    private String zipcode; 
    private int distance; 

    @Override 
    public String toString() { 
     return String.format("FindDocBean[name: %s, zipcode:%s, distance:%s]", 
       name, zipcode, distance); 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getZipcode() { 
     return zipcode; 
    } 

    public void setZipcode(String zipcode) { 
     this.zipcode = zipcode; 
    } 

    public int getDistance() { 
     return distance; 
    } 

    public void setDistance(int distance) { 
     this.distance = distance; 
    } 

、彼らは唯一の以下のようなもので、必要なパラメータで豆を制限することが示唆されています

final String[] DISALLOWED_FIELDS = new String[]{"bean.name", "bean.zipcode", }; 

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    binder.setDisallowedFields(DISALLOWED_FIELDS); 

しかし、私の問題は、Beanの3つのパラメータすべてがControllerで提供されるメソッドのいずれかで使用されることです。

誰かがこれについていくつかの解決策を提案できますか?前もって感謝します。

+0

なぜBeanを使用しますか?あなたはすべてのメソッドのStringにバインドできます(とにかく文字列を使用するだけなので)。 findByDocName(文字列名) – koe

答えて

1

メソッドにはInitBinderを使用できます。これを試すことができます。私は同じ問題に直面していた

@InitBinder("findDocByName") 
public void initBinderByName(WebDataBinder binder) { 
    binder.setDisallowedFields(new String[]{"distance","zipcode"}); 
} 


@InitBinder("findDocByLocation") 
public void initBinderByZipCode(WebDataBinder binder) { 
    binder.setDisallowedFields(new String[]{"distance","name"}); 
} 
0

簡単な質問 - マッパーがどのようにBeanをインスタンシエーションできるか? Hereは答え/例です。そのデータをquery parameterまたはheaderで渡すことができます。しかし、それは不思議です。場所や名前を提供する@QueryParamでそのメソッドを持つ方が良いでしょう。そうすれば、アプリケーションを保護しやすくなります。

副題として、クエリの長​​さが限られているので、検索フォームが大きくて奇妙な場合は、@POSTが良いアイデアであり、その方法ですべてのデータを渡すことができます。このために、それは過度のものになる単純な例です。

0

これは不幸な偽陽性のようです。このエラーの背後にあるルールは、オブジェクト内に存在するが未検証のユーザー入力ではないプロパティが、偶発的にというWeb要求から入力されることを避けるために行われています。たとえば、リソースを作成するPOST要求があります。要求ハンドラが完全なリソースオブジェクトを取得し、不足しているプロパティだけを満たす場合、悪意のあるユーザーは編集できないはずのフィールドにデータを設定できます。

ただし、このケースはスキームと一致しません。同じメカニズムを使用して、異なる引数をキャプチャします。さらに読み込まれたプロパティは読み込まれません。

GET http://yourhost/findDocSearch/byName?name=Abuse&zipCode=11111

では、追加の郵便番号は、単に無視されるだろう。したがって、想定されるリスクはここには存在しません。

To fixこの警告には、誤ったポジティブとしてマークすることができます(セットアップ内で可能な場合)。それが不可能な場合は、クエリ引数をメソッド引数に直接マッピングすることもできます。あまりにも害を及ぼすべきではないパラメータが限られているだけです。これもオプションでない場合は、おそらく、コード分析がどのチェックを認識するかを理解するために使用するアルゴリズムを正確に把握する必要があります。残念ながら、ほとんどのスキャナは、入力の検証を行うための限られた一連の方法しか発見できません。

0

、それから私は、同じ残りのコントローラクラス内のコードの下に追加:

@InitBinder 
public void populateCustomerRequest(WebDataBinder binder) { 
    binder.setDisallowedFields(new String[]{}); 
} 

は現在、働いて私のために罰金と質量割り当ての問題が修正されました。

関連する問題