4

を使用してアプリケーションに取り組んでいますgrails version 2.3.9。そこで、チェックボックス付きのリストをレンダリングしています。ユーザーは任意の行を選択してページを送信できます。サーバー側では、コマンドオブジェクトを使用してデータをバインドしています。

私のコマンドオブジェクト--

@Validateable
class MyCO {

    List<MyDoamin> myDomains = ListUtils.lazyList([], FactoryUtils.instantiateFactory(MyDoamin))
    ...

    static constraints = {
        myDomains nullable: false, validator: { val, obj ->
            if (val.size() < 1) {
                return "error.code"
            }
        }
        ...
    }
}

意見 -

<g:each in="${myDomains}" var="myDomain" status="idx">
  <tr>
    <td>
      <input type="checkbox" name="myDomains[${idx}].id" value="${myDomain.id}" checked>
    </td>
    ...
  </tr>
</g:each>

アクション -

def myAction(MyCO myCO) {
    if (myCO.validate()) {
        ...
    } else {
        log.error "-----INVALID-----"
        ...
    }
}

このコードは正常に動作しています。しかし、ユーザーがインデックス (idx) 値が 255 より大きい行を選択すると、データ バインディングは機能しません。

リクエスト パラメータ --

[myDomains[256].id:66、myDomains[256]:[id:66]、アクション:myAction、コントローラー:myController]

私も試してみました

List<MyDoamin> myDomains

List<MyDoamin> myDomains = [].withDefault { new Client() }

コマンドオブジェクトで、しかし同じ結果、データバインディングなし。

ここで何か間違ったことをしていますか?どうすればこれを修正できますか?

4

1 に答える 1

5

デフォルトでは、コレクションの自動拡張制限は 255 に設定されています。

https://github.com/grails/grails-core/blob/2.3.x/grails-plugin-databinding/src/main/groovy/org/codehaus/groovy/grails/plugins/databinding/DataBindingGrailsPlugin.groovy#L58

grails.databinding.autoGrowCollectionLimitこれは、 inを別のものに設定することで変更できConfig.groovyます。

この制限の理由は、攻撃者が、データ バインディング中に何千ものオブジェクトを作成することによってすべてのメモリを使い果たすサービス拒否攻撃を作成できるためです。これは望ましくありません。

于 2015-07-16T07:04:32.467 に答える