私は、医師を見つけるための以下の2つのメソッドを備えたControllerクラスを持っています(コンテキストが変更されています)。 質量割り当て:安全でないバインダー構成(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());
}
}
そして私の豆は:
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;
}
これまでに見つかったすべての提案に従って、以下のような方法でのみ、必要なパラメーターでBeanを制限することを提案しています:
final String[] DISALLOWED_FIELDS = new String[]{"bean.name", "bean.zipcode", };
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setDisallowedFields(DISALLOWED_FIELDS);
しかし、私の問題は、Beanの3つのパラメーターすべてが、コントローラーで提供されるメソッドのいずれかで使用されることです。
誰かがこれに対するいくつかの解決策を提案してくれますか?前もって感謝します。
メソッドには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"});
}
私は同じ問題に直面していたので、同じレストコントローラークラスのコードの下に追加しました:
@InitBinder
public void populateCustomerRequest(WebDataBinder binder) {
binder.setDisallowedFields(new String[]{});
}
今は私にとってはうまく機能し、大量割り当ての問題が修正されました。
これは残念な誤検知のようです。このエラーの背後にあるルールは、オブジェクトに存在するが(検証されていない)ユーザー入力を意図していないプロパティが誤って Webリクエストから入力されることを回避するために作成されています。例は、POSTリソースを作成するリクエストです。リクエストハンドラーが完全なリソースオブジェクトを取得し、不足しているプロパティのみを入力すると、悪意のあるユーザーは編集できないフィールドにデータを入力できます。
ただし、このケースはスキームと一致しません。同じメカニズムを使用して、さまざまな引数をキャプチャします。さらに、入力されたプロパティは読み取られません。に
GET http://yourhost/findDocSearch/byName?name=Abuse&zipCode=11111
追加のzipCodeは無視されます。したがって、想定されるリスクはここにはありません。
fix警告を表示するには、それを誤検知としてマークすることができます(設定内で可能であれば)。それが不可能な場合は、クエリパラメータをメソッドの引数に直接マップすることもできます。あなたはあまり害を及ぼすべきではない限られたパラメータしか持っていないので。これもオプションでない場合は、コード分析でどのチェックが認識されるかを理解するために使用する正確なアルゴリズムを理解する必要があるでしょう。残念ながら、ほとんどのスキャナーは、入力検証を行うための限られた方法しか発見できません。
簡単な質問-マッパーはどのようにBeanをインスタンス化できますか? ここ は答え/例です。そのデータはquery parameter
またはheader
で渡すことができます。しかし、それは奇妙なことです。より良いのは、@QueryParam
がその場所または名前を提供するメソッドを持つことです。そうすれば、アプリケーションを保護しやすくなります。
補足として、クエリは長さが限られているため、検索フォームが大きくて奇妙な場合は、@POST
を使用すると、すべてのデータを渡すことができます。これについては、やり過ぎになる単純な例です。